JavaScript可以和C++一样快

如果看了《为V8优化JavaScript》这篇文章,就会了解到v8设计的独到之处,大家都知道v8快,但是v8有多快呢,我们今天就来看看。
实际上v8竟然在执行算法的时候和C++差不多快,我们通过一个算法来测试一下。
首先我们看一下计算质数的算法。

JavaScript版本

function Primes() {
    this.prime_count = 0;
    this.primes = new Array(25000);
    this.getPrimeCount = function() {
        return this.prime_count;
    }
    this.getPrime = function(i) {
        return this.primes[i];
    }
    this.addPrime = function(i) {
        this.primes[this.prime_count++] = i;
    }

    this.isPrimeDivisible = function(candidate) {
        for (var i = 1; i < this.prime_count; ++i) {
            var current_prime = this.primes[i];
            if (current_prime * current_prime > candidate) {
                return false;
            }
            if ((candidate % current_prime) == 0) return true;
        }
        return false;
    }
};

function main() {
    p = new Primes();
    var c = 1;
    while (p.getPrimeCount() < 25000) {
        if (!p.isPrimeDivisible(c)) {
            p.addPrime(c);
        }
        c++;
    }
    print(p.getPrime(p.getPrimeCount() - 1));
}

main();

C++版本

#include 
class Primes {
public:
     Primes() {
         prime_count = 0;
    }
    int getPrimeCount() const { return prime_count; }
    int getPrime(int i) const { return primes[i]; }
    void addPrime(int i) { primes[prime_count++] = i; }

    bool isDivisibe(int i, int by) { return (i % by) == 0; }

    bool isPrimeDivisible(int candidate) {
        for (int i = 1; i < prime_count; ++i) {
            int current_prime = primes[i];
            if (current_prime * current_prime > candidate) {
                return false;
            }
            if (isDivisibe(candidate, primes[i])) return true;
        }
        return false;
    }

private:
    volatile int prime_count;
    volatile int primes[25000];
};

int main() {
    Primes p;
    int c = 1;
    while (p.getPrimeCount() < 25000) {
        if (!p.isPrimeDivisible(c)) {
            p.addPrime(c);
        }
        c++;
    }
    printf("%d\n", p.getPrime(p.getPrimeCount() - 1));
}

这两个算法都不难看懂,我们测试一下性能。使用linux下的time命令可以方便的测试。使用windows的朋友可以使用mobaxterm,这个工具可以跑大部分Linux命令。

  • 首先我们测试一下js


    JavaScript可以和C++一样快_第1张图片
    v8计算js

    看到没有,0.34s

  • 在测试一下CPP代码

JavaScript可以和C++一样快_第2张图片
Paste_Image.png

结论

虽然cpp还是比js快乐4~10倍,但是这是visual studio 2015编译器编译的版本,相信在Linux上g++应该和v8的差距比这个小的,而且我用的d8是3.29.88版本的,最新的肯定比这快。所以我们的结论是,v8真的很快,都接近c++啦。

不清楚d8如何编译出来,可以看看《如何用visual studio编译v8》

你可能感兴趣的:(JavaScript可以和C++一样快)