美文网首页
JavaScript可以和C++一样快

JavaScript可以和C++一样快

作者: 转角遇见一直熊 | 来源:发表于2016-04-18 16:16 被阅读352次

    如果看了《为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 <stdio.h>
    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


      v8计算js

      看到没有,0.34s

    • 在测试一下CPP代码

    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++一样快

          本文链接:https://www.haomeiwen.com/subject/bzqalttx.html