2018-07-19 21:54:48 +00:00
#! /usr/bin/env python
import argparse
import time
from threading import Event
from launch_time import LaunchTimeBenchmark , DefaultLaunchTimeHandler
class NewTabBenchmark ( LaunchTimeBenchmark ) :
def _parse_wait_time ( self , string ) :
values = string . split ( ' : ' )
start = None
end = None
try :
if len ( values ) == 2 :
start = float ( values [ 0 ] )
end = float ( values [ 1 ] )
if start > end :
raise
elif len ( values ) == 1 :
start = float ( values [ 0 ] )
end = start
else :
raise
except :
raise argparse . ArgumentTypeError (
" ' " + string + " ' is not a range of numbers. Expected form is N:M where N < M " )
return start , end
def initialize ( self ) :
self . benchmark_description = " Measure time to open a new tab for a given browser. "
self . response_handler = NewTabBenchmark . ResponseHandler ( self )
self . start_time = None
self . stop_time = None
self . stop_signal_was_received = Event ( )
2018-08-10 18:23:50 +00:00
self . allow_prewarm = True
2018-07-19 21:54:48 +00:00
def run_iteration ( self ) :
2018-08-10 18:23:50 +00:00
tabs_to_open = 1 if self . allow_prewarm else 2
self . stop_time = None
for _ in range ( tabs_to_open - 1 ) :
self . open_tab ( blank = True )
2018-07-19 21:54:48 +00:00
self . start_time = time . time ( ) * 1000
self . open_tab ( )
while self . stop_time is None :
self . stop_signal_was_received . wait ( )
result = self . stop_time - self . start_time
self . stop_signal_was_received . clear ( )
2018-08-10 18:23:50 +00:00
for _ in range ( tabs_to_open ) :
self . close_tab ( )
2018-07-19 21:54:48 +00:00
return result
def group_init ( self ) :
self . launch_browser ( )
2018-12-17 23:06:47 +00:00
def get_test_name ( self ) :
return " NewTabBenchmark "
2018-07-19 21:54:48 +00:00
def will_parse_arguments ( self ) :
self . argument_parser . add_argument ( ' -g ' , ' --groups ' , type = int ,
help = ' number of groups of iterations to run (default: {} ) ' . format ( self . iteration_groups ) )
self . argument_parser . add_argument ( ' -w ' , ' --wait-time ' , type = self . _parse_wait_time ,
help = ' wait time to use between iterations or range to scan (format is " N " or " N:M " where N < M, default: {} : {} ) ' . format ( self . wait_time_low , self . wait_time_high ) )
2018-08-10 18:23:50 +00:00
self . argument_parser . add_argument ( ' --no-prewarm ' , action = ' store_true ' ,
help = ' attempt to ignore process prewarming (will most likely raise standard deviation) ' )
2018-07-19 21:54:48 +00:00
def did_parse_arguments ( self , args ) :
if args . groups :
self . iteration_groups = args . groups
if args . wait_time :
self . wait_time_low , self . wait_time_high = args . wait_time
2018-08-10 18:23:50 +00:00
if args . no_prewarm :
self . allow_prewarm = False
2018-07-19 21:54:48 +00:00
@staticmethod
def ResponseHandler ( new_tab_benchmark ) :
class Handler ( DefaultLaunchTimeHandler ) :
def get_test_page ( self ) :
return ''' <!DOCTYPE html>
< html >
< head >
< title > New Tab Benchmark < / title >
< meta http - equiv = " Content-Type " content = " text/html " / >
< script >
function sendDone ( ) {
2018-08-10 18:23:50 +00:00
const time = performance . timing . navigationStart
const request = new XMLHttpRequest ( ) ;
2018-07-19 21:54:48 +00:00
request . open ( " POST " , " done " , false ) ;
request . setRequestHeader ( ' Content-Type ' , ' application/json ' ) ;
request . send ( JSON . stringify ( time ) ) ;
}
window . onload = sendDone ;
< / script >
< / head >
< body >
< h1 > New Tab Benchmark < / h1 >
< / body >
< / html >
'''
2018-08-10 18:23:50 +00:00
def on_receive_stop_signal ( self , data ) :
new_tab_benchmark . stop_time = float ( data )
2018-07-19 21:54:48 +00:00
new_tab_benchmark . stop_signal_was_received . set ( )
return Handler
if __name__ == ' __main__ ' :
NewTabBenchmark ( ) . run ( )