version bump 1.0.1: bstr performance
The buffer fallback is incredibly slow
This commit is contained in:
parent
e233fbd509
commit
5a7e4db973
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@ test_files/*.py
|
||||
test_files/*.js
|
||||
test_files/baseline*
|
||||
misc/coverage.html
|
||||
ctest/sauce*
|
||||
|
2
Makefile
2
Makefile
@ -32,7 +32,7 @@ clean: clean-baseline ## Remove targets and build artifacts
|
||||
|
||||
.PHONY: test mocha
|
||||
test mocha: test.js $(TARGET) baseline ## Run test suite
|
||||
mocha -R spec -t 20000
|
||||
mocha -R spec -t 30000
|
||||
|
||||
.PHONY: ctest
|
||||
ctest: ## Build browser test (into ctest/ subdirectory)
|
||||
|
@ -1 +1 @@
|
||||
CRC32.version = '1.0.0';
|
||||
CRC32.version = '1.0.1';
|
||||
|
@ -1,8 +1,5 @@
|
||||
/*# charCodeAt is the best approach for binary strings */
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
|
||||
var C = seed/*:: ? 0 : 0 */ ^ -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
@ -41,7 +38,7 @@ function crc32_buf_8(buf/*:ABuf*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
/*# much much faster to intertwine utf8 and C */
|
||||
/*# much much faster to intertwine utf8 and crc */
|
||||
function crc32_str(str/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
var C = seed/*:: ? 0 : 0 */ ^ -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
|
@ -23,7 +23,7 @@ var CRC32;
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '1.0.0';
|
||||
CRC32.version = '1.0.1';
|
||||
/*::
|
||||
type CRC32Type = number;
|
||||
type ABuf = Array<number> | Buffer;
|
||||
@ -52,10 +52,7 @@ function signed_crc_table()/*:CRC32TableType*/ {
|
||||
|
||||
var T = signed_crc_table();
|
||||
/*# charCodeAt is the best approach for binary strings */
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
|
||||
var C = seed/*:: ? 0 : 0 */ ^ -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
@ -94,7 +91,7 @@ function crc32_buf_8(buf/*:ABuf*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
/*# much much faster to intertwine utf8 and C */
|
||||
/*# much much faster to intertwine utf8 and crc */
|
||||
function crc32_str(str/*:string*/, seed/*:?CRC32Type*/)/*:CRC32Type*/ {
|
||||
var C = seed/*:: ? 0 : 0 */ ^ -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
|
5
crc32.js
5
crc32.js
@ -21,7 +21,7 @@ var CRC32;
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '1.0.0';
|
||||
CRC32.version = '1.0.1';
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table() {
|
||||
@ -44,10 +44,7 @@ function signed_crc_table() {
|
||||
}
|
||||
|
||||
var T = signed_crc_table();
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr, seed) {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
|
||||
var C = seed ^ -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
|
@ -21,7 +21,7 @@ var CRC32;
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '1.0.0';
|
||||
CRC32.version = '1.0.1';
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table() {
|
||||
@ -44,10 +44,7 @@ function signed_crc_table() {
|
||||
}
|
||||
|
||||
var T = signed_crc_table();
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr, seed) {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr), seed);
|
||||
var C = seed ^ -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
|
@ -1,12 +1,22 @@
|
||||
var o = "foo bar baz٪☃🍣";
|
||||
var m = "foobar"; for(var i = 0; i != 11; ++i) m+=m;
|
||||
var m1 = m + m, m2 = m1 + m1, m3 = m2 + m2, m4 = m3 + m3;
|
||||
var M1 = m + "𝑹" + m, M2 = M1 + "𝐀" + M1, M3 = M2 + "𝓜" + M2, M4 = M3 + "𝙖" + M3;
|
||||
var bits = [
|
||||
[ "foobar", -1628037227, 1 ],
|
||||
[ "foo bar baz", -228401567, 1 ],
|
||||
[ "foo bar baz٪", 984445192 ],
|
||||
[ "foo bar baz٪☃", 140429620],
|
||||
[ m, 40270464, 1 ],
|
||||
[ o, 1531648243],
|
||||
[ m1, -239917269, 1],
|
||||
[ m2, 2048324365, 1 ],
|
||||
[ m3, -1695517393, 1 ],
|
||||
[ m4, 1625284864, 1 ],
|
||||
[ M1, 642113519 ],
|
||||
[ M2, -1441250016 ],
|
||||
[ M3, -1101021992 ],
|
||||
[ M4, -1610723860 ],
|
||||
[ o, 1531648243 ],
|
||||
[ o+o, -218791105 ],
|
||||
[ o+o+o, 1834240887 ]
|
||||
];
|
||||
@ -35,131 +45,6 @@ declare module 'printj' {
|
||||
declare function sprintf(fmt:string, ...args:any):string;
|
||||
};
|
||||
*/
|
||||
/* vim: set ts=2: */
|
||||
if(typeof require !== 'undefined') {
|
||||
var js_crc32 = require('../');
|
||||
var js_crc32_old = require('crc-32');
|
||||
var buffer_crc32 = require('./buffer-crc32');
|
||||
var crc32 = require('./crc32');
|
||||
var node_crc = require('./node-crc');
|
||||
|
||||
function z1(bstr) { return js_crc32.bstr(bstr); }
|
||||
function z2(bstr) { return buffer_crc32.signed(bstr); }
|
||||
function z3(bstr) { return crc32(bstr); }
|
||||
function z4(bstr) { return node_crc.crc32(bstr)|0;}
|
||||
function z5(bstr) { return js_crc32_old.bstr(bstr); }
|
||||
|
||||
function b1(buf) { return js_crc32.buf(buf); }
|
||||
function b2(buf) { return buffer_crc32.signed(buf); }
|
||||
function b3(buf) { return crc32(buf); }
|
||||
function b4(buf) { return node_crc.crc32(buf)|0; }
|
||||
function b5(buf) { return js_crc32_old.buf(buf); }
|
||||
|
||||
function u1(str) { return js_crc32.str(str); }
|
||||
function u2(str) { return buffer_crc32.signed(str); }
|
||||
function u3(str) { return js_crc32_old.str(str); }
|
||||
|
||||
var ntests, len_max, do_bstr, do_buf, do_ustr;
|
||||
switch(process.env.MODE) {
|
||||
case "A": ntests = 100000; len_max = 256; break;
|
||||
case "B": ntests = 10000; len_max = 1024; break;
|
||||
case "C": ntests = 10000; len_max = 4096; break;
|
||||
case "D": ntests = 1000; len_max = 16384; break;
|
||||
case "E": ntests = 1000; len_max = 65536; break;
|
||||
case "F": ntests = 100; len_max = 262144; break;
|
||||
case "G": ntests = 100; len_max = 1048576; break;
|
||||
case "H": ntests = 10; len_max = 4194304; break;
|
||||
case "I": ntests = 10; len_max = 16777216; break;
|
||||
default: ntests = 10000; len_max = 1024; break;
|
||||
}
|
||||
|
||||
if(process.argv === 2) do_bstr = do_buf = do_ustr = true;
|
||||
else {
|
||||
do_bstr = process.argv[2].indexOf("S") > -1;
|
||||
do_buf = process.argv[2].indexOf("B") > -1;
|
||||
do_ustr = process.argv[2].indexOf("U") > -1;
|
||||
if(!do_bstr && !do_buf && !do_ustr) do_bstr = do_buf = do_ustr = true;
|
||||
}
|
||||
|
||||
var btest = !!do_bstr || !!do_buf, utest = !!do_ustr;
|
||||
|
||||
var bstr_tests = [];
|
||||
var ustr_tests = [];
|
||||
var len_min = 1;
|
||||
|
||||
var corpus = new Array(0x0800);
|
||||
for(var k = 0; k < 0x0800; ++k) corpus[k] = String.fromCharCode(k)
|
||||
len_max --;
|
||||
|
||||
k = (Math.random()*0x800)|0;
|
||||
for(var i = 0; i < ntests; ++i) {
|
||||
var l = (Math.random() * (len_max - len_min))|0 + len_min;
|
||||
var s = new Array(l), t = new Array(l);
|
||||
if(btest) for(var j = 0; j < l; ++j) s[j] = corpus[(i+j+k)&127];
|
||||
if(utest) for(var j = 0; j < l; ++j) t[j] = corpus[(i+j+k)&0x7FF];
|
||||
var ss = s.join("");
|
||||
bstr_tests[i] = [ss, new Buffer(ss)];
|
||||
ustr_tests[i] = t.join("");
|
||||
}
|
||||
|
||||
var assert = require('assert');
|
||||
function fix(str) { return parseInt(str, 16)|0; }
|
||||
if(btest) for(var j = 0; j != ntests; ++j) {
|
||||
if(do_bstr && do_buf) assert.equal(z1(bstr_tests[j][0]), b1(bstr_tests[j][1]));
|
||||
|
||||
if(do_bstr) {
|
||||
assert.equal(z1(bstr_tests[j][0]), z2(bstr_tests[j][0]));
|
||||
assert.equal(z1(bstr_tests[j][0]), fix(z3(bstr_tests[j][0])));
|
||||
assert.equal(z1(bstr_tests[j][0]), (z4(bstr_tests[j][0])));
|
||||
assert.equal(z1(bstr_tests[j][0]), z5(bstr_tests[j][0]));
|
||||
}
|
||||
|
||||
if(do_buf) {
|
||||
assert.equal(b1(bstr_tests[j][1]), b2(bstr_tests[j][1]));
|
||||
assert.equal(b1(bstr_tests[j][1]), fix(b3(bstr_tests[j][1])));
|
||||
assert.equal(b1(bstr_tests[j][1]), (b4(bstr_tests[j][1])));
|
||||
assert.equal(b1(bstr_tests[j][1]), b5(bstr_tests[j][1]));
|
||||
}
|
||||
}
|
||||
if(utest) for(var j = 0; j != ntests; ++j) {
|
||||
assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j]));
|
||||
assert.equal(u1(ustr_tests[j]), u3(ustr_tests[j]));
|
||||
}
|
||||
|
||||
var BM = require('../perf/bm');
|
||||
|
||||
if(do_bstr) {
|
||||
var suite = new BM('binary string (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) z1(bstr_tests[j][0]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) z5(bstr_tests[j][0]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) z2(bstr_tests[j][0]); });
|
||||
if(len_max < 4096) {
|
||||
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) z3(bstr_tests[j][0]); });
|
||||
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) z4(bstr_tests[j][0]); });
|
||||
}
|
||||
suite.run();
|
||||
}
|
||||
|
||||
if(do_buf) {
|
||||
suite = new BM('buffer (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) b1(bstr_tests[j][1]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) b5(bstr_tests[j][1]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) b2(bstr_tests[j][1]); });
|
||||
if(len_max < 1024) {
|
||||
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) b3(bstr_tests[j][1]); });
|
||||
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) b4(bstr_tests[j][1]); });
|
||||
}
|
||||
suite.run();
|
||||
}
|
||||
|
||||
if(do_ustr) {
|
||||
var suite = new BM('unicode string (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) u1(ustr_tests[j]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) u3(ustr_tests[j]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); });
|
||||
suite.run();
|
||||
}
|
||||
}
|
||||
crc32table = [
|
||||
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
|
||||
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
|
||||
|
@ -36,11 +36,13 @@ describe('crc32 bits', function() {
|
||||
var msg = i[0], l = i[0].length, L = i[1]|0;
|
||||
if(l > 20) msg = i[0].substr(0,5) + "...(" + l + ")..." + i[0].substr(-5);
|
||||
if(l > 100 && msieversion() < 9) return;
|
||||
if(l > 20000 && typeof Buffer === 'undefined') return;
|
||||
it(msg, function() {
|
||||
if(i[2] === 1) assert.equal(X.bstr(i[0]), L);
|
||||
assert.equal(X.str(i[0]), i[1]|0);
|
||||
if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), L);
|
||||
for(var x = 0; x < i[0].length; ++x) {
|
||||
var len = i[0].length, step = len < 20000 ? 1 : len < 50000 ? Math.ceil(len / 20000) : Math.ceil(len / 2000);
|
||||
for(var x = 0; x < len; x += step) {
|
||||
if(i[0].charCodeAt(x) >= 0xD800 && i[0].charCodeAt(x) < 0xE000) continue;
|
||||
if(i[2] === 1) {
|
||||
var bstrcrc = X.bstr(i[0].substr(x), X.bstr(i[0].substr(0, x)));
|
||||
|
12
misc/bits.js
12
misc/bits.js
@ -1,12 +1,22 @@
|
||||
var o = "foo bar baz٪☃🍣";
|
||||
var m = "foobar"; for(var i = 0; i != 11; ++i) m+=m;
|
||||
var m1 = m + m, m2 = m1 + m1, m3 = m2 + m2, m4 = m3 + m3;
|
||||
var M1 = m + "𝑹" + m, M2 = M1 + "𝐀" + M1, M3 = M2 + "𝓜" + M2, M4 = M3 + "𝙖" + M3;
|
||||
var bits = [
|
||||
[ "foobar", -1628037227, 1 ],
|
||||
[ "foo bar baz", -228401567, 1 ],
|
||||
[ "foo bar baz٪", 984445192 ],
|
||||
[ "foo bar baz٪☃", 140429620],
|
||||
[ m, 40270464, 1 ],
|
||||
[ o, 1531648243],
|
||||
[ m1, -239917269, 1],
|
||||
[ m2, 2048324365, 1 ],
|
||||
[ m3, -1695517393, 1 ],
|
||||
[ m4, 1625284864, 1 ],
|
||||
[ M1, 642113519 ],
|
||||
[ M2, -1441250016 ],
|
||||
[ M3, -1101021992 ],
|
||||
[ M4, -1610723860 ],
|
||||
[ o, 1531648243 ],
|
||||
[ o+o, -218791105 ],
|
||||
[ o+o+o, 1834240887 ]
|
||||
];
|
||||
|
@ -1,125 +0,0 @@
|
||||
/* vim: set ts=2: */
|
||||
if(typeof require !== 'undefined') {
|
||||
var js_crc32 = require('../');
|
||||
var js_crc32_old = require('crc-32');
|
||||
var buffer_crc32 = require('./buffer-crc32');
|
||||
var crc32 = require('./crc32');
|
||||
var node_crc = require('./node-crc');
|
||||
|
||||
function z1(bstr) { return js_crc32.bstr(bstr); }
|
||||
function z2(bstr) { return buffer_crc32.signed(bstr); }
|
||||
function z3(bstr) { return crc32(bstr); }
|
||||
function z4(bstr) { return node_crc.crc32(bstr)|0;}
|
||||
function z5(bstr) { return js_crc32_old.bstr(bstr); }
|
||||
|
||||
function b1(buf) { return js_crc32.buf(buf); }
|
||||
function b2(buf) { return buffer_crc32.signed(buf); }
|
||||
function b3(buf) { return crc32(buf); }
|
||||
function b4(buf) { return node_crc.crc32(buf)|0; }
|
||||
function b5(buf) { return js_crc32_old.buf(buf); }
|
||||
|
||||
function u1(str) { return js_crc32.str(str); }
|
||||
function u2(str) { return buffer_crc32.signed(str); }
|
||||
function u3(str) { return js_crc32_old.str(str); }
|
||||
|
||||
var ntests, len_max, do_bstr, do_buf, do_ustr;
|
||||
switch(process.env.MODE) {
|
||||
case "A": ntests = 100000; len_max = 256; break;
|
||||
case "B": ntests = 10000; len_max = 1024; break;
|
||||
case "C": ntests = 10000; len_max = 4096; break;
|
||||
case "D": ntests = 1000; len_max = 16384; break;
|
||||
case "E": ntests = 1000; len_max = 65536; break;
|
||||
case "F": ntests = 100; len_max = 262144; break;
|
||||
case "G": ntests = 100; len_max = 1048576; break;
|
||||
case "H": ntests = 10; len_max = 4194304; break;
|
||||
case "I": ntests = 10; len_max = 16777216; break;
|
||||
default: ntests = 10000; len_max = 1024; break;
|
||||
}
|
||||
|
||||
if(process.argv === 2) do_bstr = do_buf = do_ustr = true;
|
||||
else {
|
||||
do_bstr = process.argv[2].indexOf("S") > -1;
|
||||
do_buf = process.argv[2].indexOf("B") > -1;
|
||||
do_ustr = process.argv[2].indexOf("U") > -1;
|
||||
if(!do_bstr && !do_buf && !do_ustr) do_bstr = do_buf = do_ustr = true;
|
||||
}
|
||||
|
||||
var btest = !!do_bstr || !!do_buf, utest = !!do_ustr;
|
||||
|
||||
var bstr_tests = [];
|
||||
var ustr_tests = [];
|
||||
var len_min = 1;
|
||||
|
||||
var corpus = new Array(0x0800);
|
||||
for(var k = 0; k < 0x0800; ++k) corpus[k] = String.fromCharCode(k)
|
||||
len_max --;
|
||||
|
||||
k = (Math.random()*0x800)|0;
|
||||
for(var i = 0; i < ntests; ++i) {
|
||||
var l = (Math.random() * (len_max - len_min))|0 + len_min;
|
||||
var s = new Array(l), t = new Array(l);
|
||||
if(btest) for(var j = 0; j < l; ++j) s[j] = corpus[(i+j+k)&127];
|
||||
if(utest) for(var j = 0; j < l; ++j) t[j] = corpus[(i+j+k)&0x7FF];
|
||||
var ss = s.join("");
|
||||
bstr_tests[i] = [ss, new Buffer(ss)];
|
||||
ustr_tests[i] = t.join("");
|
||||
}
|
||||
|
||||
var assert = require('assert');
|
||||
function fix(str) { return parseInt(str, 16)|0; }
|
||||
if(btest) for(var j = 0; j != ntests; ++j) {
|
||||
if(do_bstr && do_buf) assert.equal(z1(bstr_tests[j][0]), b1(bstr_tests[j][1]));
|
||||
|
||||
if(do_bstr) {
|
||||
assert.equal(z1(bstr_tests[j][0]), z2(bstr_tests[j][0]));
|
||||
assert.equal(z1(bstr_tests[j][0]), fix(z3(bstr_tests[j][0])));
|
||||
assert.equal(z1(bstr_tests[j][0]), (z4(bstr_tests[j][0])));
|
||||
assert.equal(z1(bstr_tests[j][0]), z5(bstr_tests[j][0]));
|
||||
}
|
||||
|
||||
if(do_buf) {
|
||||
assert.equal(b1(bstr_tests[j][1]), b2(bstr_tests[j][1]));
|
||||
assert.equal(b1(bstr_tests[j][1]), fix(b3(bstr_tests[j][1])));
|
||||
assert.equal(b1(bstr_tests[j][1]), (b4(bstr_tests[j][1])));
|
||||
assert.equal(b1(bstr_tests[j][1]), b5(bstr_tests[j][1]));
|
||||
}
|
||||
}
|
||||
if(utest) for(var j = 0; j != ntests; ++j) {
|
||||
assert.equal(u1(ustr_tests[j]), u2(ustr_tests[j]));
|
||||
assert.equal(u1(ustr_tests[j]), u3(ustr_tests[j]));
|
||||
}
|
||||
|
||||
var BM = require('../perf/bm');
|
||||
|
||||
if(do_bstr) {
|
||||
var suite = new BM('binary string (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) z1(bstr_tests[j][0]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) z5(bstr_tests[j][0]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) z2(bstr_tests[j][0]); });
|
||||
if(len_max < 4096) {
|
||||
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) z3(bstr_tests[j][0]); });
|
||||
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) z4(bstr_tests[j][0]); });
|
||||
}
|
||||
suite.run();
|
||||
}
|
||||
|
||||
if(do_buf) {
|
||||
suite = new BM('buffer (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) b1(bstr_tests[j][1]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) b5(bstr_tests[j][1]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) b2(bstr_tests[j][1]); });
|
||||
if(len_max < 1024) {
|
||||
suite.add('crc32', function() { for(var j = 0; j != ntests; ++j) b3(bstr_tests[j][1]); });
|
||||
suite.add('node_crc', function() { for(var j = 0; j != ntests; ++j) b4(bstr_tests[j][1]); });
|
||||
}
|
||||
suite.run();
|
||||
}
|
||||
|
||||
if(do_ustr) {
|
||||
var suite = new BM('unicode string (' + len_max + ')');
|
||||
suite.add('js-crc32', function() { for(var j = 0; j != ntests; ++j) u1(ustr_tests[j]); });
|
||||
suite.add('js-crc32-old', function() { for(var j = 0; j != ntests; ++j) u3(ustr_tests[j]); });
|
||||
suite.add('buffer-crc32', function() { for(var j = 0; j != ntests; ++j) u2(ustr_tests[j]); });
|
||||
suite.run();
|
||||
}
|
||||
}
|
18
misc/perf.sh
18
misc/perf.sh
@ -1,18 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd misc &>/dev/null
|
||||
|
||||
git_module() {
|
||||
if [ ! -e "$1/" ]; then git clone $2; fi
|
||||
cd "$1"
|
||||
git pull
|
||||
cd - &>/dev/null
|
||||
}
|
||||
|
||||
echo "::: downloading modules"
|
||||
npm install crc-32 2>/dev/null
|
||||
git_module node-crc https://github.com/alexgorbatchev/node-crc 2>/dev/null # crc
|
||||
git_module crc32 https://github.com/beatgammit/crc32 2>/dev/null # crc32
|
||||
git_module buffer-crc32 https://github.com/brianloveswords/buffer-crc32 2>/dev/null # buffer-crc32
|
||||
|
||||
for i in A B C D E F G H I; do MODE="$i" node integration.js "$1"; done
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "crc-32",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"author": "sheetjs",
|
||||
"description": "Pure-JS CRC-32",
|
||||
"keywords": [ "crc32", "checksum", "crc" ],
|
||||
|
50
perf/bstr.js
50
perf/bstr.js
@ -38,6 +38,14 @@ function node_crc32(bstr) {
|
||||
return crcTable(strToArr(bstr));
|
||||
}
|
||||
|
||||
function sheetjsB(bstr) {
|
||||
var b = new Buffer(bstr, 'binary');
|
||||
for(var crc = -1, i = 0; i < b.length; ++i) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ b[i]) & 0xFF];
|
||||
}
|
||||
return crc ^ -1;
|
||||
}
|
||||
|
||||
function sheetjs1(bstr) {
|
||||
for(var crc = -1, i = 0; i < bstr.length; ++i) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];
|
||||
@ -80,30 +88,34 @@ function sheetjs8(bstr) {
|
||||
return crc ^ -1;
|
||||
}
|
||||
|
||||
var w = 2000;
|
||||
var base = new Array(w);
|
||||
for(var i = 0; i !== w; ++i) base[i] = String.fromCharCode((Math.random()*256)&255);
|
||||
var w = 80000;
|
||||
var b = new Array(w);
|
||||
for(var i = 0; i !== w; ++i) b[i] = ""+base.slice(0,i).join("");
|
||||
b[0] = "";
|
||||
for(var i = 1; i !== w; ++i) b[i] = b[i-1] + String.fromCharCode((Math.random()*256)&255);
|
||||
|
||||
|
||||
var assert = require('assert');
|
||||
for(var i = 0; i !== w; ++i) {
|
||||
var foobar = b[i];
|
||||
assert.equal(node_crc32(foobar), sheetjs1(foobar));
|
||||
assert.equal(node_crc32(foobar), sheetjs2(foobar));
|
||||
assert.equal(node_crc32(foobar), sheetjs3(foobar));
|
||||
assert.equal(node_crc32(foobar), sheetjs8(foobar));
|
||||
assert.equal(node_crc32(foobar), old(foobar));
|
||||
assert.equal(node_crc32(foobar), cur(foobar));
|
||||
function check(foobar) {
|
||||
var baseline = old(foobar);
|
||||
assert.equal(baseline, sheetjs1(foobar));
|
||||
assert.equal(baseline, sheetjs2(foobar));
|
||||
assert.equal(baseline, sheetjs3(foobar));
|
||||
assert.equal(baseline, sheetjs8(foobar));
|
||||
assert.equal(baseline, sheetjsB(foobar));
|
||||
assert.equal(baseline, cur(foobar));
|
||||
if(i < 100) assert.equal(baseline, node_crc32(foobar));
|
||||
}
|
||||
|
||||
for(var i = 0; i !== w; ++i) {
|
||||
var foobar = b[i];
|
||||
}
|
||||
var BM = require('./bm');
|
||||
var suite = new BM('binary string');
|
||||
//suite.add('npm crc32', function() { for(var j = 0; j !== w; ++j) node_crc32(b[j]); });
|
||||
suite.add('sheetjs 1', function() { for(var j = 0; j !== w; ++j) sheetjs1(b[j]); });
|
||||
suite.add('sheetjs 2', function() { for(var j = 0; j !== w; ++j) sheetjs2(b[j]); });
|
||||
suite.add('sheetjs 3', function() { for(var j = 0; j !== w; ++j) sheetjs3(b[j]); });
|
||||
suite.add('sheetjs 8', function() { for(var j = 0; j !== w; ++j) sheetjs8(b[j]); });
|
||||
suite.add('last vers', function() { for(var j = 0; j !== w; ++j) old(b[j]); });
|
||||
suite.add('current v', function() { for(var j = 0; j !== w; ++j) cur(b[j]); });
|
||||
suite.add('sheetjs 1', function() { for(var j = 0; j !== w; j+=100) sheetjs1(b[j]); });
|
||||
suite.add('sheetjs 2', function() { for(var j = 0; j !== w; j+=100) sheetjs2(b[j]); });
|
||||
suite.add('sheetjs 3', function() { for(var j = 0; j !== w; j+=100) sheetjs3(b[j]); });
|
||||
suite.add('sheetjs 8', function() { for(var j = 0; j !== w; j+=100) sheetjs8(b[j]); });
|
||||
suite.add('sheetjs B', function() { for(var j = 0; j !== w; j+=100) sheetjsB(b[j]); });
|
||||
suite.add('last vers', function() { for(var j = 0; j !== w; j+=100) old(b[j]); });
|
||||
suite.add('current v', function() { for(var j = 0; j !== w; j+=100) cur(b[j]); });
|
||||
suite.run();
|
||||
|
34
perf/utf8.js
34
perf/utf8.js
@ -38,16 +38,36 @@ var foobar = "foo bar baz٪☃🍣";
|
||||
for(var i = 0; i != 4; ++i) foobar += " " + foobar;
|
||||
|
||||
var assert = require('assert');
|
||||
{
|
||||
assert.equal(sheetjs1(foobar), sheetjs2(foobar));
|
||||
assert.equal(sheetjs1(foobar), old(foobar));
|
||||
assert.equal(sheetjs1(foobar), cur(foobar));
|
||||
function check(foobar) {
|
||||
var baseline = old(foobar);
|
||||
assert.equal(baseline, sheetjs1(foobar));
|
||||
assert.equal(baseline, sheetjs2(foobar));
|
||||
assert.equal(baseline, cur(foobar));
|
||||
}
|
||||
|
||||
var BM = require('./bm');
|
||||
var suite = new BM('unicode string');
|
||||
var suite = new BM('unicode string (' + foobar.length + ')');
|
||||
suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(foobar); });
|
||||
suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(foobar); });
|
||||
suite.add('last vers', function() { for(var j = 0; j != 1000; ++j) old(foobar); });
|
||||
suite.add('current v', function() { for(var j = 0; j != 1000; ++j) cur(foobar); });
|
||||
suite.add('last vers', function() { for(var j = 0; j != 1000; ++j) old(foobar, 0) ; });
|
||||
suite.add('current v', function() { for(var j = 0; j != 1000; ++j) cur(foobar, 0); });
|
||||
suite.run();
|
||||
|
||||
function doit(foobar) {
|
||||
check(foobar);
|
||||
var s = new BM('unicode string (' + foobar.length + ')');
|
||||
s.add('sheetjs 1', function() { sheetjs1(foobar); });
|
||||
s.add('sheetjs 2', function() { sheetjs2(foobar); });
|
||||
s.add('last vers', function() { old(foobar, 0); });
|
||||
s.add('current v', function() { cur(foobar, 0); });
|
||||
s.run();
|
||||
}
|
||||
|
||||
for(var i = 0; i != 4; ++i) foobar += " " + foobar;
|
||||
doit(foobar);
|
||||
|
||||
foobar += " " + foobar;
|
||||
doit(foobar);
|
||||
|
||||
foobar += " " + foobar;
|
||||
doit(foobar);
|
||||
|
4
test.js
4
test.js
@ -36,11 +36,13 @@ describe('crc32 bits', function() {
|
||||
var msg = i[0], l = i[0].length, L = i[1]|0;
|
||||
if(l > 20) msg = i[0].substr(0,5) + "...(" + l + ")..." + i[0].substr(-5);
|
||||
if(l > 100 && msieversion() < 9) return;
|
||||
if(l > 20000 && typeof Buffer === 'undefined') return;
|
||||
it(msg, function() {
|
||||
if(i[2] === 1) assert.equal(X.bstr(i[0]), L);
|
||||
assert.equal(X.str(i[0]), i[1]|0);
|
||||
if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), L);
|
||||
for(var x = 0; x < i[0].length; ++x) {
|
||||
var len = i[0].length, step = len < 20000 ? 1 : len < 50000 ? Math.ceil(len / 20000) : Math.ceil(len / 2000);
|
||||
for(var x = 0; x < len; x += step) {
|
||||
if(i[0].charCodeAt(x) >= 0xD800 && i[0].charCodeAt(x) < 0xE000) continue;
|
||||
if(i[2] === 1) {
|
||||
var bstrcrc = X.bstr(i[0].substr(x), X.bstr(i[0].substr(0, x)));
|
||||
|
Loading…
Reference in New Issue
Block a user