Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy V8 in Node.JS is faster than in my native C++ addon?
    text
    copied!<p>Why Google's V8 JavaScript engine in my C++ addon works significantly slower than in Node.JS?</p> <p>I've tried to write some stupidly simple code for generating prime numbers in the JavaScript and ran it in V8 via my C++ addon and directly in Node.JS.</p> <p>I was quite shocked, because both should be using the same JavaScript engine and both have executed the same code (time in milliseconds, less is better):</p> <pre><code>V8 in Node.JS: 495517 V8 in Node.JS C++ Addon: 623598 </code></pre> <p>Here is the source of JavaScript module and source of C++ addon that runs same JavaScript code (and I think problem not in the interop, because measuring of time works directly in JS):</p> <p><em>index.js</em>:</p> <pre class="lang-js prettyprint-override"><code>var jsInNodeJsPrimeGeneratorBenchmark = require("./javascript.js"); var jsInNativePrimeGeneratorBenchmark = require("./native"); console.log("V8 in Node.JS: ", jsInNodeJsPrimeGeneratorBenchmark.primeGeneratorBenchmark()); console.log("V8 in Node.JS C++ Addon: ", jsInNativePrimeGeneratorBenchmark.primeGeneratorBenchmark()); </code></pre> <p><em>javascript.js</em>:</p> <pre class="lang-js prettyprint-override"><code>function primeGeneratorBenchmark() { var result, primeNumberCounter, i, j, isPrime, start, end; i = 3; primeNumberCounter = 1; start = Date.now(); while (primeNumberCounter &lt; 100000) { isPrime = true; for (j = 2; j &lt; i; j++) { if (i % j === 0) { isPrime = false; break; } } if (isPrime) { result = i; primeNumberCounter++; } i++; } end = Date.now(); return end - start; } exports.primeGeneratorBenchmark = primeGeneratorBenchmark; </code></pre> <p><em>native.cpp</em>:</p> <pre class="lang-cpp prettyprint-override"><code>#include &lt;node.h&gt; v8::Handle&lt;v8::Value&gt; primeGeneratorBenchmark(const v8::Arguments &amp;arguments); void registerModule(v8::Handle&lt;v8::Object&gt; target); v8::Handle&lt;v8::Value&gt; primeGeneratorBenchmark(const v8::Arguments &amp;arguments) { v8::HandleScope handleScope; v8::Local&lt;v8::Context&gt; context = arguments.Holder()-&gt;CreationContext(); v8::Context::Scope scope(context); const char *sourceStringC = "var result, primeNumberCounter, i, j, isPrime, start, end, time;\n" "i = 3;\n" "primeNumberCounter = 1;\n" "start = Date.now();\n" "while (primeNumberCounter &lt; 100000) {\n" " isPrime = true;\n" " for (j = 2; j &lt; i; j++) {\n" " if (i % j === 0) {\n" " isPrime = false;\n" " break;\n" " }\n" " }\n" " if (isPrime) {\n" " result = i;\n" " primeNumberCounter++;\n" " }\n" " i++;\n" "}\n" "end = Date.now();\n" "time = end - start;\n"; v8::Local&lt;v8::String&gt; sourceStringV8 = v8::String::New(sourceStringC); v8::Local&lt;v8::Script&gt; script = v8::Script::Compile(sourceStringV8); script-&gt;Run(); v8::Local&lt;v8::Value&gt; timeResult = v8::Context::GetCurrent()-&gt;Global()-&gt;Get(v8::String::New("time")); return handleScope.Close(timeResult); } void registerModule(v8::Handle&lt;v8::Object&gt; target) { target-&gt;Set(v8::String::NewSymbol("primeGeneratorBenchmark"), v8::FunctionTemplate::New(primeGeneratorBenchmark)-&gt;GetFunction()); } NODE_MODULE(native, registerModule); </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload