blob: d75a6fea4829d5ab2fe62bde49744aebe7235850 [file] [log] [blame]
# Copyright 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Runs Mozilla's Kraken JavaScript benchmark."""
import json
import os
from core import perf_benchmark
from telemetry import benchmark
from telemetry import page as page_module
from telemetry.page import legacy_page_test
from telemetry import story
from telemetry.value import list_of_scalar_values
from telemetry.value import scalar
DESCRIPTIONS = {
'ai-astar':
'This benchmark uses the [A* search algorithm]'
'(http://en.wikipedia.org/wiki/A*_search_algorithm) to automatically '
'plot an efficient path between two points, in the presence of '
'obstacles. Adapted from code by [Brian Gringstead]'
'(http://www.briangrinstead.com/blog/astar-search-algorithm-in-'
'javascript).',
'audio-beat-detection':
'This benchmark performs [beat detection]'
'(http://en.wikipedia.org/wiki/Beat_detection) on an Audio sample '
'using [code](http://beatdetektor.svn.sourceforge.net/viewvc'
'/beatdetektor/trunk/core/js/beatdetektor.js?revision=18&view=markup) '
'from [BeatDetektor](http://www.cubicproductions.com/index.php'
'?option=com_content&view=article&id=67&Itemid=82) and '
'[DSP.js](http://github.com/corbanbrook/dsp.js/).',
'audio-dft':
'This benchmark performs a [Discrete Fourier Transform]'
'(http://en.wikipedia.org/wiki/Discrete_Fourier_transform) on an '
'Audio sample using code from [DSP.js]'
'(http://github.com/corbanbrook/dsp.js).',
'audio-fft':
'This benchmark performs a [Fast Fourier Transform]'
'(http://en.wikipedia.org/wiki/Fast_Fourier_transform) on an Audio '
'sample using code from [DSP.js]'
'(http://github.com/corbanbrook/dsp.js/).',
'audio-oscillator':
'This benchmark generates a soundwave using code from [DSP.js]'
'(http://github.com/corbanbrook/dsp.js/).',
'imaging-darkroom':
'This benchmark performs a variety of photo manipulations such as '
'Fill, Brightness, Contrast, Saturation, and Temperature.',
'imaging-desaturate':
'This benchmark [desaturates]'
'(http://en.wikipedia.org/wiki/Colorfulness) a photo using code from '
'[Pixastic](http://www.pixastic.com/).',
'imaging-gaussian-blur':
'This benchmark performs a [Gaussian blur]'
'(http://en.wikipedia.org/wiki/Gaussian_blur) on a photo.',
'json-parse-financial':
'This benchmark parses [JSON](http://www.json.org) records.',
'json-stringify-tinderbox':
'This benchmark serializes [Tinderbox]'
'(http://tests.themasta.com/tinderboxpushlog/?tree=Firefox) build '
'data to [JSON](http://www.json.org).',
}
def _Mean(l):
return float(sum(l)) / len(l) if len(l) > 0 else 0.0
class _KrakenMeasurement(legacy_page_test.LegacyPageTest):
def __init__(self):
super(_KrakenMeasurement, self).__init__()
def ValidateAndMeasurePage(self, page, tab, results):
tab.WaitForJavaScriptCondition(
'document.title.indexOf("Results") != -1', timeout=700)
tab.WaitForDocumentReadyStateToBeComplete()
result_dict = json.loads(tab.EvaluateJavaScript("""
var formElement = document.getElementsByTagName("input")[0];
decodeURIComponent(formElement.value.split("?")[1]);
"""))
total = 0
for key in result_dict:
if key == 'v':
continue
results.AddValue(list_of_scalar_values.ListOfScalarValues(
results.current_page, key, 'ms', result_dict[key], important=False,
description=DESCRIPTIONS.get(key)))
total += _Mean(result_dict[key])
# TODO(tonyg/nednguyen): This measurement shouldn't calculate Total. The
# results system should do that for us.
results.AddValue(scalar.ScalarValue(
results.current_page, 'Total', 'ms', total,
description='Total of the means of the results for each type '
'of benchmark in [Mozilla\'s Kraken JavaScript benchmark]'
'(http://krakenbenchmark.mozilla.org/)'))
@benchmark.Info(emails=['hablich@chromium.org'])
class Kraken(perf_benchmark.PerfBenchmark):
"""Mozilla's Kraken JavaScript benchmark.
http://krakenbenchmark.mozilla.org/
"""
test = _KrakenMeasurement
@classmethod
def Name(cls):
return 'kraken'
def CreateStorySet(self, options):
ps = story.StorySet(
archive_data_file='../page_sets/data/kraken.json',
base_dir=os.path.dirname(os.path.abspath(__file__)),
cloud_storage_bucket=story.PARTNER_BUCKET)
ps.AddStory(page_module.Page(
'http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html',
ps, ps.base_dir,
name='http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html'))
return ps