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