如果看了《为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
看到没有,0.34s
在测试一下CPP代码
结论
虽然cpp还是比js快乐4~10倍,但是这是visual studio 2015编译器编译的版本,相信在Linux上g++应该和v8的差距比这个小的,而且我用的d8是3.29.88版本的,最新的肯定比这快。所以我们的结论是,v8真的很快,都接近c++啦。
不清楚d8如何编译出来,可以看看《如何用visual studio编译v8》