Skip to content

Commit 5a7e4db

Browse files
committed
version bump 1.0.1: bstr performance
The buffer fallback is incredibly slow
1 parent e233fbd commit 5a7e4db

16 files changed

+94
-317
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ test_files/*.py
33
test_files/*.js
44
test_files/baseline*
55
misc/coverage.html
6+
ctest/sauce*

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ clean: clean-baseline ## Remove targets and build artifacts
3232

3333
.PHONY: test mocha
3434
test mocha: test.js $(TARGET) baseline ## Run test suite
35-
mocha -R spec -t 20000
35+
mocha -R spec -t 30000
3636

3737
.PHONY: ctest
3838
ctest: ## Build browser test (into ctest/ subdirectory)

bits/01_version.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
CRC32.version = '1.0.0';
1+
CRC32.version = '1.0.1';

bits/40_crc.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
/*# charCodeAt is the best approach for binary strings */
2-
/*global Buffer */
3-
var use_buffer = typeof Buffer !== 'undefined';
42
function crc32_bstr(bstr/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
5-
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
63
var C = seed/*:: ? 0 : 0 */ ^ -1, L = bstr.length - 1;
74
for(var i = 0; i < L;) {
85
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
@@ -41,7 +38,7 @@ function crc32_buf_8(buf/*:ABuf*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
4138
return C ^ -1;
4239
}
4340

44-
/*# much much faster to intertwine utf8 and C */
41+
/*# much much faster to intertwine utf8 and crc */
4542
function crc32_str(str/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
4643
var C = seed/*:: ? 0 : 0 */ ^ -1;
4744
for(var i = 0, L=str.length, c, d; i < L;) {

crc32.flow.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var CRC32;
2323
}
2424
/*jshint ignore:end */
2525
}(function(CRC32) {
26-
CRC32.version = '1.0.0';
26+
CRC32.version = '1.0.1';
2727
/*::
2828
type CRC32Type = number;
2929
type ABuf = Array<number> | Buffer;
@@ -52,10 +52,7 @@ function signed_crc_table()/*:CRC32TableType*/ {
5252

5353
var T = signed_crc_table();
5454
/*# charCodeAt is the best approach for binary strings */
55-
/*global Buffer */
56-
var use_buffer = typeof Buffer !== 'undefined';
5755
function crc32_bstr(bstr/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
58-
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
5956
var C = seed/*:: ? 0 : 0 */ ^ -1, L = bstr.length - 1;
6057
for(var i = 0; i < L;) {
6158
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
@@ -94,7 +91,7 @@ function crc32_buf_8(buf/*:ABuf*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
9491
return C ^ -1;
9592
}
9693

97-
/*# much much faster to intertwine utf8 and C */
94+
/*# much much faster to intertwine utf8 and crc */
9895
function crc32_str(str/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
9996
var C = seed/*:: ? 0 : 0 */ ^ -1;
10097
for(var i = 0, L=str.length, c, d; i < L;) {

crc32.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var CRC32;
2121
}
2222
/*jshint ignore:end */
2323
}(function(CRC32) {
24-
CRC32.version = '1.0.0';
24+
CRC32.version = '1.0.1';
2525
/* see perf/crc32table.js */
2626
/*global Int32Array */
2727
function signed_crc_table() {
@@ -44,10 +44,7 @@ function signed_crc_table() {
4444
}
4545

4646
var T = signed_crc_table();
47-
/*global Buffer */
48-
var use_buffer = typeof Buffer !== 'undefined';
4947
function crc32_bstr(bstr, seed) {
50-
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
5148
var C = seed ^ -1, L = bstr.length - 1;
5249
for(var i = 0; i < L;) {
5350
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];

ctest/crc32.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var CRC32;
2121
}
2222
/*jshint ignore:end */
2323
}(function(CRC32) {
24-
CRC32.version = '1.0.0';
24+
CRC32.version = '1.0.1';
2525
/* see perf/crc32table.js */
2626
/*global Int32Array */
2727
function signed_crc_table() {
@@ -44,10 +44,7 @@ function signed_crc_table() {
4444
}
4545

4646
var T = signed_crc_table();
47-
/*global Buffer */
48-
var use_buffer = typeof Buffer !== 'undefined';
4947
function crc32_bstr(bstr, seed) {
50-
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
5148
var C = seed ^ -1, L = bstr.length - 1;
5249
for(var i = 0; i < L;) {
5350
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];

ctest/fixtures.js

+11-126
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
var o = "foo bar baz٪☃🍣";
22
var m = "foobar"; for(var i = 0; i != 11; ++i) m+=m;
3+
var m1 = m + m, m2 = m1 + m1, m3 = m2 + m2, m4 = m3 + m3;
4+
var M1 = m + "𝑹" + m, M2 = M1 + "𝐀" + M1, M3 = M2 + "𝓜" + M2, M4 = M3 + "𝙖" + M3;
35
var bits = [
46
[ "foobar", -1628037227, 1 ],
57
[ "foo bar baz", -228401567, 1 ],
68
[ "foo bar baz٪", 984445192 ],
79
[ "foo bar baz٪☃", 140429620],
810
[ m, 40270464, 1 ],
9-
[ o, 1531648243],
11+
[ m1, -239917269, 1],
12+
[ m2, 2048324365, 1 ],
13+
[ m3, -1695517393, 1 ],
14+
[ m4, 1625284864, 1 ],
15+
[ M1, 642113519 ],
16+
[ M2, -1441250016 ],
17+
[ M3, -1101021992 ],
18+
[ M4, -1610723860 ],
19+
[ o, 1531648243 ],
1020
[ o+o, -218791105 ],
1121
[ o+o+o, 1834240887 ]
1222
];
@@ -35,131 +45,6 @@ declare module 'printj' {
3545
declare function sprintf(fmt:string, ...args:any):string;
3646
};
3747
*/
38-
/* vim: set ts=2: */
39-
if(typeof require !== 'undefined') {
40-
var js_crc32 = require('../');
41-
var js_crc32_old = require('crc-32');
42-
var buffer_crc32 = require('./buffer-crc32');
43-
var crc32 = require('./crc32');
44-
var node_crc = require('./node-crc');
45-
46-
function z1(bstr) { return js_crc32.bstr(bstr); }
47-
function z2(bstr) { return buffer_crc32.signed(bstr); }
48-
function z3(bstr) { return crc32(bstr); }
49-
function z4(bstr) { return node_crc.crc32(bstr)|0;}
50-
function z5(bstr) { return js_crc32_old.bstr(bstr); }
51-
52-
function b1(buf) { return js_crc32.buf(buf); }
53-
function b2(buf) { return buffer_crc32.signed(buf); }
54-
function b3(buf) { return crc32(buf); }
55-
function b4(buf) { return node_crc.crc32(buf)|0; }
56-
function b5(buf) { return js_crc32_old.buf(buf); }
57-
58-
function u1(str) { return js_crc32.str(str); }
59-
function u2(str) { return buffer_crc32.signed(str); }
60-
function u3(str) { return js_crc32_old.str(str); }
61-
62-
var ntests, len_max, do_bstr, do_buf, do_ustr;
63-
switch(process.env.MODE) {
64-
case "A": ntests = 100000; len_max = 256; break;
65-
case "B": ntests = 10000; len_max = 1024; break;
66-
case "C": ntests = 10000; len_max = 4096; break;
67-
case "D": ntests = 1000; len_max = 16384; break;
68-
case "E": ntests = 1000; len_max = 65536; break;
69-
case "F": ntests = 100; len_max = 262144; break;
70-
case "G": ntests = 100; len_max = 1048576; break;
71-
case "H": ntests = 10; len_max = 4194304; break;
72-
case "I": ntests = 10; len_max = 16777216; break;
73-
default: ntests = 10000; len_max = 1024; break;
74-
}
75-
76-
if(process.argv === 2) do_bstr = do_buf = do_ustr = true;
77-
else {
78-
do_bstr = process.argv[2].indexOf("S") > -1;
79-
do_buf = process.argv[2].indexOf("B") > -1;
80-
do_ustr = process.argv[2].indexOf("U") > -1;
81-
if(!do_bstr && !do_buf && !do_ustr) do_bstr = do_buf = do_ustr = true;
82-
}
83-
84-
var btest = !!do_bstr || !!do_buf, utest = !!do_ustr;
85-
86-
var bstr_tests = [];
87-
var ustr_tests = [];
88-
var len_min = 1;
89-
90-
var corpus = new Array(0x0800);
91-
for(var k = 0; k < 0x0800; ++k) corpus[k] = String.fromCharCode(k)
92-
len_max --;
93-
94-
k = (Math.random()*0x800)|0;
95-
for(var i = 0; i < ntests; ++i) {
96-
var l = (Math.random() * (len_max - len_min))|0 + len_min;
97-
var s = new Array(l), t = new Array(l);
98-
if(btest) for(var j = 0; j < l; ++j) s[j] = corpus[(i+j+k)&127];
99-
if(utest) for(var j = 0; j < l; ++j) t[j] = corpus[(i+j+k)&0x7FF];
100-
var ss = s.join("");
101-
bstr_tests[i] = [ss, new Buffer(ss)];
102-
ustr_tests[i] = t.join("");
103-
}
104-
105-
var assert = require('assert');
106-
function fix(str) { return parseInt(str, 16)|0; }
107-
if(btest) for(var j = 0; j != ntests; ++j) {
108-
if(do_bstr && do_buf) assert.equal(z1(bstr_tests[j][0]), b1(bstr_tests[j][1]));
109-
110-
if(do_bstr) {
111-
assert.equal(z1(bstr_tests[j][0]), z2(bstr_tests[j][0]));
112-
assert.equal(z1(bstr_tests[j][0]), fix(z3(bstr_tests[j][0])));
113-
assert.equal(z1(bstr_tests[j][0]), (z4(bstr_tests[j][0])));
114-
assert.equal(z1(bstr_tests[j][0]), z5(bstr_tests[j][0]));
115-
}
116-
117-
if(do_buf) {
118-
assert.equal(b1(bstr_tests[j][1]), b2(bstr_tests[j][1]));
119-
assert.equal(b1(bstr_tests[j][1]), fix(b3(bstr_tests[j][1])));
120-
assert.equal(b1(bstr_tests[j][1]), (b4(bstr_tests[j][1])));
121-
assert.equal(b1(bstr_tests[j][1]), b5(bstr_tests[j][1]));
122-
}
123-
}
124-
if(utest) for(var j = 0; j != ntests; ++j) {
125-
assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j]));
126-
assert.equal(u1(ustr_tests[j]), u3(ustr_tests[j]));
127-
}
128-
129-
var BM = require('../perf/bm');
130-
131-
if(do_bstr) {
132-
var suite = new BM('binary string (' + len_max + ')');
133-
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) z1(bstr_tests[j][0]); });
134-
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) z5(bstr_tests[j][0]); });
135-
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) z2(bstr_tests[j][0]); });
136-
if(len_max < 4096) {
137-
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) z3(bstr_tests[j][0]); });
138-
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) z4(bstr_tests[j][0]); });
139-
}
140-
suite.run();
141-
}
142-
143-
if(do_buf) {
144-
suite = new BM('buffer (' + len_max + ')');
145-
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) b1(bstr_tests[j][1]); });
146-
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) b5(bstr_tests[j][1]); });
147-
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) b2(bstr_tests[j][1]); });
148-
if(len_max < 1024) {
149-
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) b3(bstr_tests[j][1]); });
150-
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) b4(bstr_tests[j][1]); });
151-
}
152-
suite.run();
153-
}
154-
155-
if(do_ustr) {
156-
var suite = new BM('unicode string (' + len_max + ')');
157-
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) u1(ustr_tests[j]); });
158-
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) u3(ustr_tests[j]); });
159-
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); });
160-
suite.run();
161-
}
162-
}
16348
crc32table = [
16449
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
16550
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,

ctest/test.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ describe('crc32 bits', function() {
3636
var msg = i[0], l = i[0].length, L = i[1]|0;
3737
if(l > 20) msg = i[0].substr(0,5) + "...(" + l + ")..." + i[0].substr(-5);
3838
if(l > 100 && msieversion() < 9) return;
39+
if(l > 20000 && typeof Buffer === 'undefined') return;
3940
it(msg, function() {
4041
if(i[2] === 1) assert.equal(X.bstr(i[0]), L);
4142
assert.equal(X.str(i[0]), i[1]|0);
4243
if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), L);
43-
for(var x = 0; x < i[0].length; ++x) {
44+
var len = i[0].length, step = len < 20000 ? 1 : len < 50000 ? Math.ceil(len / 20000) : Math.ceil(len / 2000);
45+
for(var x = 0; x < len; x += step) {
4446
if(i[0].charCodeAt(x) >= 0xD800 && i[0].charCodeAt(x) < 0xE000) continue;
4547
if(i[2] === 1) {
4648
var bstrcrc = X.bstr(i[0].substr(x), X.bstr(i[0].substr(0, x)));

misc/bits.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
var o = "foo bar baz٪☃🍣";
22
var m = "foobar"; for(var i = 0; i != 11; ++i) m+=m;
3+
var m1 = m + m, m2 = m1 + m1, m3 = m2 + m2, m4 = m3 + m3;
4+
var M1 = m + "𝑹" + m, M2 = M1 + "𝐀" + M1, M3 = M2 + "𝓜" + M2, M4 = M3 + "𝙖" + M3;
35
var bits = [
46
[ "foobar", -1628037227, 1 ],
57
[ "foo bar baz", -228401567, 1 ],
68
[ "foo bar baz٪", 984445192 ],
79
[ "foo bar baz٪☃", 140429620],
810
[ m, 40270464, 1 ],
9-
[ o, 1531648243],
11+
[ m1, -239917269, 1],
12+
[ m2, 2048324365, 1 ],
13+
[ m3, -1695517393, 1 ],
14+
[ m4, 1625284864, 1 ],
15+
[ M1, 642113519 ],
16+
[ M2, -1441250016 ],
17+
[ M3, -1101021992 ],
18+
[ M4, -1610723860 ],
19+
[ o, 1531648243 ],
1020
[ o+o, -218791105 ],
1121
[ o+o+o, 1834240887 ]
1222
];

0 commit comments

Comments
 (0)