关于内嵌v8的一些性能测试

我写了个插件把google的javascript引擎v8嵌入到ATS中去,目的是希望以脚本的方式修改http请求。然后我刚刚在网上看见nginx的作者对v8的声讨:http://sysoev.ru/prog/v8.html 说为什么v8不适合嵌入到http server中(比如嵌入到nginx),其中一个理由是,创建一个V8 context需要2ms,那么一个单线程的http server每秒就最多只能处理500个请求,这样的结果简直不可接受。nginx的这篇文章是2010年写的,时过境迁,我刚做了下实验,发现并不属实。

创建Context并不慢

首先,v8中创建第一个context确实很慢。因为它需要初始化很多global的变量和函数。你想想看启动一个java的vm要多久,相比而下2ms算什么。请看下面这段代码:

Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
MESURE_TIME_BEGIN(create_context1)
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
MESURE_TIME_END(create_context1)

MESURE_TIME_BEGIN(create_context2)
v8::Local<v8::Context> context2 = v8::Local<v8::Context>::New(isolate, context);
Context::Scope context_scope2(context2);
MESURE_TIME_END(create_context2)

第二个context是在第一个context的基础上创建的。在我的笔记本上测试:

create_context1 time=28440968 nano seconds

create_context2 time=414 nano seconds

也就是说创建一个新的context的时间小于1微秒。对于我的场景来说,我是在服务器启动、加载js代码的时候创建第一个context,每个请求来了之后是在预创建好的context的基础上创建新的context,所以1微妙就足够了。另外,我的v8是自己编译的没有打开snapshot,否则创建第一个context的时间也会大幅度缩减。

JIT优化很惊人

v8会对反复运行的代码进行动态优化。我把我的js脚本每次的运行时间打了出来。同一个脚本,同样的input,优化后和优化前相差25倍。

call 492500 nano seconds

call 148588 nano seconds

call 25849 nano seconds

call 20040 nano seconds

call 20715 nano seconds

call 18684 nano seconds

call 18292 nano seconds

call 20112 nano seconds

call 17751 nano seconds

call 17671 nano seconds

call 17687 nano seconds

call 19698 nano seconds

call 17506 nano seconds

call 17814 nano seconds

call 19644 nano seconds

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥