Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Node.JS中的V8比我的原生C++;插件? 为什么谷歌的V8JavaScript引擎在我的C++插件中工作得比No.js? 我尝试编写一些愚蠢的简单代码,用于生成JavaScript中的质数,并通过我的C++插件在V8中运行,并直接在节点.js._Javascript_C++_Performance_Node.js_V8 - Fatal编程技术网

为什么Node.JS中的V8比我的原生C++;插件? 为什么谷歌的V8JavaScript引擎在我的C++插件中工作得比No.js? 我尝试编写一些愚蠢的简单代码,用于生成JavaScript中的质数,并通过我的C++插件在V8中运行,并直接在节点.js.

为什么Node.JS中的V8比我的原生C++;插件? 为什么谷歌的V8JavaScript引擎在我的C++插件中工作得比No.js? 我尝试编写一些愚蠢的简单代码,用于生成JavaScript中的质数,并通过我的C++插件在V8中运行,并直接在节点.js.,javascript,c++,performance,node.js,v8,Javascript,C++,Performance,Node.js,V8,我非常震惊,因为两者都应该使用相同的JavaScript引擎,并且都执行了相同的代码(时间以毫秒为单位,越短越好): 这里是JavaScript模块的来源和C++运行的源代码,它运行相同的JavaScript代码(我认为问题不在互操作中,因为时间的测量直接在JS中工作): index.js: var jsInNodeJsPrimeGeneratorBenchmark=require(“./javascript.js”); var jsInNativePrimeGeneratorBenchmark

我非常震惊,因为两者都应该使用相同的JavaScript引擎,并且都执行了相同的代码(时间以毫秒为单位,越短越好):

这里是JavaScript模块的来源和C++运行的源代码,它运行相同的JavaScript代码(我认为问题不在互操作中,因为时间的测量直接在JS中工作):

index.js:

var jsInNodeJsPrimeGeneratorBenchmark=require(“./javascript.js”); var jsInNativePrimeGeneratorBenchmark=require(“./native”); log(“Node.JS中的V8:,jsInNodeJsPrimeGeneratorBenchmark.primeGeneratorBenchmark()); 控制台.log(“No.JS+C++插件”中的V8,JSnNATIVEPRIME生成程序基准。 javascript.js:

函数primeGeneratorBenchmark(){
var结果,primeNumberCounter,i,j,isPrime,start,end;
i=3;
primeNumberCounter=1;
开始=日期。现在();
同时(primeNumberCounter<100000){
isPrime=true;
对于(j=2;j
native.cpp:

#包括
v8::Handle primeGeneratorBenchmark(常量v8::Arguments&Arguments);
无效注册表模块(v8::句柄目标);
v8::Handle primeGeneratorBenchmark(常量v8::Arguments&Arguments){
v8::手镜手镜;
v8::Local context=arguments.Holder()->CreationContext();
v8::Context::Scope(上下文);
常量字符*sourceStringC=
变量结果,素数计数器,i,j,isPrime,开始,结束,时间;\n
“i=3;\n”
“primeNumberCounter=1;\n”
“开始=日期。现在();\n”
“而(primeNumberCounter<100000){\n”
“isPrime=true;\n”
“对于(j=2;j运行();
v8::Local timeResult=v8::Context::GetCurrent()->Global()->Get(v8::String::New(“time”);
返回手柄镜。关闭(时间结果);
}
无效注册表模块(v8::句柄目标){
target->Set(v8::String::NewSymbol(“primeGeneratorBenchmark”),v8::FunctionTemplate::New(primeGeneratorBenchmark)->GetFunction();
}
节点_模块(本机、注册表模块);

在C++版本中,在脚本源中声明的所有变量(<代码>结果< /代码>,<代码> PrimeObjultAudio> <代码>,<代码> >代码> j>代码>,<代码> ISORDATION<代码>,<代码>开始<代码>,结束,代码>时间>代码>是全局的,因为脚本的最高级别范围是全局范围。 为了优化编译器,可以很容易地将局部变量分配到机器寄存器(或堆栈上的溢出槽)并跟踪它们的类型。另一方面,处理全局变量需要不断的内存访问和类型检查,因为V8(当前)不执行寄存器升级优化


如果将源代码包装到立即调用的函数中,那么差分应该消失。

谢谢你,Vyacheslav,你节省了我的时间!我用匿名函数包装所有的东西,这些函数立即调用自己和C++ ADON,运行速度甚至更快。我在全局范围内只留下变量<代码>时间>代码,以获得我的结果而不重写我的C++代码。只是一个有趣的想法:如果在C++中实现相同的算法而不是要求V8在JS中解析和执行它,结果是什么?这看起来只是在不执行任何事情的情况下使用JS编译器,对吗?
V8 in Node.JS:  495517
V8 in Node.JS C++ Addon:  623598