15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/env ruby
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2011 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)require 'rubygems'
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)require 'getoptlong'
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)require 'pathname'
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)require 'tempfile'
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)require 'socket'
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)begin
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  require 'json'
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)rescue LoadError => e
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "It does not appear that you have the 'json' package installed.  Try running 'sudo gem install json'."
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  exit 1
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Configuration
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CONFIGURATION_FLNM = ENV["HOME"]+"/.bencher"
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unless FileTest.exist? CONFIGURATION_FLNM
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "Error: no configuration file at ~/.bencher."
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "This file should contain paths to SunSpider, V8, and Kraken, as well as a"
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "temporary directory that bencher can use for its remote mode. It should be"
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "formatted in JSON.  For example:"
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "{"
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "    \"sunSpiderPath\": \"/Volumes/Data/pizlo/OpenSource/PerformanceTests/SunSpider/tests/sunspider-1.0\","
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "    \"v8Path\": \"/Volumes/Data/pizlo/OpenSource/PerformanceTests/SunSpider/tests/v8-v6\","
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "    \"krakenPath\": \"/Volumes/Data/pizlo/kraken/kraken-e119421cb325/tests/kraken-1.1\","
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "    \"tempPath\": \"/Volumes/Data/pizlo/bencher/temp\""
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "}"
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  exit 1
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CONFIGURATION = JSON.parse(File::read(CONFIGURATION_FLNM))
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SUNSPIDER_PATH = CONFIGURATION["sunSpiderPath"]
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)V8_PATH = CONFIGURATION["v8Path"]
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KRAKEN_PATH = CONFIGURATION["krakenPath"]
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEMP_PATH = CONFIGURATION["tempPath"]
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BENCH_DATA_PATH = TEMP_PATH + "/benchdata"
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochIBR_LOOKUP=[0.00615583, 0.0975, 0.22852, 0.341628, 0.430741, 0.500526, 0.555933,
67fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.600706, 0.637513, 0.668244, 0.694254, 0.716537, 0.735827, 0.752684,
68fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.767535, 0.780716, 0.792492, 0.803074, 0.812634, 0.821313, 0.829227,
69fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.836472, 0.843129, 0.849267, 0.854943, 0.860209, 0.865107, 0.869674,
70fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.873942, 0.877941, 0.881693, 0.885223, 0.888548, 0.891686, 0.894652,
71fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.897461, 0.900124, 0.902652, 0.905056, 0.907343, 0.909524, 0.911604,
72fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.91359, 0.91549, 0.917308, 0.919049, 0.920718, 0.92232, 0.923859, 0.925338,
73fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.926761, 0.92813, 0.929449, 0.930721, 0.931948, 0.933132, 0.934275, 0.93538,
74fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.936449, 0.937483, 0.938483, 0.939452, 0.940392, 0.941302, 0.942185,
75fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.943042, 0.943874, 0.944682, 0.945467, 0.94623, 0.946972, 0.947694,
76fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.948396, 0.94908, 0.949746, 0.950395, 0.951027, 0.951643, 0.952244,
77fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.952831, 0.953403, 0.953961, 0.954506, 0.955039, 0.955559, 0.956067,
78fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.956563, 0.957049, 0.957524, 0.957988, 0.958443, 0.958887, 0.959323,
79fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.959749, 0.960166, 0.960575, 0.960975, 0.961368, 0.961752, 0.962129,
80fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.962499, 0.962861, 0.963217, 0.963566, 0.963908, 0.964244, 0.964574,
81fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.964897, 0.965215, 0.965527, 0.965834, 0.966135, 0.966431, 0.966722,
82fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.967007, 0.967288, 0.967564, 0.967836, 0.968103, 0.968366, 0.968624,
83fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.968878, 0.969128, 0.969374, 0.969617, 0.969855, 0.97009, 0.970321,
84fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.970548, 0.970772, 0.970993, 0.97121, 0.971425, 0.971636, 0.971843,
85fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.972048, 0.97225, 0.972449, 0.972645, 0.972839, 0.973029, 0.973217,
86fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.973403, 0.973586, 0.973766, 0.973944, 0.97412, 0.974293, 0.974464,
87fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.974632, 0.974799, 0.974963, 0.975125, 0.975285, 0.975443, 0.975599,
88fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.975753, 0.975905, 0.976055, 0.976204, 0.97635, 0.976495, 0.976638,
89fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.976779, 0.976918, 0.977056, 0.977193, 0.977327, 0.97746, 0.977592,
90fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.977722, 0.97785, 0.977977, 0.978103, 0.978227, 0.978349, 0.978471,
91fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.978591, 0.978709, 0.978827, 0.978943, 0.979058, 0.979171, 0.979283,
92fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.979395, 0.979504, 0.979613, 0.979721, 0.979827, 0.979933, 0.980037,
93fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.98014, 0.980242, 0.980343, 0.980443, 0.980543, 0.980641, 0.980738,
94fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.980834, 0.980929, 0.981023, 0.981116, 0.981209, 0.9813, 0.981391, 0.981481,
95fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.981569, 0.981657, 0.981745, 0.981831, 0.981916, 0.982001, 0.982085,
96fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.982168, 0.982251, 0.982332, 0.982413, 0.982493, 0.982573, 0.982651,
97fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.982729, 0.982807, 0.982883, 0.982959, 0.983034, 0.983109, 0.983183,
98fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.983256, 0.983329, 0.983401, 0.983472, 0.983543, 0.983613, 0.983683,
99fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.983752, 0.98382, 0.983888, 0.983956, 0.984022, 0.984089, 0.984154,
100fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.984219, 0.984284, 0.984348, 0.984411, 0.984474, 0.984537, 0.984599,
101fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.98466, 0.984721, 0.984782, 0.984842, 0.984902, 0.984961, 0.985019,
102fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.985077, 0.985135, 0.985193, 0.985249, 0.985306, 0.985362, 0.985417,
103fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.985472, 0.985527, 0.985582, 0.985635, 0.985689, 0.985742, 0.985795,
104fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.985847, 0.985899, 0.985951, 0.986002, 0.986053, 0.986103, 0.986153,
105fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.986203, 0.986252, 0.986301, 0.98635, 0.986398, 0.986446, 0.986494,
106fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.986541, 0.986588, 0.986635, 0.986681, 0.986727, 0.986773, 0.986818,
107fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.986863, 0.986908, 0.986953, 0.986997, 0.987041, 0.987084, 0.987128,
108fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.987171, 0.987213, 0.987256, 0.987298, 0.98734, 0.987381, 0.987423,
109fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.987464, 0.987504, 0.987545, 0.987585, 0.987625, 0.987665, 0.987704,
110fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.987744, 0.987783, 0.987821, 0.98786, 0.987898, 0.987936, 0.987974,
111fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.988011, 0.988049, 0.988086, 0.988123, 0.988159, 0.988196, 0.988232,
112fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.988268, 0.988303, 0.988339, 0.988374, 0.988409, 0.988444, 0.988479,
113fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.988513, 0.988547, 0.988582, 0.988615, 0.988649, 0.988682, 0.988716,
114fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.988749, 0.988782, 0.988814, 0.988847, 0.988879, 0.988911, 0.988943,
115fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.988975, 0.989006, 0.989038, 0.989069, 0.9891, 0.989131, 0.989161, 0.989192,
116fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.989222, 0.989252, 0.989282, 0.989312, 0.989342, 0.989371, 0.989401,
117fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.98943, 0.989459, 0.989488, 0.989516, 0.989545, 0.989573, 0.989602, 0.98963,
118fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.989658, 0.989685, 0.989713, 0.98974, 0.989768, 0.989795, 0.989822,
119fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.989849, 0.989876, 0.989902, 0.989929, 0.989955, 0.989981, 0.990007,
120fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990033, 0.990059, 0.990085, 0.99011, 0.990136, 0.990161, 0.990186,
121fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990211, 0.990236, 0.990261, 0.990285, 0.99031, 0.990334, 0.990358,
122fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990383, 0.990407, 0.99043, 0.990454, 0.990478, 0.990501, 0.990525,
123fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990548, 0.990571, 0.990594, 0.990617, 0.99064, 0.990663, 0.990686,
124fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990708, 0.990731, 0.990753, 0.990775, 0.990797, 0.990819, 0.990841,
125fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.990863, 0.990885, 0.990906, 0.990928, 0.990949, 0.99097, 0.990991,
126fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991013, 0.991034, 0.991054, 0.991075, 0.991096, 0.991116, 0.991137,
127fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991157, 0.991178, 0.991198, 0.991218, 0.991238, 0.991258, 0.991278,
128fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991298, 0.991317, 0.991337, 0.991356, 0.991376, 0.991395, 0.991414,
129fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991433, 0.991452, 0.991471, 0.99149, 0.991509, 0.991528, 0.991547,
130fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991565, 0.991584, 0.991602, 0.99162, 0.991639, 0.991657, 0.991675,
131fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991693, 0.991711, 0.991729, 0.991746, 0.991764, 0.991782, 0.991799,
132fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991817, 0.991834, 0.991851, 0.991869, 0.991886, 0.991903, 0.99192,
133fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.991937, 0.991954, 0.991971, 0.991987, 0.992004, 0.992021, 0.992037,
134fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992054, 0.99207, 0.992086, 0.992103, 0.992119, 0.992135, 0.992151,
135fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992167, 0.992183, 0.992199, 0.992215, 0.99223, 0.992246, 0.992262,
136fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992277, 0.992293, 0.992308, 0.992324, 0.992339, 0.992354, 0.992369,
137fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992384, 0.9924, 0.992415, 0.992429, 0.992444, 0.992459, 0.992474, 0.992489,
138fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992503, 0.992518, 0.992533, 0.992547, 0.992561, 0.992576, 0.99259,
139fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992604, 0.992619, 0.992633, 0.992647, 0.992661, 0.992675, 0.992689,
140fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992703, 0.992717, 0.99273, 0.992744, 0.992758, 0.992771, 0.992785,
141fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992798, 0.992812, 0.992825, 0.992839, 0.992852, 0.992865, 0.992879,
142fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992892, 0.992905, 0.992918, 0.992931, 0.992944, 0.992957, 0.99297,
143fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.992983, 0.992995, 0.993008, 0.993021, 0.993034, 0.993046, 0.993059,
144fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993071, 0.993084, 0.993096, 0.993109, 0.993121, 0.993133, 0.993145,
145fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993158, 0.99317, 0.993182, 0.993194, 0.993206, 0.993218, 0.99323, 0.993242,
146fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993254, 0.993266, 0.993277, 0.993289, 0.993301, 0.993312, 0.993324,
147fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993336, 0.993347, 0.993359, 0.99337, 0.993382, 0.993393, 0.993404,
148fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993416, 0.993427, 0.993438, 0.993449, 0.99346, 0.993472, 0.993483,
149fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993494, 0.993505, 0.993516, 0.993527, 0.993538, 0.993548, 0.993559,
150fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.99357, 0.993581, 0.993591, 0.993602, 0.993613, 0.993623, 0.993634,
151fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993644, 0.993655, 0.993665, 0.993676, 0.993686, 0.993697, 0.993707,
152fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993717, 0.993727, 0.993738, 0.993748, 0.993758, 0.993768, 0.993778,
153fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993788, 0.993798, 0.993808, 0.993818, 0.993828, 0.993838, 0.993848,
154fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993858, 0.993868, 0.993877, 0.993887, 0.993897, 0.993907, 0.993916,
155fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993926, 0.993935, 0.993945, 0.993954, 0.993964, 0.993973, 0.993983,
156fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.993992, 0.994002, 0.994011, 0.99402, 0.99403, 0.994039, 0.994048, 0.994057,
157fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994067, 0.994076, 0.994085, 0.994094, 0.994103, 0.994112, 0.994121,
158fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.99413, 0.994139, 0.994148, 0.994157, 0.994166, 0.994175, 0.994183,
159fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994192, 0.994201, 0.99421, 0.994218, 0.994227, 0.994236, 0.994244,
160fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994253, 0.994262, 0.99427, 0.994279, 0.994287, 0.994296, 0.994304,
161fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994313, 0.994321, 0.994329, 0.994338, 0.994346, 0.994354, 0.994363,
162fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994371, 0.994379, 0.994387, 0.994395, 0.994404, 0.994412, 0.99442,
163fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994428, 0.994436, 0.994444, 0.994452, 0.99446, 0.994468, 0.994476,
164fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994484, 0.994492, 0.9945, 0.994508, 0.994516, 0.994523, 0.994531, 0.994539,
165fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994547, 0.994554, 0.994562, 0.99457, 0.994577, 0.994585, 0.994593, 0.9946,
166fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994608, 0.994615, 0.994623, 0.994631, 0.994638, 0.994645, 0.994653,
167fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.99466, 0.994668, 0.994675, 0.994683, 0.99469, 0.994697, 0.994705, 0.994712,
168fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994719, 0.994726, 0.994734, 0.994741, 0.994748, 0.994755, 0.994762,
169fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994769, 0.994777, 0.994784, 0.994791, 0.994798, 0.994805, 0.994812,
170fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994819, 0.994826, 0.994833, 0.99484, 0.994847, 0.994854, 0.99486, 0.994867,
171fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994874, 0.994881, 0.994888, 0.994895, 0.994901, 0.994908, 0.994915,
172fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994922, 0.994928, 0.994935, 0.994942, 0.994948, 0.994955, 0.994962,
173fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.994968, 0.994975, 0.994981, 0.994988, 0.994994, 0.995001, 0.995007,
174fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995014, 0.99502, 0.995027, 0.995033, 0.99504, 0.995046, 0.995052, 0.995059,
175fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995065, 0.995071, 0.995078, 0.995084, 0.99509, 0.995097, 0.995103,
176fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995109, 0.995115, 0.995121, 0.995128, 0.995134, 0.99514, 0.995146,
177fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995152, 0.995158, 0.995164, 0.995171, 0.995177, 0.995183, 0.995189,
178fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995195, 0.995201, 0.995207, 0.995213, 0.995219, 0.995225, 0.995231,
179fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995236, 0.995242, 0.995248, 0.995254, 0.99526, 0.995266, 0.995272,
180fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995277, 0.995283, 0.995289, 0.995295, 0.995301, 0.995306, 0.995312,
181fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995318, 0.995323, 0.995329, 0.995335, 0.99534, 0.995346, 0.995352,
182fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995357, 0.995363, 0.995369, 0.995374, 0.99538, 0.995385, 0.995391,
183fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995396, 0.995402, 0.995407, 0.995413, 0.995418, 0.995424, 0.995429,
184fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995435, 0.99544, 0.995445, 0.995451, 0.995456, 0.995462, 0.995467,
185fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995472, 0.995478, 0.995483, 0.995488, 0.995493, 0.995499, 0.995504,
186fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995509, 0.995515, 0.99552, 0.995525, 0.99553, 0.995535, 0.995541, 0.995546,
187fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995551, 0.995556, 0.995561, 0.995566, 0.995571, 0.995577, 0.995582,
188fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995587, 0.995592, 0.995597, 0.995602, 0.995607, 0.995612, 0.995617,
189fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995622, 0.995627, 0.995632, 0.995637, 0.995642, 0.995647, 0.995652,
190fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995657, 0.995661, 0.995666, 0.995671, 0.995676, 0.995681, 0.995686,
191fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995691, 0.995695, 0.9957, 0.995705, 0.99571, 0.995715, 0.995719, 0.995724,
192fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995729, 0.995734, 0.995738, 0.995743, 0.995748, 0.995753, 0.995757,
193fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995762, 0.995767, 0.995771, 0.995776, 0.995781, 0.995785, 0.99579,
194fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995794, 0.995799, 0.995804, 0.995808, 0.995813, 0.995817, 0.995822,
195fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995826, 0.995831, 0.995835, 0.99584, 0.995844, 0.995849, 0.995853,
196fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995858, 0.995862, 0.995867, 0.995871, 0.995876, 0.99588, 0.995885,
197fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995889, 0.995893, 0.995898, 0.995902, 0.995906, 0.995911, 0.995915,
198fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.99592, 0.995924, 0.995928, 0.995932, 0.995937, 0.995941, 0.995945, 0.99595,
199fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995954, 0.995958, 0.995962, 0.995967, 0.995971, 0.995975, 0.995979,
200fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.995984, 0.995988, 0.995992, 0.995996, 0.996, 0.996004, 0.996009, 0.996013,
201fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.996017, 0.996021, 0.996025, 0.996029, 0.996033, 0.996037, 0.996041,
202fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.996046, 0.99605, 0.996054, 0.996058, 0.996062, 0.996066, 0.99607, 0.996074,
203fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.996078, 0.996082, 0.996086, 0.99609, 0.996094, 0.996098, 0.996102,
204fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.996106, 0.99611, 0.996114, 0.996117, 0.996121, 0.996125, 0.996129,
205fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            0.996133, 0.996137, 0.996141, 0.996145, 0.996149, 0.996152, 0.996156,
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            0.99616, 0.996164]
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Run-time configuration parameters (can be set with command-line options)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$rerun=1
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$inner=3
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$warmup=1
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$outer=4
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$includeSunSpider=true
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$includeV8=true
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$includeKraken=true
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$measureGC=false
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$benchmarkPattern=nil
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$verbosity=0
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$timeMode=:preciseTime
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$forceVMKind=nil
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$brief=false
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$silent=false
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$remoteHosts=[]
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$alsoLocal=false
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$sshOptions=[]
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$vms = []
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$needToCopyVMs = false
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$dontCopyVMs = false
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$prepare = true
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$run = true
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$analyze = []
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Helpful functions and classes
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def smallUsage
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "Use the --help option to get basic usage information."
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  exit 1
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def usage
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "bencher [options] <vm1> [<vm2> ...]"
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "Runs one or more JavaScript runtimes against SunSpider, V8, and/or Kraken"
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "benchmarks, and reports detailed statistics.  What makes bencher special is"
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "that each benchmark/VM configuration is run in a single VM invocation, and"
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "the invocations are run in random order.  This minimizes systematics due to"
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "one benchmark polluting the running time of another.  The fine-grained"
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "interleaving of VM invocations further minimizes systematics due to changes in"
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "the performance or behavior of your machine."
252fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch  puts
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "Bencher is highly configurable.  You can compare as many VMs as you like.  You"
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "can change the amount of warm-up iterations, number of iterations executed per"
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "VM invocation, and the number of VM invocations per benchmark.  By default,"
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "SunSpider, VM, and Kraken are all run; but you can run any combination of these"
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "suites."
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "The <vm> should be either a path to a JavaScript runtime executable (such as"
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "jsc), or a string of the form <name>:<path>, where the <path> is the path to"
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "the executable and <name> is the name that you would like to give the"
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "configuration for the purposeof reporting.  If no name is given, a generic name"
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "of the form Conf#<n> will be ascribed to the configuration automatically."
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "Options:"
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--rerun <n>          Set the number of iterations of the benchmark that"
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     contribute to the measured run time.  Default is #{$rerun}."
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--inner <n>          Set the number of inner (per-runtime-invocation)"
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     iterations.  Default is #{$inner}."
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--outer <n>          Set the number of runtime invocations for each benchmark."
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     Default is #{$outer}."
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--warmup <n>         Set the number of warm-up runs per invocation.  Default"
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     is #{$warmup}."
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--timing-mode        Set the way that bencher measures time.  Possible values"
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     are 'preciseTime' and 'date'.  Default is 'preciseTime'."
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--force-vm-kind      Turn off auto-detection of VM kind, and assume that it is"
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     the one specified.  Valid arguments are 'jsc' or"
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     'DumpRenderTree'."
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--force-vm-copy      Force VM builds to be copied to bencher's working directory."
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     This may reduce pathologies resulting from path names."
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--dont-copy-vms      Don't copy VMs even when doing a remote benchmarking run;"
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     instead assume that they are already there."
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--v8-only            Only run V8."
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--sunspider-only     Only run SunSpider."
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--kraken-only        Only run Kraken."
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--exclude-v8         Exclude V8 (only run SunSpider and Kraken)."
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--exclude-sunspider  Exclude SunSpider (only run V8 and Kraken)."
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--exclude-kraken     Exclude Kraken (only run SunSpider and V8)."
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--benchmarks         Only run benchmarks matching the given regular expression."
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--measure-gc         Turn off manual calls to gc(), so that GC time is measured."
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     Works best with large values of --inner.  You can also say"
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     --measure-gc <conf>, which turns this on for one"
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     configuration only."
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--verbose or -v      Print more stuff."
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--brief              Print only the final result for each VM."
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--silent             Don't print progress. This might slightly reduce some"
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     performance perturbation."
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--remote <sshhosts>  Performance performance measurements remotely, on the given"
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     SSH host(s). Easiest way to use this is to specify the SSH"
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     user@host string. However, you can also supply a comma-"
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     separated list of SSH hosts. Alternatively, you can use this"
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     option multiple times to specify multiple hosts. This"
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     automatically copies the WebKit release builds of the VMs"
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     you specified to all of the hosts."
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--ssh-options        Pass additional options to SSH."
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--local              Also do a local benchmark run even when doing --remote."
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--prepare-only       Only prepare the bencher runscript (a shell script that"
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     invokes the VMs to run benchmarks) but don't run it."
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--analyze            Only read the output of the runscript but don't do anything"
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     else. This requires passing the same arguments to bencher"
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "                     that you passed when running --prepare-only."
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "--help or -h         Display this message."
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "Example:"
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts "bencher TipOfTree:/Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc MyChanges:/Volumes/Data/pizlo/secondary/OpenSource/WebKitBuild/Release/jsc"
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  exit 1
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def fail(reason)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if reason.respond_to? :backtrace
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "FAILED: #{reason}"
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "Stack trace:"
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts reason.backtrace.join("\n")
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "FAILED: #{reason}"
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  smallUsage
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def quickFail(r1,r2)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "#{$0}: #{r1}"
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  puts
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  fail(r2)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def intArg(argName,arg,min,max)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result=arg.to_i
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unless result.to_s == arg
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    quickFail("Expected an integer value for #{argName}, but got #{arg}.",
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "Invalid argument for command-line option")
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if min and result<min
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    quickFail("Argument for #{argName} cannot be smaller than #{min}.",
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "Invalid argument for command-line option")
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if max and result>max
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    quickFail("Argument for #{argName} cannot be greater than #{max}.",
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "Invalid argument for command-line option")
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def computeMean(array)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  sum=0.0
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  array.each {
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | value |
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sum += value
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  sum/array.length
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def computeGeometricMean(array)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  mult=1.0
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  array.each {
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | value |
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mult*=value
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  mult**(1.0/array.length)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def computeHarmonicMean(array)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  1.0 / computeMean(array.collect{ | value | 1.0 / value })
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def computeStdDev(array)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  case array.length
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  when 0
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0.0/0.0
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  when 1
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0.0
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    begin
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      mean=computeMean(array)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      sum=0.0
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      array.each {
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | value |
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sum += (value-mean)**2
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Math.sqrt(sum/(array.length-1))
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rescue
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      0.0/0.0
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Array
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shuffle!
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size.downto(1) { |n| push delete_at(rand(n)) }
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def inverseBetaRegularized(n)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  IBR_LOOKUP[n-1]
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def numToStr(num)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "%.4f"%(num.to_f)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
410fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NoChange
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :amountFaster
413fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(amountFaster)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @amountFaster = amountFaster
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
417fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shortForm
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    " "
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
421fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def longForm
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "  might be #{numToStr(@amountFaster)}x faster"
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
425fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if @amountFaster < 1.01
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ""
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      longForm
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Faster
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :amountFaster
437fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(amountFaster)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @amountFaster = amountFaster
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
441fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shortForm
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "^"
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
445fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def longForm
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "^ definitely #{numToStr(@amountFaster)}x faster"
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
449fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    longForm
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Slower
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :amountSlower
457fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(amountSlower)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @amountSlower = amountSlower
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
461fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shortForm
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "!"
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
465fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def longForm
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "! definitely #{numToStr(@amountSlower)}x slower"
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
469fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    longForm
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MayBeSlower
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :amountSlower
477fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(amountSlower)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @amountSlower = amountSlower
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
481fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shortForm
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "?"
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
485fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def longForm
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "? might be #{numToStr(@amountSlower)}x slower"
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
489fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if @amountSlower < 1.01
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "?"
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      longForm
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Stats
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array = []
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
503fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def add(value)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if value.is_a? Stats
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      add(value.array)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif value.respond_to? :each
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value.each {
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | v |
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        add(v)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @array << value.to_f
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
516fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def array
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
520fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def sum
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result=0
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array.each {
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | value |
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += value
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
529fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def min
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array.min
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
533fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def max
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array.max
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
537fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def size
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @array.length
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
541fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def mean
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computeMean(array)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
545fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def arithmeticMean
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mean
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
549fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def stdDev
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computeStdDev(array)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def stdErr
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stdDev/Math.sqrt(size)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
557fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # Computes a 95% Student's t distribution confidence interval
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def confInt
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if size < 2
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      0.0/0.0
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise if size > 1000
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Math.sqrt(size-1.0)*stdErr*Math.sqrt(-1.0+1.0/inverseBetaRegularized(size-1))
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
567fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def lower
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mean-confInt
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
571fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def upper
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mean+confInt
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
575fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def geometricMean
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computeGeometricMean(array)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
579fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def harmonicMean
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computeHarmonicMean(array)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
583fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def compareTo(other)
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if upper < other.lower
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Faster.new(other.mean/mean)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif lower > other.upper
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Slower.new(mean/other.mean)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif mean > other.mean
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      MayBeSlower.new(mean/other.mean)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NoChange.new(other.mean/mean)
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
595fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "size = #{size}, mean = #{mean}, stdDev = #{stdDev}, stdErr = #{stdErr}, confInt = #{confInt}"
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def doublePuts(out1,out2,msg)
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  out1.puts "#{out2.path}: #{msg}" if $verbosity>=3
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  out2.puts msg
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Benchfile < File
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  @@counter = 0
608fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :filename, :basename
610fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(name)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @basename, @filename = Benchfile.uniqueFilename(name)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    super(@filename, "w")
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
615fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def self.uniqueFilename(name)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if name.is_a? Array
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      basename = name[0] + @@counter.to_s + name[1]
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      basename = name + @@counter.to_s
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filename = BENCH_DATA_PATH + "/" + basename
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @@counter += 1
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise "Benchfile #{filename} already exists" if FileTest.exist?(filename)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    [basename, filename]
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
627fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def self.create(name)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    file = Benchfile.new(name)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    yield file
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    file.close
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    file.basename
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$dataFiles={}
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ensureFile(key, filename)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unless $dataFiles[key]
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $dataFiles[key] = Benchfile.create(key) {
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | outp |
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,outp,IO::read(filename))
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $dataFiles[key]
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
646fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def emitBenchRunCodeFile(name, plan, benchDataPath, benchPath)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  case plan.vm.vmType
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  when :jsc
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Benchfile.create("bencher") {
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case $timeMode
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      when :preciseTime
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"function __bencher_curTimeMS() {")
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   return preciseTime()*1000")
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"}")
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      when :date
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"function __bencher_curTimeMS() {")
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   return Date.now()")
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"}")
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
664fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if benchDataPath
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"load(#{benchDataPath.inspect});")
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"gc();")
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"for (var __bencher_index = 0; __bencher_index < #{$warmup+$inner}; ++__bencher_index) {")
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   before = __bencher_curTimeMS();")
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $rerun.times {
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"   load(#{benchPath.inspect});")
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   after = __bencher_curTimeMS();")
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   if (__bencher_index >= #{$warmup}) print(\"#{name}: #{plan.vm}: #{plan.iteration}: \" + (__bencher_index - #{$warmup}) + \": Time: \"+(after-before));");
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   gc();") unless plan.vm.shouldMeasureGC
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"}")
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"function __bencher_run(__bencher_what) {")
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   var __bencher_before = __bencher_curTimeMS();")
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $rerun.times {
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"   run(__bencher_what);")
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   var __bencher_after = __bencher_curTimeMS();")
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"   return __bencher_after - __bencher_before;")
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"}")
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $warmup.times {
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"__bencher_run(#{benchPath.inspect})")
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"gc();") unless plan.vm.shouldMeasureGC
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $inner.times {
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          | innerIndex |
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"print(\"#{name}: #{plan.vm}: #{plan.iteration}: #{innerIndex}: Time: \"+__bencher_run(#{benchPath.inspect}));")
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          doublePuts($stderr,file,"gc();") unless plan.vm.shouldMeasureGC
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  when :dumpRenderTree
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mainCode = Benchfile.create("bencher") {
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"__bencher_count = 0;")
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"function __bencher_doNext(result) {")
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    if (__bencher_count >= #{$warmup})")
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        debug(\"#{name}: #{plan.vm}: #{plan.iteration}: \" + (__bencher_count - #{$warmup}) + \": Time: \" + result);")
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    __bencher_count++;")
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    if (__bencher_count < #{$inner+$warmup})")
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        __bencher_runImpl(__bencher_doNext);")
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    else")
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        quit();")
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"__bencher_runImpl(__bencher_doNext);")
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
712fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cssCode = Benchfile.create("bencher-css") {
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,".pass {\n    font-weight: bold;\n    color: green;\n}\n.fail {\n    font-weight: bold;\n    color: red;\n}\n\#console {\n    white-space: pre-wrap;\n    font-family: monospace;\n}")
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
717fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    preCode = Benchfile.create("bencher-pre") {
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"if (window.testRunner) {")
7211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)      doublePuts($stderr,file,"    if (window.enablePixelTesting) {")
7221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)      doublePuts($stderr,file,"        testRunner.dumpAsTextWithPixelResults();")
7231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)      doublePuts($stderr,file,"    } else {")
7241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)      doublePuts($stderr,file,"        testRunner.dumpAsText();")
7251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)      doublePuts($stderr,file,"    }")
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"")
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"function debug(msg)")
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"{")
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    var span = document.createElement(\"span\");")
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    document.getElementById(\"console\").appendChild(span); // insert it first so XHTML knows the namespace")
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    span.innerHTML = msg + '<br />';")
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"")
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"function quit() {")
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    testRunner.notifyDone();")
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"")
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"__bencher_continuation=null;")
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"")
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"function reportResult(result) {")
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    __bencher_continuation(result);")
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"")
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"function __bencher_runImpl(continuation) {")
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    function doit() {")
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        document.getElementById(\"frameparent\").innerHTML = \"\";")
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        document.getElementById(\"frameparent\").innerHTML = \"<iframe id='testframe'>\";")
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        var testFrame = document.getElementById(\"testframe\");")
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        testFrame.contentDocument.open();")
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        testFrame.contentDocument.write(\"<!DOCTYPE html>\\n<head></head><body><div id=\\\"console\\\"></div>\");")
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if benchDataPath
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        doublePuts($stderr,file,"        testFrame.contentDocument.write(\"<script src=\\\"#{benchDataPath}\\\"></script>\");")
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        testFrame.contentDocument.write(\"<script type=\\\"text/javascript\\\">__bencher_before = Date.now();</script><script src=\\\"#{benchPath}\\\"></script><script type=\\\"text/javascript\\\">window.parent.reportResult(Date.now() - __bencher_before);</script></body></html>\");")
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"        testFrame.contentDocument.close();")
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    }")
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    __bencher_continuation = continuation;")
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"    window.setTimeout(doit, 10);")
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"}")
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Benchfile.create(["bencher-htmldoc",".html"]) {
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      doublePuts($stderr,file,"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html><head><link rel=\"stylesheet\" href=\"#{cssCode}\"><script src=\"#{preCode}\"></script></head><body><div id=\"console\"></div><div id=\"frameparent\"></div><script src=\"#{mainCode}\"></script></body></html>")
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def emitBenchRunCode(name, plan, benchDataPath, benchPath)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  plan.vm.emitRunCode(emitBenchRunCodeFile(name, plan, benchDataPath, benchPath))
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def planForDescription(plans, benchFullname, vmName, iteration)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  raise unless benchFullname =~ /\//
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  suiteName = $~.pre_match
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  benchName = $~.post_match
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result = plans.select{|v| v.suite.name == suiteName and v.benchmark.name == benchName and v.vm.name == vmName and v.iteration == iteration}
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  raise unless result.size == 1
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result[0]
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ParsedResult
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :plan, :innerIndex, :time
787fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(plan, innerIndex, time)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @plan = plan
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @innerIndex = innerIndex
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @time = time
792fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @plan.is_a? BenchPlan
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @innerIndex.is_a? Integer
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @time.is_a? Numeric
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
797fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmark
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plan.benchmark
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
801fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suite
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plan.suite
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
805fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vm
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plan.vm
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
809fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def outerIndex
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plan.iteration
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
813fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def self.parse(plans, string)
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if string =~ /([a-zA-Z0-9\/-]+): ([a-zA-Z0-9_# ]+): ([0-9]+): ([0-9]+): Time: /
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      benchFullname = $1
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      vmName = $2
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outerIndex = $3.to_i
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      innerIndex = $4.to_i
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      time = $~.post_match.to_f
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ParsedResult.new(planForDescription(plans, benchFullname, vmName, outerIndex), innerIndex, time)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      nil
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VM
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(origPath, name, nameKind, svnRevision)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @origPath = origPath.to_s
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @path = origPath.to_s
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name = name
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @nameKind = nameKind
834fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if $forceVMKind
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @vmType = $forceVMKind
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if @origPath =~ /DumpRenderTree$/
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @vmType = :dumpRenderTree
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @vmType = :jsc
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
844fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @svnRevision = svnRevision
846fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Try to detect information about the VM.
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if path =~ /\/WebKitBuild\/Release\/([a-zA-Z]+)$/
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @checkoutPath = $~.pre_match
850fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch      # FIXME: Use some variant of this:
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # <bdash>   def retrieve_revision
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # <bdash>     `perl -I#{@path}/Tools/Scripts -MVCSUtils -e 'print svnRevisionForDirectory("#{@path}");'`.to_i
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # <bdash>   end
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      unless @svnRevision
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        begin
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Dir.chdir(@checkoutPath) {
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            $stderr.puts ">> cd #{@checkoutPath} && svn info" if $verbosity>=2
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IO.popen("svn info", "r") {
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              | inp |
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              inp.each_line {
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                | line |
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if line =~ /Revision: ([0-9]+)/
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  @svnRevision = $1
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                end
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              }
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          unless @svnRevision
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            $stderr.puts "Warning: running svn info for #{name} silently failed."
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          end
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rescue => e
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # Failed to detect svn revision.
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          $stderr.puts "Warning: could not get svn revision information for #{name}: #{e}"
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        end
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Warning: could not identify checkout location for #{name}"
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
879fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if @path =~ /\/Release\/([a-zA-Z]+)$/
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @libPath, @relativeBinPath = $~.pre_match+"/Release", "./#{$1}"
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif @path =~ /\/Contents\/Resources\/([a-zA-Z]+)$/
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @libPath = $~.pre_match
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif @path =~ /\/JavaScriptCore.framework\/Resources\/([a-zA-Z]+)$/
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @libPath, @relativeBinPath = $~.pre_match, $&[1..-1]
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
888fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def canCopyIntoBenchPath
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if @libPath and @relativeBinPath
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      true
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      false
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
896fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def copyIntoBenchPath
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless canCopyIntoBenchPath
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    basename, filename = Benchfile.uniqueFilename("vm")
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless Dir.mkdir(filename)
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = "cp -a #{@libPath.inspect}/* #{filename.inspect}"
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts ">> #{cmd}" if $verbosity>=2
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless system(cmd)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @path = "#{basename}/#{@relativeBinPath}"
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @libPath = basename
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
907fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
911fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def name
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
915fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def shouldMeasureGC
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $measureGC == true or ($measureGC == name)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
919fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def origPath
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @origPath
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
923fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def path
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @path
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
927fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def nameKind
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @nameKind
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
931fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vmType
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vmType
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
935fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def checkoutPath
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @checkoutPath
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
939fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def svnRevision
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @svnRevision
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
943fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def printFunction
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case @vmType
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when :jsc
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "print"
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when :dumpRenderTree
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "debug"
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise @vmType
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
954fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def emitRunCode(fileToRun)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    myLibPath = @libPath
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    myLibPath = "" unless myLibPath
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $script.puts "export DYLD_LIBRARY_PATH=#{myLibPath.to_s.inspect}"
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $script.puts "export DYLD_FRAMEWORK_PATH=#{myLibPath.to_s.inspect}"
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $script.puts "#{path} #{fileToRun}"
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StatsAccumulator
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats = []
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ($outer*$inner).times {
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @stats << Stats.new
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
971fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def statsForIteration(outerIteration, innerIteration)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats[outerIteration*$inner + innerIteration]
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
975fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def stats
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = Stats.new
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats.each {
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result.add(yield stat)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
984fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def geometricMeanStats
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stats {
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stat.geometricMean
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
991fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def arithmeticMeanStats
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stats {
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stat.arithmeticMean
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)module Benchmark
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_accessor :benchmarkSuite
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  attr_reader :name
1003fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def fullname
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    benchmarkSuite.name + "/" + name
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1007fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fullname
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SunSpiderBenchmark
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  include Benchmark
1015fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(name)
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name = name
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1019fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def emitRunCode(plan)
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    emitBenchRunCode(fullname, plan, nil, ensureFile("SunSpider-#{@name}", "#{SUNSPIDER_PATH}/#{@name}.js"))
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class V8Benchmark
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  include Benchmark
1027fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(name)
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name = name
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1031fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def emitRunCode(plan)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    emitBenchRunCode(fullname, plan, nil, ensureFile("V8-#{@name}", "#{V8_PATH}/v8-#{@name}.js"))
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KrakenBenchmark
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  include Benchmark
1039fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(name)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name = name
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1043fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def emitRunCode(plan)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    emitBenchRunCode(fullname, plan, ensureFile("KrakenData-#{@name}", "#{KRAKEN_PATH}/#{@name}-data.js"), ensureFile("Kraken-#{@name}", "#{KRAKEN_PATH}/#{@name}.js"))
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BenchmarkSuite
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(name, path, preferredMean)
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name = name
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @path = path
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @preferredMean = preferredMean
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarks = []
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1056fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def name
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1060fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @name
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1064fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def path
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @path
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1068fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def add(benchmark)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if not $benchmarkPattern or "#{@name}/#{benchmark.name}" =~ $benchmarkPattern
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      benchmark.benchmarkSuite = self
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      @benchmarks << benchmark
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1075fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmarks
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarks
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1079fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmarkForName(name)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = @benchmarks.select{|v| v.name == name}
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless result.length == 1
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result[0]
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1085fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def empty?
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarks.empty?
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1089fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def retain_if
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarks.delete_if {
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | benchmark |
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      not yield benchmark
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1096fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def preferredMean
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @preferredMean
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1100fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def computeMean(stat)
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stat.send @preferredMean
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BenchRunPlan
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(benchmark, vm, iteration)
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark = benchmark
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vm = vm
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @iteration = iteration
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1112fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmark
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1116fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suite
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark.benchmarkSuite
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1120fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vm
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vm
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1124fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def iteration
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @iteration
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1128fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def emitRunCode
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark.emitRunCode(self)
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BenchmarkOnVM
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(benchmark, suiteOnVM)
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark = benchmark
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suiteOnVM = suiteOnVM
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats = Stats.new
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1140fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "#{@benchmark} on #{@suiteOnVM.vm}"
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1144fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmark
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1148fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vm
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suiteOnVM.vm
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1152fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vmStats
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suiteOnVM.vmStats
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1156fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suite
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmark.benchmarkSuite
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1160fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suiteOnVM
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suiteOnVM
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1164fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def stats
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1168fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def parseResult(result)
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise "VM mismatch; I've got #{vm} and they've got #{result.vm}" unless result.vm == vm
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless result.benchmark == @benchmark
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @stats.add(result.time)
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SuiteOnVM < StatsAccumulator
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(vm, vmStats, suite)
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    super()
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vm = vm
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vmStats = vmStats
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suite = suite
1182fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @vm.is_a? VM
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @vmStats.is_a? StatsAccumulator
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @suite.is_a? BenchmarkSuite
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1187fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "#{@suite} on #{@vm}"
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1191fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suite
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @suite
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1195fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vm
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vm
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1199fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vmStats
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless @vmStats
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @vmStats
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BenchPlan
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def initialize(benchmarkOnVM, iteration)
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM = benchmarkOnVM
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @iteration = iteration
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1211fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def to_s
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "#{@benchmarkOnVM} \##{@iteration+1}"
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1215fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmarkOnVM
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1219fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def benchmark
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.benchmark
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1223fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def suite
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.suite
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1227fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def vm
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.vm
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1231fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def iteration
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @iteration
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1235fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def parseResult(result)
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless result.plan == self
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.parseResult(result)
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.vmStats.statsForIteration(@iteration, result.innerIndex).add(result.time)
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @benchmarkOnVM.suiteOnVM.statsForIteration(@iteration, result.innerIndex).add(result.time)
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def lpad(str,chars)
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if str.length>chars
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "%#{chars}s"%(str)
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def rpad(str,chars)
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while str.length<chars
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str+=" "
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  str
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def center(str,chars)
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while str.length<chars
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str+=" "
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if str.length<chars
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      str=" "+str
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  str
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def statsToStr(stats)
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $inner*$outer == 1
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    string = numToStr(stats.mean)
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless string =~ /\./
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    left = $~.pre_match
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    right = $~.post_match
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    lpad(left,12)+"."+rpad(right,9)
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    lpad(numToStr(stats.mean),11)+"+-"+rpad(numToStr(stats.confInt),9)
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def plural(num)
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if num == 1
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ""
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "s"
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def wrap(str, columns)
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  array = str.split
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result = ""
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  curLine = array.shift
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  array.each {
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | curStr |
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (curLine + " " + curStr).size > columns
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += curLine + "\n"
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      curLine = curStr
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      curLine += " " + curStr
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result + curLine + "\n"
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
1304fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def runAndGetResults
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  results = nil
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Dir.chdir(BENCH_DATA_PATH) {
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IO.popen("sh ./runscript", "r") {
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | inp |
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      results = inp.read
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise "Script did not complete correctly: #{$?}" unless $?.success?
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  raise unless results
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  results
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def parseAndDisplayResults(results)
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  vmStatses = []
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    vmStatses << StatsAccumulator.new
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1323fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  suitesOnVMs = []
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  suitesOnVMsForSuite = {}
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $suites.each {
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | suite |
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    suitesOnVMsForSuite[suite] = []
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  suitesOnVMsForVM = {}
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    suitesOnVMsForVM[vm] = []
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1335fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  benchmarksOnVMs = []
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  benchmarksOnVMsForBenchmark = {}
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $benchmarks.each {
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | benchmark |
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    benchmarksOnVMsForBenchmark[benchmark] = []
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1342fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each_with_index {
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm, vmIndex |
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    vmStats = vmStatses[vmIndex]
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $suites.each {
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | suite |
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      suiteOnVM = SuiteOnVM.new(vm, vmStats, suite)
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      suitesOnVMs << suiteOnVM
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      suitesOnVMsForSuite[suite] << suiteOnVM
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      suitesOnVMsForVM[vm] << suiteOnVM
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      suite.benchmarks.each {
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | benchmark |
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        benchmarkOnVM = BenchmarkOnVM.new(benchmark, suiteOnVM)
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        benchmarksOnVMs << benchmarkOnVM
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        benchmarksOnVMsForBenchmark[benchmark] << benchmarkOnVM
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1360fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  plans = []
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  benchmarksOnVMs.each {
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | benchmarkOnVM |
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $outer.times {
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | iteration |
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      plans << BenchPlan.new(benchmarkOnVM, iteration)
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  hostname = nil
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  hwmodel = nil
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  results.each_line {
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | line |
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    line.chomp!
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if line =~ /HOSTNAME:([^.]+)/
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hostname = $1
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif line =~ /HARDWARE:hw\.model: /
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hwmodel = $~.post_match.chomp
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result = ParsedResult.parse(plans, line.chomp)
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if result
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.plan.parseResult(result)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1386fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # Compute the geomean of the preferred means of results on a SuiteOnVM
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  overallResults = []
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = Stats.new
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $outer.times {
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | outerIndex |
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $inner.times {
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | innerIndex |
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        curResult = Stats.new
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        suitesOnVMsForVM[vm].each {
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          | suiteOnVM |
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # For a given iteration, suite, and VM, compute the suite's preferred mean
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # over the data collected for all benchmarks in that suite. We'll have one
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # sample per benchmark. For example on V8 this will be the geomean of 1
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # sample for crypto, 1 sample for deltablue, and so on, and 1 sample for
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # splay.
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          curResult.add(suiteOnVM.suite.computeMean(suiteOnVM.statsForIteration(outerIndex, innerIndex)))
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1406fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        # curResult now holds 1 sample for each of the means computed in the above
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        # loop. Compute the geomean over this, and store it.
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.add(curResult.geometricMean)
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # $overallResults will have a Stats for each VM. That Stats object will hold
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # $inner*$outer geomeans, allowing us to compute the arithmetic mean and
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # confidence interval of the geomeans of preferred means. Convoluted, but
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # useful and probably sound.
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    overallResults << result
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1419fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $verbosity >= 2
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    benchmarksOnVMs.each {
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | benchmarkOnVM |
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "#{benchmarkOnVM}: #{benchmarkOnVM.stats}"
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1425fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms.each_with_index {
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | vm, vmIndex |
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      vmStats = vmStatses[vmIndex]
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "#{vm} (arithmeticMean): #{vmStats.arithmeticMeanStats}"
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "#{vm} (geometricMean): #{vmStats.geometricMeanStats}"
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  reportName =
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (if ($vms.collect {
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           | vm |
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           vm.nameKind
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         }.index :auto)
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ""
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     else
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       $vms.collect {
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         | vm |
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         vm.to_s
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       }.join("_") + "_"
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     end) +
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ($suites.collect {
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       | suite |
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       suite.to_s
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     }.join("")) + "_" +
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (if hostname
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       hostname + "_"
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     else
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ""
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     end)+
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (begin
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       time = Time.now
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       "%04d%02d%02d_%02d%02d" %
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         [ time.year, time.month, time.day,
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           time.hour, time.min ]
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     end) +
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "_benchReport.txt"
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unless $brief
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "Generating benchmark report at #{reportName}"
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1466fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp = $stdout
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  begin
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp = File.open(reportName,"w")
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  rescue => e
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts "Error: could not save report to #{reportName}: #{e}"
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1474fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def createVMsString
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = ""
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += "   " if $suites.size > 1
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += rpad("", $benchpad)
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += " "
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms.size.times {
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | index |
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if index != 0
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += " "+NoChange.new(0).shortForm
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += lpad(center($vms[index].name, 9+9+2), 11+9+2)
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += "    "
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if $vms.size >= 3
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += center("#{$vms[-1].name} v. #{$vms[0].name}",26)
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elsif $vms.size >= 2
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += " "*26
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1495fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  columns = [createVMsString.size, 78].max
1497fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.print "Benchmark report for "
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $suites.size == 1
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print $suites[0].to_s
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  elsif $suites.size == 2
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print "#{$suites[0]} and #{$suites[1]}"
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print "#{$suites[0..-2].join(', ')}, and #{$suites[-1]}"
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if hostname
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print " on #{hostname}"
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if hwmodel
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print " (#{hwmodel})"
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts "."
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts
1514fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # This looks stupid; revisit later.
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if false
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $suites.each {
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | suite |
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.puts "#{suite} at #{suite.path}"
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1521fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1524fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts "VMs tested:"
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print "\"#{vm.name}\" at #{vm.origPath}"
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if vm.svnRevision
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print " (r#{vm.svnRevision})"
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1534fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts
1536fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts wrap("Collected #{$outer*$inner} sample#{plural($outer*$inner)} per benchmark/VM, "+
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "with #{$outer} VM invocation#{plural($outer)} per benchmark."+
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 (if $rerun > 1 then (" Ran #{$rerun} benchmark iterations, and measured the "+
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                      "total time of those iterations, for each sample.")
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  else "" end)+
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 (if $measureGC == true then (" No manual garbage collection invocations were "+
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                              "emitted.")
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  elsif $measureGC then (" Emitted a call to gc() between sample measurements for "+
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                         "all VMs except #{$measureGC}.")
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  else (" Emitted a call to gc() between sample measurements.") end)+
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 (if $warmup == 0 then (" Did not include any warm-up iterations; measurements "+
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        "began with the very first iteration.")
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  else (" Used #{$warmup*$rerun} benchmark iteration#{plural($warmup*$rerun)} per VM "+
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        "invocation for warm-up.") end)+
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 (case $timeMode
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  when :preciseTime then (" Used the jsc-specific preciseTime() function to get "+
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                          "microsecond-level timing.")
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  when :date then (" Used the portable Date.now() method to get millisecond-"+
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   "level timing.")
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  else raise end)+
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 " Reporting benchmark execution times with 95% confidence "+
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "intervals in milliseconds.",
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 columns)
1560fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts
1562fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def printVMs(outp)
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts createVMsString
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1566fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def summaryStats(outp, accumulators, name, &proc)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print "   " if $suites.size > 1
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print rpad(name, $benchpad)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print " "
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    accumulators.size.times {
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | index |
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if index != 0
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outp.print " "+accumulators[index].stats(&proc).compareTo(accumulators[index-1].stats(&proc)).shortForm
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print statsToStr(accumulators[index].stats(&proc))
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if accumulators.size>=2
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print("    "+accumulators[-1].stats(&proc).compareTo(accumulators[0].stats(&proc)).longForm)
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1583fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def meanName(currentMean, preferredMean)
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = "<#{currentMean}>"
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if "#{currentMean}Mean" == preferredMean.to_s
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result += " *"
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1591fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def allSummaryStats(outp, accumulators, preferredMean)
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    summaryStats(outp, accumulators, meanName("arithmetic", preferredMean)) {
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stat.arithmeticMean
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1597fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    summaryStats(outp, accumulators, meanName("geometric", preferredMean)) {
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stat.geometricMean
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1602fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    summaryStats(outp, accumulators, meanName("harmonic", preferredMean)) {
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | stat |
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stat.harmonicMean
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1608fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $suites.each {
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | suite |
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printVMs(outp)
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if $suites.size > 1
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.puts "#{suite.name}:"
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.puts
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    suite.benchmarks.each {
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | benchmark |
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print "   " if $suites.size > 1
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print rpad(benchmark.name, $benchpad)
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print " "
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      myConfigs = benchmarksOnVMsForBenchmark[benchmark]
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      myConfigs.size.times {
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | index |
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if index != 0
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          outp.print " "+myConfigs[index].stats.compareTo(myConfigs[index-1].stats).shortForm
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        end
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outp.print statsToStr(myConfigs[index].stats)
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if $vms.size>=2
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outp.print("    "+myConfigs[-1].stats.compareTo(myConfigs[0].stats).to_s)
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.puts
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    allSummaryStats(outp, suitesOnVMsForSuite[suite], suite.preferredMean)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts if $suites.size > 1
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1639fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $suites.size > 1
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printVMs(outp)
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts "All benchmarks:"
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    allSummaryStats(outp, vmStatses, nil)
1644fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printVMs(outp)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts "Geomean of preferred means:"
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print "   "
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print rpad("<scaled-result>", $benchpad)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.print " "
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms.size.times {
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | index |
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if index != 0
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outp.print " "+overallResults[index].compareTo(overallResults[index-1]).shortForm
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print statsToStr(overallResults[index])
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if overallResults.size>=2
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      outp.print("    "+overallResults[-1].compareTo(overallResults[0]).longForm)
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.puts
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  outp.puts
1664fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if outp != $stdout
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    outp.close
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1668fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if outp != $stdout and not $brief
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    File.open(reportName) {
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | inp |
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      puts inp.read
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1676fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $brief
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts(overallResults.collect{|stats| stats.mean}.join("\t"))
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts(overallResults.collect{|stats| stats.confInt}.join("\t"))
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1681fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1682fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)begin
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $sawBenchOptions = false
1687fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def resetBenchOptionsIfNecessary
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unless $sawBenchOptions
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeSunSpider = false
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeV8 = false
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeKraken = false
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $sawBenchOptions = true
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1696fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GetoptLong.new(['--rerun', GetoptLong::REQUIRED_ARGUMENT],
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--inner', GetoptLong::REQUIRED_ARGUMENT],
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--outer', GetoptLong::REQUIRED_ARGUMENT],
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--warmup', GetoptLong::REQUIRED_ARGUMENT],
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--timing-mode', GetoptLong::REQUIRED_ARGUMENT],
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--sunspider-only', GetoptLong::NO_ARGUMENT],
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--v8-only', GetoptLong::NO_ARGUMENT],
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--kraken-only', GetoptLong::NO_ARGUMENT],
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--exclude-sunspider', GetoptLong::NO_ARGUMENT],
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--exclude-v8', GetoptLong::NO_ARGUMENT],
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--exclude-kraken', GetoptLong::NO_ARGUMENT],
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--sunspider', GetoptLong::NO_ARGUMENT],
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--v8', GetoptLong::NO_ARGUMENT],
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--kraken', GetoptLong::NO_ARGUMENT],
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--benchmarks', GetoptLong::REQUIRED_ARGUMENT],
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--measure-gc', GetoptLong::OPTIONAL_ARGUMENT],
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--force-vm-kind', GetoptLong::REQUIRED_ARGUMENT],
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--force-vm-copy', GetoptLong::NO_ARGUMENT],
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--dont-copy-vms', GetoptLong::NO_ARGUMENT],
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--verbose', '-v', GetoptLong::NO_ARGUMENT],
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--brief', GetoptLong::NO_ARGUMENT],
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--silent', GetoptLong::NO_ARGUMENT],
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--remote', GetoptLong::REQUIRED_ARGUMENT],
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--local', GetoptLong::NO_ARGUMENT],
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--ssh-options', GetoptLong::REQUIRED_ARGUMENT],
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--slave', GetoptLong::NO_ARGUMENT],
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--prepare-only', GetoptLong::NO_ARGUMENT],
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--analyze', GetoptLong::REQUIRED_ARGUMENT],
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--vms', GetoptLong::REQUIRED_ARGUMENT],
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 ['--help', '-h', GetoptLong::NO_ARGUMENT]).each {
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | opt, arg |
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case opt
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--rerun'
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $rerun = intArg(opt,arg,1,nil)
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--inner'
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $inner = intArg(opt,arg,1,nil)
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--outer'
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $outer = intArg(opt,arg,1,nil)
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--warmup'
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $warmup = intArg(opt,arg,0,nil)
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--timing-mode'
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if arg.upcase == "PRECISETIME"
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $timeMode = :preciseTime
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elsif arg.upcase == "DATE"
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $timeMode = :date
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elsif arg.upcase == "AUTO"
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $timeMode = :auto
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        quickFail("Expected either 'preciseTime', 'date', or 'auto' for --time-mode, but got '#{arg}'.",
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "Invalid argument for command-line option")
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--force-vm-kind'
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if arg.upcase == "JSC"
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $forceVMKind = :jsc
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elsif arg.upcase == "DUMPRENDERTREE"
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $forceVMKind = :dumpRenderTree
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elsif arg.upcase == "AUTO"
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $forceVMKind = nil
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        quickFail("Expected either 'jsc' or 'DumpRenderTree' for --force-vm-kind, but got '#{arg}'.",
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "Invalid argument for command-line option")
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--force-vm-copy'
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $needToCopyVMs = true
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--dont-copy-vms'
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $dontCopyVMs = true
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--sunspider-only'
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeV8 = false
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeKraken = false
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--v8-only'
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeSunSpider = false
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeKraken = false
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--kraken-only'
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeSunSpider = false
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeV8 = false
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--exclude-sunspider'
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeSunSpider = false
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--exclude-v8'
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeV8 = false
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--exclude-kraken'
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeKraken = false
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--sunspider'
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resetBenchOptionsIfNecessary
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeSunSpider = true
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--v8'
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resetBenchOptionsIfNecessary
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeV8 = true
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--kraken'
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resetBenchOptionsIfNecessary
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $includeKraken = true
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--benchmarks'
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $benchmarkPattern = Regexp.new(arg)
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--measure-gc'
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if arg == ''
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $measureGC = true
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $measureGC = arg
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--verbose'
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $verbosity += 1
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--brief'
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $brief = true
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--silent'
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $silent = true
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--remote'
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $remoteHosts += arg.split(',')
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $needToCopyVMs = true
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--ssh-options'
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $sshOptions << arg
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--local'
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $alsoLocal = true
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--prepare-only'
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $run = false
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--analyze'
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $prepare = false
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $run = false
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $analyze << arg
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    when '--help'
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      usage
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise "bad option: #{opt}"
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1820fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # If the --dont-copy-vms option was passed, it overrides the --force-vm-copy option.
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $dontCopyVMs
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $needToCopyVMs = false
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1825fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  SUNSPIDER = BenchmarkSuite.new("SunSpider", SUNSPIDER_PATH, :arithmeticMean)
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ["3d-cube", "3d-morph", "3d-raytrace", "access-binary-trees",
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "access-fannkuch", "access-nbody", "access-nsieve",
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "bitops-3bit-bits-in-byte", "bitops-bits-in-byte", "bitops-bitwise-and",
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "bitops-nsieve-bits", "controlflow-recursive", "crypto-aes",
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "crypto-md5", "crypto-sha1", "date-format-tofte", "date-format-xparb",
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "math-cordic", "math-partial-sums", "math-spectral-norm", "regexp-dna",
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "string-base64", "string-fasta", "string-tagcloud",
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "string-unpack-code", "string-validate-input"].each {
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | name |
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SUNSPIDER.add SunSpiderBenchmark.new(name)
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  V8 = BenchmarkSuite.new("V8", V8_PATH, :geometricMean)
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ["crypto", "deltablue", "earley-boyer", "raytrace",
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "regexp", "richards", "splay"].each {
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | name |
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    V8.add V8Benchmark.new(name)
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  KRAKEN = BenchmarkSuite.new("Kraken", KRAKEN_PATH, :arithmeticMean)
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ["ai-astar", "audio-beat-detection", "audio-dft", "audio-fft",
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "audio-oscillator", "imaging-darkroom", "imaging-desaturate",
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "imaging-gaussian-blur", "json-parse-financial",
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "json-stringify-tinderbox", "stanford-crypto-aes",
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "stanford-crypto-ccm", "stanford-crypto-pbkdf2",
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   "stanford-crypto-sha256-iterative"].each {
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | name |
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KRAKEN.add KrakenBenchmark.new(name)
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ARGV.each {
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if vm =~ /([a-zA-Z0-9_ ]+):/
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      name = $1
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      nameKind = :given
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      vm = $~.post_match
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      name = "Conf\##{$vms.length+1}"
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      nameKind = :auto
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts "#{name}: #{vm}" if $verbosity >= 1
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms << VM.new(Pathname.new(vm).realpath, name, nameKind, nil)
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1870fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $vms.empty?
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    quickFail("Please specify at least on configuraiton on the command line.",
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "Insufficient arguments")
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1875fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if vm.vmType != :jsc and $timeMode != :date
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $timeMode = :date
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Warning: using Date.now() instead of preciseTime() because #{vm} doesn't support the latter."
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1883fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if FileTest.exist? BENCH_DATA_PATH
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = "rm -rf #{BENCH_DATA_PATH}"
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts ">> #{cmd}" if $verbosity >= 2
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    raise unless system cmd
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1889fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Dir.mkdir BENCH_DATA_PATH
1891fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $needToCopyVMs
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    canCopyIntoBenchPath = true
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms.each {
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | vm |
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      canCopyIntoBenchPath = false unless vm.canCopyIntoBenchPath
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1898fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if canCopyIntoBenchPath
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $vms.each {
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | vm |
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts "Copying #{vm} into #{BENCH_DATA_PATH}..."
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        vm.copyIntoBenchPath
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "All VMs are in place."
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Warning: don't know how to copy some VMs into #{BENCH_DATA_PATH}, so I won't do it."
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1910fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $measureGC and $measureGC != true
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    found = false
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $vms.each {
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | vm |
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if vm.name == $measureGC
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        found = true
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unless found
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Warning: --measure-gc option ignored because no VM is named #{$measureGC}"
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1923fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $outer*$inner == 1
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $stderr.puts "Warning: will only collect one sample per benchmark/VM.  Confidence interval calculation will fail."
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1927fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $stderr.puts "Using timeMode = #{$timeMode}." if $verbosity >= 1
1929fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $suites = []
1931fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $includeSunSpider and not SUNSPIDER.empty?
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $suites << SUNSPIDER
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1935fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $includeV8 and not V8.empty?
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $suites << V8
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1939fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $includeKraken and not KRAKEN.empty?
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $suites << KRAKEN
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
1943fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $benchmarks = []
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $suites.each {
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | suite |
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $benchmarks += suite.benchmarks
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1949fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $runPlans = []
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vms.each {
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $benchmarks.each {
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | benchmark |
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $outer.times {
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | iteration |
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $runPlans << BenchRunPlan.new(benchmark, vm, iteration)
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1961fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $runPlans.shuffle!
1963fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $suitepad = $suites.collect {
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | suite |
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    suite.to_s.size
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }.max + 1
1968fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $benchpad = ($benchmarks +
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               ["<arithmetic> *", "<geometric> *", "<harmonic> *"]).collect {
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | benchmark |
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if benchmark.respond_to? :name
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      benchmark.name.size
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      benchmark.size
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }.max + 1
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $vmpad = $vms.collect {
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | vm |
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    vm.to_s.size
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }.max + 1
1983fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $prepare
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    File.open("#{BENCH_DATA_PATH}/runscript", "w") {
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      | file |
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "echo \"HOSTNAME:\\c\""
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "hostname"
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "echo"
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "echo \"HARDWARE:\\c\""
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "/usr/sbin/sysctl hw.model"
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "echo"
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      file.puts "set -e"
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $script = file
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $runPlans.each_with_index {
19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | plan, idx |
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if $verbosity == 0 and not $silent
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          text1 = lpad(idx.to_s,$runPlans.size.to_s.size)+"/"+$runPlans.size.to_s
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          text2 = plan.benchmark.to_s+"/"+plan.vm.to_s
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          file.puts("echo "+("\r#{text1} #{rpad(text2,$suitepad+1+$benchpad+1+$vmpad)}".inspect)[0..-2]+"\\c\" 1>&2")
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          file.puts("echo "+("\r#{text1} #{text2}".inspect)[0..-2]+"\\c\" 1>&2")
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        end
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plan.emitRunCode
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if $verbosity == 0 and not $silent
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        file.puts("echo "+("\r#{$runPlans.size}/#{$runPlans.size} #{' '*($suitepad+1+$benchpad+1+$vmpad)}".inspect)[0..-2]+"\\c\" 1>&2")
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        file.puts("echo "+("\r#{$runPlans.size}/#{$runPlans.size}".inspect)+" 1>&2")
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
2011fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $run
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unless $remoteHosts.empty?
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Packaging benchmarking directory for remote hosts..." if $verbosity==0
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Dir.chdir(TEMP_PATH) {
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cmd = "tar -czf payload.tar.gz benchdata"
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts ">> #{cmd}" if $verbosity>=2
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise unless system(cmd)
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
2020fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      def grokHost(host)
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if host =~ /:([0-9]+)$/
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          "-p " + $1 + " " + $~.pre_match.inspect
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          host.inspect
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        end
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
2028fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      def sshRead(host, command)
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cmd = "ssh #{$sshOptions.collect{|x| x.inspect}.join(' ')} #{grokHost(host)} #{command.inspect}"
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts ">> #{cmd}" if $verbosity>=2
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = ""
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IO.popen(cmd, "r") {
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          | inp |
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          inp.each_line {
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            | line |
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            $stderr.puts "#{host}: #{line}" if $verbosity>=2
20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result += line
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise "#{$?}" unless $?.success?
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
2044fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      def sshWrite(host, command, data)
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cmd = "ssh #{$sshOptions.collect{|x| x.inspect}.join(' ')} #{grokHost(host)} #{command.inspect}"
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts ">> #{cmd}" if $verbosity>=2
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IO.popen(cmd, "w") {
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          | outp |
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          outp.write(data)
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise "#{$?}" unless $?.success?
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      end
2054fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $remoteHosts.each {
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        | host |
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts "Sending benchmark payload to #{host}..." if $verbosity==0
2058fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        remoteTempPath = JSON::parse(sshRead(host, "cat ~/.bencher"))["tempPath"]
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise unless remoteTempPath
2061fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sshWrite(host, "cd #{remoteTempPath.inspect} && rm -rf benchdata && tar -xz", IO::read("#{TEMP_PATH}/payload.tar.gz"))
2063fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $stderr.puts "Running on #{host}..." if $verbosity==0
2065fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parseAndDisplayResults(sshRead(host, "cd #{(remoteTempPath+'/benchdata').inspect} && sh runscript"))
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
2069fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if not $remoteHosts.empty? and $alsoLocal
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $stderr.puts "Running locally..."
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
2073fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if $remoteHosts.empty? or $alsoLocal
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parseAndDisplayResults(runAndGetResults)
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
2078fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $analyze.each_with_index {
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    | filename, index |
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if index >= 1
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      puts
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    end
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parseAndDisplayResults(IO::read(filename))
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2086fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if $prepare and not $run and $analyze.empty?
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts wrap("Benchmarking script and data are in #{BENCH_DATA_PATH}. You can run "+
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "the benchmarks and get the results by doing:", 78)
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "cd #{BENCH_DATA_PATH}"
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts "sh runscript > results.txt"
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts
20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    puts wrap("Then you can analyze the results by running bencher with the same arguments "+
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              "as now, but replacing --prepare-only with --analyze results.txt.", 78)
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  end
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)rescue => e
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  fail(e)
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)end
2100fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2101fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2102