summaryrefslogtreecommitdiff
path: root/big-integer/benchmark/tests.js
diff options
context:
space:
mode:
Diffstat (limited to 'big-integer/benchmark/tests.js')
-rw-r--r--big-integer/benchmark/tests.js192
1 files changed, 192 insertions, 0 deletions
diff --git a/big-integer/benchmark/tests.js b/big-integer/benchmark/tests.js
new file mode 100644
index 0000000..e3395b5
--- /dev/null
+++ b/big-integer/benchmark/tests.js
@@ -0,0 +1,192 @@
+var libraries = (function () {
+ var a = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
+ b = "1234567890234567890134567890124567890123567890123467890123457890123456890123456790123456780123456789",
+ c = "98109840984098409156481068456541684065964819841065106865710397464513210416435401645030648036034063974065004951094209420942097421970490274195049120974210974209742190274092740492097420929892490974202241",
+ d = c + c + c + c + c + c + c + c + c + c,
+ e = d + d + d + d + d + d + d + d + d + d,
+ f = e + e + e,
+ c2 = a + b,
+ d2 = c2 + c2 + c2 + c2 + c2 + c2 + c2 + c2 + c2 + c2,
+ e2 = d2 + d2 + d2 + d2 + d2 + d2 + d2 + d2 + d2 + d2,
+ f2 = e2 + e2 + e2,
+ s1 = 12345,
+ s2 = 98765,
+ s3 = 5437654,
+ _5 = 5,
+ _22 = 22,
+ _23 = 23;
+ var vars = { a: a, b: b, c: c, d: d, e: e, f: f, c2: c2, d2: d2, e2: e2, f2: f2, s1: s1, s2: s2, s3: s3, _5: _5, _22: _22, _23: _23 };
+
+ var createInitialization = function (fName, radix) {
+ var str = "";
+ radix = radix || "";
+ for (var i in vars) {
+ str += i + "=" + fName + "('" + vars[i] + "'" + radix + ");" + i + "_str='" + vars[i] + "';";
+ }
+ return str;
+ };
+
+ var createOnCycle = function (f) {
+ var str = "";
+ for (var i in vars) {
+ str += f(i) + ";";
+ }
+ return str;
+ };
+
+ var tests = {
+ "Addition: large1 + large2": "a.add(b)",
+ "Addition: large + small": "a.add(s1)",
+ "Addition: small + large": "s1.add(a)",
+ "Addition: small1 + small2": "s1.add(s2)",
+ "Addition: 200 digits": "c.add(c2)",
+ "Addition: 2,000 digits": "d.add(d2)",
+ "Addition: 20,000 digits": "e.add(e2)",
+ "Addition: 60,000 digits": "f.add(f2)",
+ "Subtraction: large1 - large2": "b.minus(a)",
+ "Subtraction: large - small": "b.minus(s1)",
+ "Subtraction: small - large": "s1.minus(b)",
+ "Subtraction: small - small": "s2.minus(s1)",
+ "Subtraction: 200 digits": "c.minus(c2)",
+ "Subtraction: 2,000 digits": "d.minus(d2)",
+ "Subtraction: 20,000 digits": "e.minus(e2)",
+ "Subtraction: 60,000 digits": "f.minus(f2)",
+ "Multiplication: large * large": "a.times(b)",
+ "Multiplication: large * small": "a.times(s1)",
+ "Multiplication: small * large": "s1.times(a)",
+ "Multiplication: small1 * small2": "s1.times(s2)",
+ "Multiplication: 400 digits": "c.times(b)",
+ "Multiplication: 2,200 digits": "d.times(c)",
+ "Multiplication: 22,000 digits": "e.times(d)",
+ "Multiplication: 82,000 digits": "f.times(e)",
+ "Squaring: small": "s1.square()",
+ "Squaring: 200 digits": "a.square()",
+ "Squaring: 400 digits": "c.square()",
+ "Squaring: 4,000 digits": "d.square()",
+ "Squaring: 40,000 digits": "e.square()",
+ "Division: large1 / large2": "b.over(a)",
+ "Division: large / small": "a.over(s1)",
+ "Division: small / large": "s2.over(b)",
+ "Division: small / small": "s2.over(s1)",
+ "Division: 200 digits": "c.over(b)",
+ "Division: 2,000 digits": "d.over(c)",
+ "Division: 20,000 digits": "e.over(d)",
+ "Division: 60,000 digits": "f.over(e)",
+ "Exponentiation: 5 ^ 22": "_5.pow(_22)",
+ "Exponentiation: 5 ^ 23": "_5.pow(_23)",
+ "Exponentiation: 5 ^ 12345": "_5.pow(s1)",
+ "Exponentiation: 12345 ^ 12345": "s1.pow(s1)",
+ "parseInt: 5 decimal digits": "parseInt(s1_str, 10)",
+ "parseInt: 100 decimal digits": "parseInt(a_str, 10)",
+ "parseInt: 2,000 decimal digits": "parseInt(d_str, 10)",
+ "parseInt: 20,000 decimal digits": "parseInt(e_str, 10)",
+ "parseInt: 5 hex digits": "parseInt(s1_str, 16)",
+ "parseInt: 83 hex digits": "parseInt(a_str, 16)",
+ "parseInt: 1,661 hex digits": "parseInt(d_str, 16)",
+ "parseInt: 16,610 hex digits": "parseInt(e_str, 16)",
+ "toString: 5 decimal digits": "s1.toString(10)",
+ "toString: 100 decimal digits": "a.toString(10)",
+ "toString: 2,000 decimal digits": "d.toString(10)",
+ "toString: 20,000 decimal digits": "e.toString(10)",
+ "toString: 5 hex digits": "s2.toString(16)",
+ "toString: 83 hex digits": "a.toString(16)",
+ "toString: 1,661 hex digits": "d.toString(16)",
+ "toString: 16,610 hex digits": "e.toString(16)"
+ };
+
+ function generateTests(transformation, skip) {
+ skip = skip || [];
+ var t = {};
+ for (var i in tests) {
+ if (skip.indexOf(i.split(":")[0]) > -1) continue;
+ t[i] = transformation(tests[i]);
+ };
+ return t;
+ }
+
+ var libraries = {
+ "Peter Olson BigInteger.js": {
+ url: ["../BigInteger.js"],
+ projectURL: "https://github.com/peterolson/BigInteger.js",
+ onStart: createInitialization("bigInt"),
+ tests: generateTests(function (x) { return x.replace("parseInt", "bigInt"); })
+ },
+ "Yaffle BigInteger": {
+ url: ["https://rawgit.com/Yaffle/BigInteger/gh-pages/BigInteger.js"],
+ projectURL: "https://github.com/Yaffle/BigInteger",
+ onStart: createInitialization("BigInteger.parseInt"),
+ tests: generateTests(function (x) {
+ return x
+ .replace(/([_a-zA-Z0-9]+)\.add\(([_a-zA-Z0-9]+)\)/g, "BigInteger.add($1, $2)")
+ .replace(/([_a-zA-Z0-9]+)\.minus\(([_a-zA-Z0-9]+)\)/g, "BigInteger.subtract($1, $2)")
+ .replace(/([_a-zA-Z0-9]+)\.times\(([_a-zA-Z0-9]+)\)/g, "BigInteger.multiply($1, $2)")
+ .replace(/([_a-zA-Z0-9]+)\.over\(([_a-zA-Z0-9]+)\)/g, "BigInteger.divide($1, $2)")
+ .replace(/([_a-zA-Z0-9]+)\.square\(\)/g, "BigInteger.multiply($1, $1)")
+ .replace(/([_a-zA-Z0-9]+)\.toString\(([_a-zA-Z0-9]+)\)/g, "($1).toString($2)")
+ .replace("parseInt", "BigInteger.parseInt");
+ }, ["Exponentiation"])
+ },
+ "Silent Matt BigInteger": {
+ url: ["https://rawgit.com/silentmatt/javascript-biginteger/master/biginteger.js"],
+ projectURL: "http://silentmatt.com/biginteger/",
+ onStart: createInitialization("BigInteger.parse"),
+ tests: generateTests(function (x) {
+ return x.replace(/\.minus/g, ".subtract")
+ .replace(/\.times/g, ".multiply")
+ .replace(/\.over/g, ".divide")
+ .replace("parseInt", "BigInteger.parse");
+ })
+ },
+ "Tom Wu jsbn": {
+ url: ["http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js", "http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js"],
+ projectURL: "http://www-cs-students.stanford.edu/~tjw/jsbn/",
+ onStart: createInitialization("new BigInteger"),
+ tests: generateTests(function (x) {
+ return x.replace(/\.minus/g, ".subtract")
+ .replace(/\.times/g, ".multiply")
+ .replace(/\.over/g, ".divide")
+ .replace("parseInt", "new BigInteger");
+ })
+ },
+ "Fedor Indutny bn.js": {
+ url: ["https://rawgit.com/indutny/bn.js/master/lib/bn.js"],
+ projectURL: "https://github.com/indutny/bn.js",
+ onStart: createInitialization("new BN"),
+ tests: generateTests(function (x) {
+ return x.replace(/\.minus/g, ".sub")
+ .replace(/\.times/g, ".mul")
+ .replace(/(.+)\.square\(\)/g, "$1.mul($1)")
+ .replace(/\.over/g, ".div")
+ .replace("parseInt", "new BN");
+ }, ["Exponentiation"])
+ },
+ "MikeMcl bignumber.js": {
+ url: ["https://rawgit.com/MikeMcl/bignumber.js/master/bignumber.min.js"],
+ projectURL: "http://mikemcl.github.io/bignumber.js/",
+ onStart: createInitialization("new BigNumber") + "BigNumber.config({POW_PRECISION: 0});",
+ tests: generateTests(function (x) {
+ return x.replace(/\.over/g, ".div")
+ .replace(/(.+)\.square\(\)/g, "$1.times($1)")
+ .replace("parseInt", "new BigNumber");
+ })
+ }/*, // Leemon Baird library link is broken
+ "Leemon Baird BigInt.js": {
+ url: ["http://www.leemon.com/crypto/BigInt.js"],
+ projectURL: "http://www.leemon.com/crypto/BigInt.html",
+ onStart: createInitialization("str2bigInt", ",10"),
+ onCycle: createOnCycle(function (v) {
+ return v + "=" + v + ".concat()";
+ }),
+ tests: generateTests(function(x) {
+ return x.replace(/(\w+)\.add\(([^\)]*)\)/g, "add($1, $2)")
+ .replace(/(\w+)\.minus\(([^\)]*)\)/g, "sub($1, $2)")
+ .replace(/(\w+)\.times\(([^\)]*)\)/g, "mult($1, $2)")
+ .replace(/(\w+)\.over\(([^\)]*)\)/g, "divInt_($1, $2)")
+ .replace(/(\w+)\.square\(([^\)]*)\)/g, "mult($1, $1)")
+ .replace("parseInt", "str2bigInt")
+ .replace(/(\w+)\.toString\(([^\)]*)\)/g, "bigInt2str($1, $2)")
+ }, ["Exponentiation"])
+ }*/
+ };
+ return libraries;
+})();