热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么V8节点。JS比我的c++addon要快?-WhyV8inNode.JSisfasterthaninmynativeC++addon?

WhyGooglesV8JavaScriptengineinmyC++addonworkssignificantlyslowerthaninNode.JS?为什么谷歌在

Why Google's V8 Javascript engine in my C++ addon works significantly slower than in Node.JS?

为什么谷歌在我的c++ addon中使用的V8 Javascript引擎要比Node.JS中慢得多?

I've tried to write some stupidly simple code for generating prime numbers in the Javascript and ran it in V8 via my C++ addon and directly in Node.JS.

我尝试编写一些愚蠢的简单代码,用于在Javascript中生成质数,并在V8中通过我的c++ addon和Node.JS直接运行它。

I was quite shocked, because both should be using the same Javascript engine and both have executed the same code (time in milliseconds, less is better):

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

V8 in Node.JS:  495517
V8 in Node.JS C++ Addon:  623598

Here is the source of Javascript module and source of C++ addon that runs same Javascript code (and I think problem not in the interop, because measuring of time works directly in JS):

这是Javascript模块的源代码和c++ addon的源代码,它运行相同的Javascript代码(我认为在内部操作中没有问题,因为时间度量直接在JS中工作):

index.js:

index.js:

var jsInNodeJsPrimeGeneratorBenchmark = require("./Javascript.js");
var jsInNativePrimeGeneratorBenchmark = require("./native");

console.log("V8 in Node.JS: ", jsInNodeJsPrimeGeneratorBenchmark.primeGeneratorBenchmark());
console.log("V8 in Node.JS C++ Addon: ", jsInNativePrimeGeneratorBenchmark.primeGeneratorBenchmark());

Javascript.js:

Javascript.js:

function primeGeneratorBenchmark() {
    var result, primeNumberCounter, i, j, isPrime, start, end;

    i = 3;
    primeNumberCounter = 1;

    start = Date.now();

    while (primeNumberCounter <100000) {
        isPrime = true;
        for (j = 2; j 

native.cpp:

native.cpp:

#include 

v8::Handle primeGeneratorBenchmark(const v8::Arguments &arguments);
void registerModule(v8::Handle target);

v8::Handle primeGeneratorBenchmark(const v8::Arguments &arguments) {
    v8::HandleScope handleScope;

    v8::Local cOntext= arguments.Holder()->CreationContext();

    v8::Context::Scope scope(context);

    const char *sourceStringC =
        "var result, primeNumberCounter, i, j, isPrime, start, end, time;\n"
        "i = 3;\n"
        "primeNumberCounter = 1;\n"
        "start = Date.now();\n"
        "while (primeNumberCounter <100000) {\n"
        "    isPrime = true;\n"
        "    for (j = 2; j  sourceStringV8 = v8::String::New(sourceStringC);

    v8::Local script = v8::Script::Compile(sourceStringV8);
    script->Run();

    v8::Local timeResult = v8::Context::GetCurrent()->Global()->Get(v8::String::New("time"));

    return handleScope.Close(timeResult);
}

void registerModule(v8::Handle target) {
    target->Set(v8::String::NewSymbol("primeGeneratorBenchmark"), v8::FunctionTemplate::New(primeGeneratorBenchmark)->GetFunction());
}

NODE_MODULE(native, registerModule);

1 个解决方案

#1


39  

In the C++ version all variables declared in the script source (result, primeNumberCounter, i, j, isPrime, start, end, time) are global because script's top level scope is global scope.

在c++版本中,脚本源代码中声明的所有变量(result、primeNumberCounter、i、j、isPrime、start、end、time)都是全局的,因为脚本的顶层作用域是全局作用域。

For optimizing compiler it is easy to allocate local variables into machine registers (or spill slots on stack) and keep track of their type. Working with global variables on the other hand requires constant memory accesses and type checks because V8 does not (currently) perform a register promotion optimization.

为了优化编译器,很容易将本地变量分配到机器寄存器(或堆栈上的溢出槽)中并跟踪它们的类型。另一方面,使用全局变量需要持续的内存访问和类型检查,因为V8(目前)没有执行寄存器升级优化。

If you wrap the source into an immediately called function difference should go away.

如果你把源包在一个立即被调用的函数中,差值就会消失。


推荐阅读
  • 前端简史之纵横:Node东出
    引💡Ajax的出现,带来了jQuery时代,而jQuery时代也伴随着Node风暴淡淡退出了历史舞台。如果说Ajax给前端带来了从网页静 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
  • 技术周报·2021-05-07-小编推荐向现代Javascript转型原文标题:Publish,ship,andinstallmodernJavaScriptforfaste ... [详细]
  • 大数据 (三) BI报表系统  superset 源码搭建开发环境
    大数据 (三) BI报表系统 superset 源码搭建开发环境 ... [详细]
  • 这是一篇参考学习使用的文章,但是无法执行通过最近,实验室在做一个适配于手机的web项目(可以说是一个混合应用开发),最后需要打包成apk程序,作为一名对移动开发的研究者,这个打包的 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务
    java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务第三步java实现 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • Node.js详细安装及环境配置
    1、下载安装根据自己电脑系统及位数选择,我这里选择windows64位.msi格式安装包(官网:https:odejs.orgzh-cndownload).msi和.zip格式区别 ... [详细]
  • 这篇“Webpack是怎么工作的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大 ... [详细]
  • 这么多流媒体服务器?你怎么技术选型?
    在上一篇文章里我们介绍了我们介绍了MCU和SFU的优缺点,webRTC通信方案SFU和MCU的区别?下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现SFU流媒体服务器 ... [详细]
  • 原文http:a317222029201405212739.iteye.comblog2174140引自http:www.tuicool.comarticlesaeye6rY ... [详细]
author-avatar
xillb_486
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有