Skip to content

Commit

Permalink
Create vargs without error in callback.
Browse files Browse the repository at this point in the history
Closes #327.
Closes #322.
  • Loading branch information
flatheadmill committed Aug 17, 2015
1 parent f5d3434 commit 1ee894f
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 111 deletions.
116 changes: 16 additions & 100 deletions _cadence.js
Expand Up @@ -7,7 +7,7 @@ function Cadence (parent, finalizers, self, steps, vargs, callback) {
this.steps = steps
this.callback = callback
this.loop = false
this.cadence = cadence
this.cadence = this
this.cadences = []
this.results = []
this.errors = []
Expand Down Expand Up @@ -84,7 +84,7 @@ Cadence.prototype.startLoop = function (vargs) {
this.vargs = vargs

return {
continue: { loopy: token, repeat: true, loop: false, cadence: this },
continue: { loopy: token, repeat: true, loop: true, cadence: this },
break: { loopy: token, repeat: false, loop: false, cadence: this }
}
}
Expand Down Expand Up @@ -116,25 +116,18 @@ function call (fn, self, vargs) {
}

Cadence.prototype.rescue = function () {
var steps = [ this.catcher ]
var vargs = [ this.errors[0], this.errors ]
var cadence = new Cadence(this, [], this.self, steps, vargs, done.bind(this))

invoke(cadence)

function done (error) {
if (error) {
this.errors = [ error ]
this.finalize()
} else {
if (vargs !== cadence.vargs) {
this.vargs = cadence.vargs.slice(1)
}
this.errors = new Array
this.catcher = null
invoke(this)
}
}
var errors = this.errors, catcher = this.catcher
this.errors = new Array
this.results = new Array
this.catcher = null
this.called = 0
this.waiting = true
var callback = this.createCallback()
var steps = [ function () { return catcher.call(this, errors[0], errors) } ]
var rescue = new Cadence(this, [], this.self, steps, this.vargs, callback)
rescue.waiting = true
rescue.cadence = this
invoke(rescue)
}

Cadence.prototype.finalize = function () {
Expand Down Expand Up @@ -162,7 +155,6 @@ function invoke (cadence) {
var vargs, steps = cadence.steps

async.self = cadence.self
async.cadence = cadence

if (cadence.errors.length) {
if (cadence.catcher) {
Expand All @@ -177,7 +169,7 @@ function invoke (cadence) {
vargs = cadence.vargs
if (vargs[0] && vargs[0].loopy === token) {
var label = vargs.shift()
var destination = label.cadence || cadence
var destination = label.cadence || cadence.cadence
var iterator = cadence
while (destination !== iterator) {
iterator.loop = false
Expand All @@ -202,6 +194,7 @@ function invoke (cadence) {
cadence.results = []
cadence.errors = []
cadence.sync = true
cadence.waiting = false

if (cadence.index == steps.length) {
if (cadence.loop) {
Expand Down Expand Up @@ -269,9 +262,7 @@ function invoke (cadence) {

function execute (self, steps, vargs) {
var callback = vargs.pop()

var cadence = new Cadence(null, [], self, steps, vargs, callback)

invoke(cadence)
}

Expand Down Expand Up @@ -463,78 +454,3 @@ async.map = variadic(function (steps) {
}, async)

module.exports = cadence

/*
% node --version
v0.10.40
% node benchmark/increment/call.js
cadence call 1 x 1,764,753 ops/sec ±0.37% (98 runs sampled)
_cadence call 1 x 1,350,581 ops/sec ±0.44% (102 runs sampled)
cadence call 2 x 1,748,642 ops/sec ±0.39% (102 runs sampled)
_cadence call 2 x 1,347,458 ops/sec ±0.47% (100 runs sampled)
cadence call 3 x 1,754,009 ops/sec ±0.31% (102 runs sampled)
_cadence call 3 x 1,352,612 ops/sec ±0.42% (96 runs sampled)
cadence call 4 x 1,747,015 ops/sec ±0.20% (101 runs sampled)
_cadence call 4 x 1,367,807 ops/sec ±0.36% (98 runs sampled)
Fastest is cadence call 1
% node benchmark/increment/async.js
cadence async 1 x 1,626,152 ops/sec ±0.41% (96 runs sampled)
_cadence async 1 x 1,215,039 ops/sec ±0.36% (102 runs sampled)
cadence async 2 x 1,631,000 ops/sec ±0.43% (96 runs sampled)
_cadence async 2 x 1,212,140 ops/sec ±0.37% (101 runs sampled)
cadence async 3 x 1,629,463 ops/sec ±0.23% (99 runs sampled)
_cadence async 3 x 1,206,264 ops/sec ±0.63% (102 runs sampled)
cadence async 4 x 1,645,520 ops/sec ±0.25% (101 runs sampled)
_cadence async 4 x 1,213,301 ops/sec ±0.39% (100 runs sampled)
Fastest is cadence async 4
% node benchmark/increment/loop.js
cadence loop 1 x 217,476 ops/sec ±0.35% (96 runs sampled)
_cadence loop 1 x 195,730 ops/sec ±0.46% (101 runs sampled)
cadence loop 2 x 218,245 ops/sec ±0.32% (101 runs sampled)
_cadence loop 2 x 197,790 ops/sec ±0.42% (103 runs sampled)
cadence loop 3 x 218,682 ops/sec ±0.12% (99 runs sampled)
_cadence loop 3 x 194,955 ops/sec ±0.47% (101 runs sampled)
cadence loop 4 x 218,872 ops/sec ±0.18% (102 runs sampled)
_cadence loop 4 x 198,528 ops/sec ±0.47% (101 runs sampled)
Fastest is cadence loop 4, cadence loop 2, cadence loop 1
% brew switch node 0.12.7
Cleaning /Users/alan/.usr/Cellar/node/0.10.26
Cleaning /Users/alan/.usr/Cellar/node/0.10.36
Cleaning /Users/alan/.usr/Cellar/node/0.10.40
Cleaning /Users/alan/.usr/Cellar/node/0.11.16
Cleaning /Users/alan/.usr/Cellar/node/0.12.4
Cleaning /Users/alan/.usr/Cellar/node/0.12.7
1883 links created for /Users/alan/.usr/Cellar/node/0.12.7
% node benchmark/increment/call.js
cadence call 1 x 2,601,022 ops/sec ±0.56% (99 runs sampled)
_cadence call 1 x 2,560,126 ops/sec ±0.39% (101 runs sampled)
cadence call 2 x 2,649,211 ops/sec ±0.31% (100 runs sampled)
_cadence call 2 x 2,533,003 ops/sec ±0.38% (102 runs sampled)
cadence call 3 x 2,644,500 ops/sec ±0.34% (98 runs sampled)
_cadence call 3 x 2,495,934 ops/sec ±0.28% (103 runs sampled)
cadence call 4 x 2,576,413 ops/sec ±0.19% (102 runs sampled)
_cadence call 4 x 2,471,137 ops/sec ±0.25% (101 runs sampled)
Fastest is cadence call 2, cadence call 3
% node benchmark/increment/async.js
cadence async 1 x 2,021,336 ops/sec ±1.06% (98 runs sampled)
_cadence async 1 x 1,888,628 ops/sec ±0.59% (99 runs sampled)
cadence async 2 x 2,061,477 ops/sec ±0.50% (100 runs sampled)
_cadence async 2 x 1,869,812 ops/sec ±0.49% (93 runs sampled)
cadence async 3 x 2,033,936 ops/sec ±0.22% (95 runs sampled)
_cadence async 3 x 1,837,022 ops/sec ±0.43% (94 runs sampled)
cadence async 4 x 2,030,319 ops/sec ±0.34% (101 runs sampled)
_cadence async 4 x 1,820,590 ops/sec ±0.33% (96 runs sampled)
Fastest is cadence async 2, cadence async 1
% node benchmark/increment/loop.js
cadence loop 1 x 155,653 ops/sec ±1.72% (88 runs sampled)
_cadence loop 1 x 126,941 ops/sec ±1.40% (93 runs sampled)
cadence loop 2 x 106,416 ops/sec ±2.59% (84 runs sampled)
_cadence loop 2 x 100,064 ops/sec ±2.80% (83 runs sampled)
cadence loop 3 x 88,858 ops/sec ±2.03% (85 runs sampled)
_cadence loop 3 x 72,948 ops/sec ±3.30% (79 runs sampled)
cadence loop 4 x 89,439 ops/sec ±1.89% (81 runs sampled)
_cadence loop 4 x 75,494 ops/sec ±1.98% (85 runs sampled)
Fastest is cadence loop 1
*/
11 changes: 11 additions & 0 deletions benchmark/benchmark.sh
@@ -0,0 +1,11 @@
#!/bin/bash

for version in 0.10.40 0.12.7; do
brew switch node $version > /dev/null
echo " % node --version"
node --version
for benchmark in call async loop; do
echo " % node benchmark/increment/$benchmark.js"
node benchmark/increment/$benchmark.js
done
done
8 changes: 4 additions & 4 deletions benchmark/increment/async.js
Expand Up @@ -20,13 +20,13 @@ function fn_ () {

for (var i = 1; i <= 4; i++) {
suite.add({
name: ' cadence async ' + i,
fn: fn
name: '_cadence async ' + i,
fn: fn_
})

suite.add({
name: '_cadence async ' + i,
fn: fn_
name: ' cadence async ' + i,
fn: fn
})
}

Expand Down
13 changes: 6 additions & 7 deletions cadence.js
Expand Up @@ -18,8 +18,7 @@ function Cadence (parent, finalizers, self, steps, vargs, callback) {
this.vargs = vargs
}

Cadence.prototype.resolveCallback = function (result, vargs) {
var error = vargs.shift()
Cadence.prototype.resolveCallback = function (result, error, vargs) {
if (error == null) {
result.vargs = vargs
} else {
Expand All @@ -43,13 +42,13 @@ Cadence.prototype.createCallback = function () {

return callback

function callback () {
function callback (error) {
var I = arguments.length
var vargs = new Array(I)
for (var i = 0; i < I; i++) {
vargs[i] = arguments[i]
var vargs = new Array
for (var i = 1; i < I; i++) {
vargs[i - 1] = arguments[i]
}
self.resolveCallback(result, vargs)
self.resolveCallback(result, error, vargs)

return

Expand Down
64 changes: 64 additions & 0 deletions compare.txt
@@ -0,0 +1,64 @@
% node --version
v0.10.40
% node benchmark/increment/call.js
cadence call 1 x 1,838,075 ops/sec ±0.60% (101 runs sampled)
_cadence call 1 x 1,849,677 ops/sec ±0.30% (102 runs sampled)
cadence call 2 x 1,825,205 ops/sec ±0.53% (101 runs sampled)
_cadence call 2 x 1,867,207 ops/sec ±0.23% (102 runs sampled)
cadence call 3 x 1,837,839 ops/sec ±0.28% (102 runs sampled)
_cadence call 3 x 1,848,716 ops/sec ±0.24% (101 runs sampled)
cadence call 4 x 1,830,340 ops/sec ±0.41% (101 runs sampled)
_cadence call 4 x 1,870,529 ops/sec ±0.34% (102 runs sampled)
Fastest is _cadence call 4,_cadence call 2
% node benchmark/increment/async.js
_cadence async 1 x 1,606,480 ops/sec ±0.34% (90 runs sampled)
cadence async 1 x 1,721,182 ops/sec ±0.23% (99 runs sampled)
_cadence async 2 x 1,627,713 ops/sec ±0.41% (96 runs sampled)
cadence async 2 x 1,721,044 ops/sec ±0.31% (101 runs sampled)
_cadence async 3 x 1,623,560 ops/sec ±0.22% (100 runs sampled)
cadence async 3 x 1,734,751 ops/sec ±0.39% (98 runs sampled)
_cadence async 4 x 1,615,921 ops/sec ±0.40% (103 runs sampled)
cadence async 4 x 1,730,583 ops/sec ±0.22% (101 runs sampled)
Fastest is cadence async 3, cadence async 4
% node benchmark/increment/loop.js
cadence loop 1 x 233,014 ops/sec ±0.46% (98 runs sampled)
_cadence loop 1 x 216,037 ops/sec ±0.41% (102 runs sampled)
cadence loop 2 x 234,834 ops/sec ±0.29% (97 runs sampled)
_cadence loop 2 x 216,233 ops/sec ±0.25% (99 runs sampled)
cadence loop 3 x 234,053 ops/sec ±0.22% (103 runs sampled)
_cadence loop 3 x 216,140 ops/sec ±0.35% (100 runs sampled)
cadence loop 4 x 233,960 ops/sec ±0.36% (101 runs sampled)
_cadence loop 4 x 215,753 ops/sec ±0.23% (100 runs sampled)
Fastest is cadence loop 2, cadence loop 1
% node --version
v0.12.7
% node benchmark/increment/call.js
cadence call 1 x 2,622,146 ops/sec ±0.34% (101 runs sampled)
_cadence call 1 x 2,665,640 ops/sec ±0.29% (99 runs sampled)
cadence call 2 x 2,646,208 ops/sec ±0.40% (101 runs sampled)
_cadence call 2 x 2,639,650 ops/sec ±0.42% (99 runs sampled)
cadence call 3 x 2,567,764 ops/sec ±0.27% (101 runs sampled)
_cadence call 3 x 2,585,552 ops/sec ±0.28% (99 runs sampled)
cadence call 4 x 2,544,657 ops/sec ±0.15% (102 runs sampled)
_cadence call 4 x 2,556,245 ops/sec ±0.19% (96 runs sampled)
Fastest is _cadence call 1
% node benchmark/increment/async.js
_cadence async 1 x 2,030,316 ops/sec ±0.37% (98 runs sampled)
cadence async 1 x 2,081,075 ops/sec ±0.52% (98 runs sampled)
_cadence async 2 x 2,097,275 ops/sec ±0.48% (97 runs sampled)
cadence async 2 x 2,081,436 ops/sec ±0.36% (96 runs sampled)
_cadence async 3 x 2,090,961 ops/sec ±0.19% (101 runs sampled)
cadence async 3 x 1,984,030 ops/sec ±1.19% (94 runs sampled)
_cadence async 4 x 2,063,318 ops/sec ±0.45% (103 runs sampled)
cadence async 4 x 2,018,349 ops/sec ±0.34% (97 runs sampled)
Fastest is _cadence async 2
% node benchmark/increment/loop.js
cadence loop 1 x 151,737 ops/sec ±1.69% (86 runs sampled)
_cadence loop 1 x 128,954 ops/sec ±1.22% (94 runs sampled)
cadence loop 2 x 103,879 ops/sec ±1.72% (85 runs sampled)
_cadence loop 2 x 102,157 ops/sec ±2.86% (88 runs sampled)
cadence loop 3 x 83,823 ops/sec ±2.23% (84 runs sampled)
_cadence loop 3 x 75,097 ops/sec ±2.29% (80 runs sampled)
cadence loop 4 x 82,483 ops/sec ±3.69% (84 runs sampled)
_cadence loop 4 x 76,567 ops/sec ±2.24% (80 runs sampled)
Fastest is cadence loop 1

0 comments on commit 1ee894f

Please sign in to comment.