blob: ca2f29ef4b07ff1a8d26b19306bb8cf8e2abd5d5 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Run the query using MySQL client and report the runtime.
Report both the runtime as reported by MySQL, which won't include overhead
like time spent waiting for password entry, query parsing, etc but has only
second precision, and the total running time of the subprocess, which has
higher resolution but includes the aforementioned variables.
"""
import subprocess
import sys
import tempfile
import time
FILE_CONTENTS = '''SET @start=UNIX_TIMESTAMP();
select benchmark(%d, (select count(*) from (%s) as r));
SELECT UNIX_TIMESTAMP()-@start AS seconds;
'''
def mysql_bench(repeat, query, *args):
"""Run the query using MySQL client and report the runtime."""
with tempfile.NamedTemporaryFile() as f:
f.write(FILE_CONTENTS % (repeat, query))
f.flush()
cmd = ['mysql', '-e', 'source %s' % f.name, '-s']
cmd.extend(*args)
start = time.time()
t = int(subprocess.check_output(cmd).splitlines()[-1])
print 'Elapsed: %d secs (%f sec subprocess runtime) ' % (t, time.time()-start)
def usage():
"""Print the usage string and exit."""
print >> sys.stderr, 'USAGE: %s <repeat-count> "SELECT * FROM ..." [args to mysql client]'
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) < 3:
usage()
try:
repeats = int(sys.argv[1])
except:
usage()
mysql_bench(repeats, sys.argv[2], sys.argv[3:])