# HG changeset patch # User Jaroslav Tulach # Date 1453642296 -3600 # Node ID 71e5cd5b29bc2a03fed24c03b5c826a08d3d5e20 # Parent 826eb936c9a82abf23440efcd657c8749cd63579 Frequent access to mod32 operation defined on the Number.prototype is slowing things down significanty. diff -r 826eb936c9a8 -r 71e5cd5b29bc benchmarks/sieve/src/test/java/org/apidesign/benchmark/sieve/SieveTest.java --- a/benchmarks/sieve/src/test/java/org/apidesign/benchmark/sieve/SieveTest.java Sun Jan 24 12:08:45 2016 +0100 +++ b/benchmarks/sieve/src/test/java/org/apidesign/benchmark/sieve/SieveTest.java Sun Jan 24 14:31:36 2016 +0100 @@ -40,7 +40,7 @@ public int oneThousand() throws IOException { SieveTest sieve = new SieveTest(); int now = time(); - int res = sieve.compute(1000); + int res = sieve.compute(5000); int took = time() - now; log("oneThousand in " + took + " ms"); return res; @@ -54,5 +54,6 @@ @JavaScriptBody(args = { "msg" }, body = "if (typeof console !== 'undefined') console.log(msg);") @Override protected void log(String msg) { + System.err.println(msg); } } diff -r 826eb936c9a8 -r 71e5cd5b29bc rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Sun Jan 24 12:08:45 2016 +0100 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Sun Jan 24 14:31:36 2016 +0100 @@ -1,5 +1,4 @@ // empty line needed here - (function(numberPrototype) { numberPrototype.add32 = function(x) { return (this + x) | 0; @@ -498,12 +497,11 @@ return (this / x) | 0; } - numberPrototype.mod32 = function(x) { + myNum.mod32 = function(a, x) { if (x === 0) { __handleDivByZero(); } - - return (this % x); + return a % x; } numberPrototype.div64 = function(x) { diff -r 826eb936c9a8 -r 71e5cd5b29bc rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 24 12:08:45 2016 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 24 14:31:36 2016 +0100 @@ -775,8 +775,15 @@ smapper.replace(this, VarType.DOUBLE, "(@1 / @2)", smapper.getD(1), smapper.popD()); break; case opc_irem: - smapper.replace(this, VarType.INTEGER, "(@1).mod32(@2)", +// +// direct check yields few percents +// in case of firefox 5.8s/4.6.s + smapper.replace(this, VarType.INTEGER, "((@1) % (@2))", smapper.getI(1), smapper.popI()); +// with myNum being local variable in the generated script +// it compiles and computes 5000 primes in 6s +// smapper.replace(this, VarType.INTEGER, "myNum.mod32(@1, @2)", +// smapper.getI(1), smapper.popI()); break; case opc_lrem: smapper.replace(this, VarType.LONG, "(@1).mod64(@2)", diff -r 826eb936c9a8 -r 71e5cd5b29bc rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun Jan 24 12:08:45 2016 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun Jan 24 14:31:36 2016 +0100 @@ -459,7 +459,15 @@ @Override protected void generatePrologue() throws IOException { - append("(function VM(global) {var fillInVMSkeleton = function(vm) {"); + append("(function VM(global) {var myNum = {};\n" + + " myNum.mod32 = function(a, x) {\n" + + " if (x === 0) {\n" + + " __handleDivByZero();\n" + + " }\n" + + " return a % x;\n" + + " }\n" + + "" + + "var fillInVMSkeleton = function(vm) {"); } @Override @@ -731,6 +739,14 @@ } append( "\n}, function(exports) {\n" + + " var myNum = {};\n" + + " myNum.mod32 = function(a, x) {\n" + + " if (x === 0) {\n" + + " __handleDivByZero();\n" + + " }\n" + + " return a % x;\n" + + " }\n" + + "" + " var vm = {};\n"); append(" function link(n, assign) {\n" + " return function() {\n"