Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: tools/callstats.py

Issue 1966193002: Add script injection when replaying with callstats.py (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/runtime/runtime-internal.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/callstats.py
diff --git a/tools/callstats.py b/tools/callstats.py
old mode 100644
new mode 100755
index 88b07088e3beb0f309c09cecfa0629c46080fd92..13ab33b5da178597989be8493d7c6566ed3d7731
--- a/tools/callstats.py
+++ b/tools/callstats.py
@@ -34,46 +34,6 @@ from math import sqrt
# Run benchmarks.
-DEFAULT_SITES = [
- # top websites (http://alexa.com/topsites): --------------------
- "https://www.google.de/search?q=v8",
- "https://www.youtube.com",
- "https://www.facebook.com/shakira",
- "http://www.baidu.com/s?wd=v8",
- "http://www.yahoo.co.jp",
- "http://www.amazon.com/s/?field-keywords=v8",
- "http://hi.wikipedia.org/wiki/" \
- "%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0",
- "http://www.qq.com",
- "http://www.twitter.com/taylorswift13",
- "http://www.reddit.com",
- "http://www.ebay.fr/sch/i.html?_nkw=v8",
- "http://edition.cnn.com",
- "http://world.taobao.com",
- "http://www.instagram.com/archdigest",
- "https://www.linkedin.com/pub/dir/?first=john&last=doe&search=search",
- "http://www.msn.com/ar-ae",
- "http://www.bing.com/search?q=v8+engine",
- "http://www.pinterest.com/categories/popular",
- "http://www.sina.com.cn",
- "http://weibo.com",
- "http://yandex.ru/search/?text=v8",
- # framework driven decisions: -----------------------------------
- # wikipedia content + angularjs
- "http://www.wikiwand.com/en/hill",
- # ember website
- "http://meta.discourse.org",
- # backbone js
- "http://reddit.musicplayer.io",
- # gwt application
- "http://inbox.google.com",
- # webgl / algorithmic case
- "http://maps.google.co.jp/maps/search/restaurant+tokyo",
- # whatever framework adwords uses
- "https://adwords.google.com",
-]
-
-
def print_command(cmd_args):
def fix_for_printing(arg):
m = re.match(r'^--([^=]+)=(.*)$', arg)
@@ -85,7 +45,11 @@ def print_command(cmd_args):
print " ".join(map(fix_for_printing, cmd_args))
-def start_replay_server(args):
+def start_replay_server(args, sites):
+ with tempfile.NamedTemporaryFile(prefix='callstats-inject-', suffix='.js',
+ mode='wt', delete=False) as f:
+ injection = f.name
+ generate_injection(f, sites)
cmd_args = [
args.replay_bin,
"--port=4080",
@@ -93,6 +57,7 @@ def start_replay_server(args):
"--no-dns_forwarding",
"--use_closest_match",
"--no-diff_unknown_requests",
+ "--inject_scripts=deterministic.js,{}".format(injection),
args.replay_wpr,
]
print "=" * 80
@@ -101,12 +66,51 @@ def start_replay_server(args):
server = subprocess.Popen(cmd_args, stdout=null, stderr=null)
print "RUNNING REPLAY SERVER: %s with PID=%s" % (args.replay_bin, server.pid)
print "=" * 80
- return server
+ return {'process': server, 'injection': injection}
def stop_replay_server(server):
- print("SHUTTING DOWN REPLAY SERVER %s" % server.pid)
- server.terminate()
+ print("SHUTTING DOWN REPLAY SERVER %s" % server['process'].pid)
+ server['process'].terminate()
+ os.remove(server['injection'])
+
+
+def generate_injection(f, sites):
+ print >> f, """\
+(function() {
+ function match(url, item) {
+ if ('regexp' in item) return url.match(item.regexp) !== null;
+ let url_wanted = item.url;
+ // Allow automatic redirections from http to https.
+ if (url_wanted.startsWith("http://") && url.startsWith("https://")) {
+ url_wanted = "https://" + url_wanted.substr(7);
+ }
+ return url.startsWith(url_wanted);
+ };
+
+ function onLoad(e) {
+ let url = e.target.URL;
+ for (let item of sites) {
+ if (!match(url, item)) continue;
+ let timeout = 'timeline' in item ? 2500 * item.timeline + 3000
+ : 'timeout' in item ? 1000 * (item.timeout - 3)
+ : 10000;
+ console.log("Setting time out of " + timeout + " for: " + url);
+ window.setTimeout(function () {
+ console.log("Time is out for: " + url);
+ %GetAndResetRuntimeCallStats(1);
+ }, timeout);
+ return;
+ }
+ console.log("Ignoring: " + url);
+ };
+
+ let sites =
+ """, json.dumps(sites), """;
+
+ console.log("Event listenner added for: " + window.location.href);
+ window.addEventListener("load", onLoad);
+})();"""
def run_site(site, domain, args, timeout=None):
@@ -115,6 +119,8 @@ def run_site(site, domain, args, timeout=None):
print "="*80
result_template = "{domain}#{count}.txt" if args.repeat else "{domain}.txt"
count = 0
+ if timeout is None: timeout = args.timeout
+ if args.replay_wpr: timeout += 1
while count == 0 or args.repeat is not None and count < args.repeat:
count += 1
result = result_template.format(domain=domain, count=count)
@@ -122,15 +128,17 @@ def run_site(site, domain, args, timeout=None):
while args.retries is None or retries < args.retries:
retries += 1
try:
- temp_user_data_dir = args.user_data_dir is None
- if temp_user_data_dir:
+ if args.user_data_dir:
+ user_data_dir = args.user_data_dir
+ else:
user_data_dir = tempfile.mkdtemp(prefix="chr_")
js_flags = "--runtime-call-stats"
+ if args.replay_wpr: js_flags += " --allow-natives-syntax"
if args.js_flags: js_flags += " " + args.js_flags
chrome_flags = [
"--no-default-browser-check",
"--disable-translate",
- "--single-process",
+ "--disable-seccomp-sandbox",
"--no-sandbox",
"--js-flags={}".format(js_flags),
"--no-first-run",
@@ -146,9 +154,12 @@ def run_site(site, domain, args, timeout=None):
"--reduce-security-for-testing",
"--allow-insecure-localhost",
]
+ else:
+ chrome_flags += [
+ "--single-process",
+ ]
if args.chrome_flags:
chrome_flags += args.chrome_flags.split()
- if timeout is None: timeout = args.timeout
cmd_args = [
"timeout", str(timeout),
args.with_chrome
@@ -171,9 +182,10 @@ def run_site(site, domain, args, timeout=None):
print >> f
print >> f, "URL: {}".format(site)
break
+ if retries <= 5: timeout += 1
print("EMPTY RESULT, REPEATING RUN");
finally:
- if temp_user_data_dir:
+ if not args.user_data_dir:
shutil.rmtree(user_data_dir)
@@ -204,10 +216,8 @@ def do_run(args):
# Determine the websites to benchmark.
if args.sites_file:
sites = read_sites_file(args)
- elif args.sites:
- sites = [{'url': site, 'timeout': args.timeout} for site in args.sites]
else:
- sites = [{'url': site, 'timeout': args.timeout} for site in DEFAULT_SITES]
+ sites = [{'url': site, 'timeout': args.timeout} for site in args.sites]
# Disambiguate domains, if needed.
L = []
domains = {}
@@ -228,8 +238,7 @@ def do_run(args):
domains[domain] += 1
entry[2] = domains[domain]
L.append(entry)
- if args.replay_wpr:
- replay_server = start_replay_server(args);
+ replay_server = start_replay_server(args, sites) if args.replay_wpr else None
try:
# Run them.
for site, domain, count, timeout in L:
@@ -427,6 +436,10 @@ def do_help(parser, subparsers, args):
# Main program, parse command line and execute.
+def coexist(*l):
+ given = sum(1 for x in l if x)
+ return given == 0 or given == len(l)
+
def main():
parser = argparse.ArgumentParser()
subparser_adder = parser.add_subparsers(title="commands", dest="command",
@@ -511,11 +524,12 @@ def main():
help="command for which to display help")
# Execute the command.
args = parser.parse_args()
- if args.command == "run" and args.sites_file and args.sites:
- args.error("if --sites-file is used, no site URLS must be given")
+ setattr(args, 'script_path', os.path.dirname(sys.argv[0]))
+ if args.command == "run" and coexist(args.sites_file, args.sites):
+ args.error("use either option --sites-file or site URLs")
sys.exit(1)
- elif args.command == "run" and args.replay_wpr and not args.replay_bin:
- args.error("if --replay-wpr is used, --replay-bin must be given")
+ elif args.command == "run" and not coexist(args.replay_wpr, args.replay_bin):
+ args.error("options --replay-wpr and --replay-bin must be used together")
sys.exit(1)
else:
args.func(args)
« no previous file with comments | « src/runtime/runtime-internal.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698