Skip to content

Commit

Permalink
tests [benchmark]: Created benchmarks
Browse files Browse the repository at this point in the history
Benchmarks can be run using `make benchmark`. This outputs a nicely
formatted list of speeds of various cheddar functions

Signed-off-by: Vihan B <contact@vihan.org>
  • Loading branch information
vihanb committed Dec 21, 2016
1 parent 513a64f commit e5bebd9
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 7 deletions.
5 changes: 4 additions & 1 deletion .gitignore
@@ -1,3 +1,6 @@
# Cheddar debug logs
/benckmark/debug

# Node modules
/node_modules

Expand All @@ -12,4 +15,4 @@ coverage
# Local test files
TODO.md
/*.cdr
/*.bf
/*.bf
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -13,6 +13,7 @@ install:
- npm install
- npm install -g codeclimate-test-reporter
after_success:
- make benchmark
- npm run coveralls
- bash <(curl -s https://codecov.io/bash)
- codeclimate-test-reporter < ./coverage/lcov.info
Expand Down
18 changes: 12 additions & 6 deletions Makefile
Expand Up @@ -19,6 +19,8 @@ COVERAGE=$(PREFIX)/babel-istanbul
TEST=$(PREFIX)/_mocha
TFLAGS=cover $(TEST)

BENCHMARK=benchmark/

## Rules
all: default

Expand All @@ -41,15 +43,19 @@ install: ./bin/install

# Runs browser_repl build for web REPL
# Uses browserify to compiled babelified code
browser_build: $(JC)
$(PREFIX)/browserify dist/cli/browser_repl.js -o Cheddar.js
# browser_build: $(JC)
# $(PREFIX)/browserify dist/cli/browser_repl.js -o Cheddar.js

# Performs testing, including coverage
# At the moment uses mocha for testing
# and babel-istanbul for coverage
test:$(TESTRUNNER) $(COVERAGE) $(TEST)
test: $(TESTRUNNER) $(COVERAGE) $(TEST)
$(TESTRUNNER) $(COVERAGE) $(TFLAGS)
clean:
rm -rf ./dist/

.PHONY: test
benchmark: $(BENCHMARK) $(OUT)
node $(BENCHMARK)

clean: $(OUT)
rm -rf $(OUT)

.PHONY: test benchmark clean
124 changes: 124 additions & 0 deletions benchmark/index.js
@@ -0,0 +1,124 @@
var benchmark = require('benchmark');
var colors = require('colors');
var log = "";

// Start up

var cheddar = (function(cheddar) {
if (process.argv.indexOf('--debug') > -1) {
return function(code) {
return function() {
cheddar(code, {
PRINT: function(value) { log += value }
});
}
};
} else {
return function(code) {
return function() {
cheddar(code, {
PRINT: function() {}
});
}
}
}
}(require('../')));

function leftPad(string, num) {
return string + " ".repeat(Math.max(num - string.length, 0));
}

function rightPad(string, num) {
return " ".repeat(Math.max(num - string.length, 0)) + string;
}

function longestItem(self, key, func) {
var nameLen = 0;
for (var i = 0; i < self.length; i++) {
if (func)
nameLen = Math.max(func(self[i][key]).length, nameLen)
else
nameLen = Math.max(self[i][key].toString().length, nameLen);
}
return nameLen;
}

function prettyNum(val, pad) {
var fast = 4500;
var slow = 900;
var color = 'yellow';

if (val >= fast) color = 'green';
if (val <= slow) color = 'red';

return rightPad(benchmark.formatNumber(val)[color], pad);
}

function Bench(name, args) {
if (typeof args === "string") {

} else {
var suite = new benchmark.Suite(name);
for (var i = 0; i < args.length; i++) {
suite.add(args[i][0], cheddar(args[i][1]));
}

suite.on('complete', function() {
console.log(name.bold);

var test;
var indent = ' ';

// Determine longest name
var nameLen = longestItem(this, 'name');
var hzLen = longestItem(this, 'hz', function(item) {
return benchmark.formatNumber(item | 0);
});
var longestError = longestItem(this, 'stats', function(item) {
return item.moe.toFixed(2);
});
var longestTime = longestItem(this, 'stats', function(item) {
return ( item.mean * 1000 ).toFixed(2);
});
var longestCycles = longestItem(this, 'cycles');

var totalLen = Math.max(longestTime, longestCycles);

var avgSize = 7;

for (var i = 0; i < this.length; i++) {
test = this[i];

var ops = test.hz | 0;

console.log(
indent + "✓".green + " "
+ leftPad(test.name, nameLen)
+ " x ".dim + prettyNum(ops, hzLen).bold + " ops/sec "
+ "± ".dim + leftPad(test.stats.moe.toFixed(2) + "%", longestError + 1 )
);

console.log(
" " + indent + indent + leftPad("Average", avgSize) + ": ".dim + leftPad((test.stats.mean * 1000).toFixed(2), totalLen) + " ms".dim + '\n' +
" " + indent + indent + leftPad("Cycles" , avgSize) + ": ".dim + leftPad(test.cycles, totalLen) + " total".dim
);
}

console.log('');
}).run();
}
}

// Bench("Boot Up", "");
Bench("Literal Parsing", [
[ "Numbers", "1" ],
[ "String", "'foo'" ],
[ "Symbol", "@test" ],
[ "Array", "[1, 2, 3]" ],
]);

Bench("Prime Generation", [
[ "Built-in", "let i = 0; for ( let a = []; a.len < 10; i += 1) { if (Math.prime(i)) { a.push(i) } }" ]
]);

process.stdout.write(log);
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -53,6 +53,7 @@
"babel-plugin-transform-class-properties": "^6.11.5",
"babel-preset-es2015": "^6.13.2",
"babel-traverse": "^6.19.0",
"benchmark": "^2.1.2",
"browserify": "^13.1.0",
"chai": "^3.5.0",
"codecov.io": "^0.1.6",
Expand Down

0 comments on commit e5bebd9

Please sign in to comment.