CPU cache microbenchmark
HTML
<script src="https://github.com/bestiejs/benchmark.js/raw/master/benchmark.js"></script>
<div id='log'/>
JavaScript
var logs=document.getElementById('log');
console.log= function(s){
var e=document.createElement('pre');
e.innerHTML=s;
logs.insertBefore(e);
}
'use strict';
//var Benchmark=require('benchmark');
var N = 500000; // 1m
function randperm(maxValue){
// first generate number sequence
var permArray = new Array(maxValue);
for(var i = 0; i < maxValue; i++){
permArray[i] = i;
}
// draw out of the number sequence
for (var i = (maxValue - 1); i >= 0; --i){
var randPos = Math.floor(i * Math.random());
var tmpStore = permArray[i];
permArray[i] = permArray[randPos];
permArray[randPos] = tmpStore;
}
return permArray;
}
function sum(arr){
var s = 0;
for (var i=0; i<N; i++){
s+=arr[i].el;
}
return s;
}
function revSum(arr){
var s = 0;
for (var i=N-1; i>=0; i--){
s+=arr[i].el;
}
return s;
}
function Wrapper(v){
this.el=v;
}
var el=function(){
return new Wrapper(1.1);
};
function genLinear(){
var arr = Array(N);
for (var i=0; i<N; i++){
arr[i]=el();
}
return arr;
}
function genReverse(){
var arr = Array(N);
for (var i=N-1; i>=0; i--){
arr[i]=el();
}
return arr;
}
function genRandom(){
var arr = Array(N);
randperm(N).forEach(function (i) {
arr[i]=el();
});
return arr;
}
function genRandom(randPerm){
var arr = Array(N);
randperm.forEach(function (i) {
arr[i]=el();
});
return arr;
}
var l = genLinear();
var r = genReverse();
var randPerm = randperm(N);
var rand = genRandom(randPerm);
console.log(sum(l)==sum(r) && sum(l)==sum(rand) && sum(l)==revSum(r));
var suite = new Benchmark.Suite;
suite.add('linear sum', function() {
sum(l);
}).add('reverse sum', function() {
sum(r);
}).add('scan in reverse sum', function() {
revSum(l);
}).add('random sum', function() {
sum(rand);
}).on('cycle', function(event, bench) {
...