计算素数时NodeJS比D快。 怎么样?

我在D中编写了一个计算素数的简单函数。我认为这很快,计算出素数高达100,000。 但后来我想把它与NodeJS进行比较。 当我第一次运行NodeJS脚本的时候,我惊异于这个差异,双重检查我没有跳过某种计算方法。 但是两者在function上完全相同。

d:

import std.stdio; import std.math; import std.datetime; import std.file; import std.array; enum size_t ITERATIONS = 100_000; bool divisible(real n) { real d; for(d = 3; d < floor(n / 2); d += 2) { if(n % d == 0) { return true; } } return false; } void main() { StopWatch sw; size_t T = ITERATIONS; size_t C = 0; real n = 2; real r[ITERATIONS]; r[C] = n; sw.start(); C++; for(n = 3; n < T; n += 2) { if(!divisible(n)) { r[C] = n; C++; } } sw.stop(); double seconds = cast(double)sw.peek().usecs / 1_000_000; writeln("\n\n", C, " prime numbers calculated in ", seconds, " seconds."); File file = File("primes.txt", "w"); file.writeln("\n", C, " prime numbers calculated ", seconds, " seconds."); foreach(number; r[0..C]) { file.writeln(number); } file.writeln("\n", "end"); file.close(); } 

的NodeJS:

 var fs = require('fs'); var ITERATIONS = 100000; function divisible(n) { var d; for(d = 3; d < Math.floor(n / 2); d += 2) { if(n % d == 0) { return true; } } return false; } (function() { var buffer = [ ], now = Date.now(), C = 0 n = 2 ; buffer.push(n); C++; for(n = 3; n < ITERATIONS; n += 2) { if(!divisible(n)) { buffer.push(n); C++; } } var time = Date.now() - now, seconds = time / 1000 ; console.log("\n\n", C, " prime numbers calculated. Process took ", seconds, " seconds."); buffer.push("\n" + C + " prime numbers calculated. Process took " + seconds + " seconds."); fs.writeFile("node_primes.txt", buffer.join("\n"), function(err) { if(err) throw err; console.log("Primes have been written to file."); }); })(); 

结果:

 Calculating 100,000 primes: D: 3.49126 seconds NodeJS: 0.652 seconds 

谁能解释为什么会发生这种情况?

提前致谢。

通过不必要地将variables声明为real ,您可以强制使用整数运算的浮点运算 。 用intreplacereal所有实例,摆脱那个floor() ,你的D程序将运行得和Node.JS版本一样快:

 import std.stdio; import std.math; import std.datetime; import std.file; import std.array; enum size_t ITERATIONS = 100_000; bool divisible(int n) { int d; for(d = 3; d < n / 2; d += 2) { if(n % d == 0) { return true; } } return false; } void main() { StopWatch sw; size_t T = ITERATIONS; size_t C = 0; int n = 2; int r[ITERATIONS]; r[C] = n; sw.start(); C++; for(n = 3; n < T; n += 2) { if(!divisible(n)) { r[C] = n; C++; } } sw.stop(); double seconds = cast(double)sw.peek().usecs / 1_000_000; writeln("\n\n", C, " prime numbers calculated in ", seconds, " seconds."); File file = File("primes.txt", "w"); file.writeln("\n", C, " prime numbers calculated ", seconds, " seconds."); foreach(number; r[0..C]) { file.writeln(number); } file.writeln("\n", "end"); file.close(); }