在计算素数时,NodeJS比D快.怎么样?

the*_*dev 5 performance time primes d node.js

我写了一个简单的函数来计算D中的素数.我认为这很快,计算高达100,000的素数.但后来我想将它与NodeJS进行比较.当我第一次运行NodeJS脚本时,我对这个差异感到震惊并且仔细检查了我没有跳过某种计算方法.但这两者在功能上完全相同.

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();
}
Run Code Online (Sandbox Code Playgroud)

的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.");   
    });
})();
Run Code Online (Sandbox Code Playgroud)

结果:

Calculating 100,000 primes:
D:      3.49126 seconds
NodeJS: 0.652 seconds
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样吗?

提前致谢.

Ste*_*ppo 7

通过不必要地将变量声明为real,您强制使用浮点运算,其中可以使用整数运算.替换所有realwith的实例int,摆脱它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();
}
Run Code Online (Sandbox Code Playgroud)