如果看了《為V8優(yōu)化JavaScript》這篇文章,就會了解到v8設(shè)計的獨到之處,大家都知道v8快妇多,但是v8有多快呢,我們今天就來看看燕侠。
實際上v8竟然在執(zhí)行算法的時候和C++差不多快者祖,我們通過一個算法來測試一下。
首先我們看一下計算質(zhì)數(shù)的算法绢彤。
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
看到?jīng)]有饶氏,0.34s
在測試一下CPP代碼
結(jié)論
雖然cpp還是比js快樂4~10倍讥耗,但是這是visual studio 2015編譯器編譯的版本,相信在Linux上g++應(yīng)該和v8的差距比這個小的疹启,而且我用的d8是3.29.88版本的古程,最新的肯定比這快。所以我們的結(jié)論是皮仁,v8真的很快籍琳,都接近c++啦菲宴。
不清楚d8如何編譯出來贷祈,可以看看《如何用visual studio編譯v8》