Q:

Measuring and benchmarking processing power of a javascript engine in a browser

What is an accurate way to measure the performance of a javascript engine like v8 or spidermonkey ? It should at least have not very high deviations from one evaluation and another, probably allow to rank between different javascript engines on different operating systems and different hardware configurations.
My first attempt was this in a web page with nothing on it, I loaded that page in web browsers. Then I tried executing this code in Google Chrome's javascript console and it came out very different as you'll see in the results:
mean = function (distr) {
    var sum = 0;
    for (obs in distr) {
        sum += distr[obs];
    };
    return sum / distr.length;
};

stdev = function (distr,mean) {
    var diffsquares = 0;
    for (obs in distr) {
        diffsquares += Math.pow(distr[obs] - mean , 2);
    };
    return Math.sqrt((diffsquares / distr.length));
};

var OPs = 1000000;

var results = [];
for (var t = 0; t < 60; t++) {
    var start = (new Date()).getTime();
    for(var i = 0.5; i < OPs; i++){
        i++;
    }
    var end = (new Date()).getTime();
    var took = end - start;
    var FLOPS = OPs/took;
    results.push(FLOPS);
};

average = mean(results);
deviation = stdev(results,average);

console.log('Average: '+average+' FLOPS. Standart deviation: '+deviation+' FLOPS');

And it replied:
NodeJS 0.5.0

Average: 74607.30446024566 FLOPS. Standart deviation:
4129.4008527666265 FLOPS
Average: 73974.89765136827 FLOPS. Standart
deviation: 4574.367360870471 FLOPS
Average: 73923.55086434036 FLOPS.
Standart deviation: 5768.396926072297 FLOPS

Chrome 13.0.782.112 (From the Console (Ctrl+Shift+J))

Average: 1183.409340319158 FLOPS. Standart deviation:
24.463468674550658 FLOPS
Average: 1026.8727431432026 FLOPS. Standart
deviation: 18.32394087291766 FLOPS
Average: 1063.7000331534252
FLOPS. Standart deviation: 22.928786803808094 FLOPS

Chrome 13.0.782.112 (as a webpage)

Average: 47547.03408688914 FLOPS. Standart deviation: 4064.7464541422833 FLOPS
Average: 49273.65762892078 FLOPS. Standart deviation: 1553.1768207400576 FLOPS
Average: 47849.72703247966 FLOPS. Standart deviation: 3445.930694070375 FLOPS

Firefox 6.0

Average: 62626.63398692811 FLOPS. Standart deviation:
3543.4801728588277 FLOPS
Average: 85572.76057276056 FLOPS. Standart
deviation: 4336.354514715926 FLOPS
Average: 63780.19323671495 FLOPS.
Standart deviation: 3323.648677036589 FLOPS

Opera 11.50

Average: 38462.49044165712 FLOPS. Standart deviation:
2438.527900104241 FLOPS
Average: 37968.736460671964 FLOPS. Standart
deviation: 2186.9271687271607 FLOPS
Average: 38638.1851173518 FLOPS.
Standart deviation: 1677.6876987114347 FLOPS

Something strange happened. The benchmark in Chrome on the console took a lot more time than the ones in other browsers and NodeJS. I mean something like 30 seconds on Chrome versus 2 on others. The standart deviations in Chrome on the console are also very small compared to others. Why this huge difference between executing the code on the console and executing code in a webpage ?
If this is all too stupid let me remind you that I "learned" javascript (and to code in general) by myself and not very long ago, so I suck at a lot of things.
What is a good measure of this ? I'd like to focus on speed of math operations and not other things like regex speed. What do you recomend ? I also tryied generating 10x10 matrixes of floating point numbers and multiplying them lots of times, the result comes every time either 7, 8 or 9 M FLOPS, but mostly 7 on Chrome, if it's not stupid at all and someone wants the code I'm happy to pastebin it.

A:

JS performance optimization is a huge area in general, and it's rather ambitious to start from scratch.
If I were you, I'd take a look at some existing projects around this space:

Benchmark.js handles the timing and stats analysis (averaging, computing variance) bits.
JSPerf lets anyone create and run tests and then look at results for any browser. There's q large repository of tests there that you can peruse.
BrowserScope is the results storage for JSPerf tests, and tracks results per-UA.

