Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 6eedcd9

Browse files
committed
Beginnings of a performance testing suite.
Use `npm run benchmark`.
1 parent 681f6d2 commit 6eedcd9

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed

benchmark/compare-with-callbacks.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"use strict";
2+
3+
var Q = require("../q");
4+
var fs = require("fs");
5+
6+
suite("A single simple async operation", function () {
7+
bench("with an immediately-fulfilled promise", function (done) {
8+
Q().then(done);
9+
});
10+
11+
bench("with direct setImmediate usage", function (done) {
12+
setImmediate(done);
13+
});
14+
15+
bench("with direct setTimeout(…, 0)", function (done) {
16+
setTimeout(done, 0);
17+
});
18+
});
19+
20+
suite("A fs.readFile", function () {
21+
var denodeified = Q.denodeify(fs.readFile);
22+
23+
set("iterations", 1000);
24+
set("delay", 1000);
25+
26+
bench("directly, with callbacks", function (done) {
27+
fs.readFile(__filename, done);
28+
});
29+
30+
bench("with Q.nfcall", function (done) {
31+
Q.nfcall(fs.readFile, __filename).then(done);
32+
});
33+
34+
bench("with a Q.denodeify'ed version", function (done) {
35+
denodeified(__filename).then(done);
36+
});
37+
38+
bench("with manual usage of deferred.makeNodeResolver", function (done) {
39+
var deferred = Q.defer();
40+
fs.readFile(__filename, deferred.makeNodeResolver());
41+
deferred.promise.then(done);
42+
});
43+
});
44+
45+
suite("1000 operations in parallel", function () {
46+
function makeCounter(desiredCount, ultimateCallback) {
47+
var soFar = 0;
48+
return function () {
49+
if (++soFar === desiredCount) {
50+
ultimateCallback();
51+
}
52+
};
53+
}
54+
var numberOfOps = 1000;
55+
56+
bench("with immediately-fulfilled promises", function (done) {
57+
var counter = makeCounter(numberOfOps, done);
58+
59+
for (var i = 0; i < numberOfOps; ++i) {
60+
Q().then(counter);
61+
}
62+
});
63+
64+
bench("with direct setImmediate usage", function (done) {
65+
var counter = makeCounter(numberOfOps, done);
66+
67+
for (var i = 0; i < numberOfOps; ++i) {
68+
setImmediate(counter);
69+
}
70+
});
71+
});

benchmark/scenarios.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"use strict";
2+
3+
var Q = require("../q");
4+
5+
suite("Chaining", function () {
6+
var numberToChain = 1000;
7+
8+
bench("Chaining many already-fulfilled promises together", function (done) {
9+
var currentPromise = Q();
10+
for (var i = 0; i < numberToChain; ++i) {
11+
currentPromise = currentPromise.then(function () {
12+
return Q();
13+
});
14+
}
15+
16+
currentPromise.then(done);
17+
});
18+
19+
bench("Chaining and then fulfilling the end of the chain", function (done) {
20+
var deferred = Q.defer();
21+
22+
var currentPromise = deferred.promise;
23+
for (var i = 0; i < numberToChain; ++i) {
24+
(function () {
25+
var promiseToReturn = currentPromise;
26+
currentPromise = Q().then(function () {
27+
return promiseToReturn;
28+
});
29+
}());
30+
}
31+
32+
currentPromise.then(done);
33+
34+
deferred.resolve();
35+
});
36+
});

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,13 @@
5151
"promises-aplus-tests": "1.x",
5252
"grunt": "~0.4.1",
5353
"grunt-cli": "~0.1.9",
54-
"grunt-contrib-uglify": "~0.2.2"
54+
"grunt-contrib-uglify": "~0.2.2",
55+
"matcha": "~0.2.0"
5556
},
5657
"scripts": {
5758
"test": "jasmine-node spec && promises-aplus-tests spec/aplus-adapter",
5859
"test-browser": "opener spec/q-spec.html",
60+
"benchmark": "matcha",
5961
"lint": "jshint q.js",
6062
"cover": "cover run node_modules/jasmine-node/bin/jasmine-node spec && cover report html && opener cover_html/index.html",
6163
"minify": "grunt",

0 commit comments

Comments
 (0)