- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试编写一个非常简单的 nodejs C++ 插件,并将其用法与通常的 nodejs 模块用法(在 CoffeeScript 上编写)进行比较。我编写了一个测试,它从插件创建一百万个 AddonClass 对象实例,从模块创建 CoffeeClass。源代码是:
插件.cpp
#define BUILDING_NODE_EXTENSION
#include <node.h>
#include "addon_class.hpp"
using namespace v8;
static void InitAll(Handle<Object> target) {
Addon::Init(target);
}
NODE_MODULE(addon, InitAll)
插件类.hpp
#ifndef _ADDON_CLASS_HPP_
#define _ADDON_CLASS_HPP_
#include <node.h>
class Addon : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> target);
private:
Addon(int value) : value_(value) {};
~Addon() {};
static v8::Handle<v8::Value> New(const v8::Arguments& args);
int value_;
};
#endif
插件类.cpp
#define BUILDING_NODE_EXTENSION
#include <cstdio>
#include <node.h>
#include "addon_class.hpp"
using namespace v8;
Persistent<FunctionTemplate> tpl;
void Addon::Init(Handle<Object> target) {
Local<FunctionTemplate> t = FunctionTemplate::New(New);
tpl = Persistent<FunctionTemplate>::New(t);
tpl->SetClassName(String::NewSymbol("AddonClass"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
target->Set(String::NewSymbol("AddonClass"), tpl->GetFunction());
}
Handle<Value> Addon::New(const Arguments& args) {
HandleScope scope;
Addon* obj = new Addon(0);
if (args[0]->IsNumber()) {
obj->value_ = args[0]->NumberValue();
}
obj->Wrap(args.This());
return args.This();
}
咖啡类.咖啡
class CoffeeClass
value: undefined
constructor: (@value) ->
if !@value? then @value = 0
exports.CoffeeClass = CoffeeClass
基准.咖啡
CoffeeClass = (require './CoffeeClass.coffee').CoffeeClass
AddonClass = (require './build/Release/addon.node').AddonClass
N = 1e6
calculateDiff = (d1, d2) ->
h = parseInt d2.getHours()
h -= parseInt d1.getHours()
m = parseInt d2.getMinutes() + h * 60
m -= parseInt d1.getMinutes()
s = parseInt d2.getSeconds() + m * 60
s -= parseInt d1.getSeconds()
ms = parseInt d2.getMilliseconds() + s * 1000
ms -= parseInt d1.getMilliseconds()
return ms
testCreate = (LC) ->
d1 = new Date()
for i in [1..N]
l = new LC
d2 = new Date()
console.log LC.name, calculateDiff(d1, d2), "ms"
testCreate(CoffeeClass)
testCreate(AddonClass)
这个基准测试的结果对我来说非常非常奇怪:
CoffeeClass 34 ms
AddonClass 487 ms
所以,问题是:为什么这个简单的插件这么慢?而且,更重要的是,是否可以用它做点什么?
最佳答案
此处的测试用例非常小,以至于 V8 和插件之间的接口(interface)开销大于编译后的 c++ 的任何性能节省。
插件的一个很好的用途是不聊天,例如对输入参数执行复杂和优化的算法或与复杂的 c++ 数据结构交互。您希望最大限度地减少对插件的调用频率,并最大限度地提高每次调用时它执行的工作。您甚至可以考虑将许多单独的调用打包到一个数组中。
关于c++ - Node : Why nodejs c++ addon is so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197292/
我正在开发一个 Firefox 插件,我假装我的插件能够在桌面和移动设备上运行。我认为或多或少所有东西都与这两种环境兼容,但是我想根据当前设备是移动设备还是桌面设备来运行一些代码,所以问题是是否有类似
我正在开发一个 Firefox 插件,我不确定的一件事是如何在用户卸载插件时删除与我的插件相关的用户首选项。首选项被设置,如果用户卸载并重新安装首选项仍然存在。一些设置还与第一次安装有关,因此如果用户
使用 SDK 制作对话框的正确方法是什么(它没有锚定到附加栏等,而是显示在屏幕中央)?这个重要功能似乎没有任何 API。我确实看到 windows/utils 有 open 但我有两个问题: 打开对话
我遵循了几个教程但没有成功。我认为这是经典的例子,但我无法让它发挥作用。我可以保存我的项目,安装插件,当我选择一些文本时我可以看到上下文菜单项“日志选择”,但是当我点击它时没有任何反应。 export
我刚刚制作了一个 FF 插件并制作了一个简单的网站。我希望访问者点击“下载”按钮安装插件,而不是下载。它在本地有效,但在我上传网站时无效。我检查了 mozilla 存储库,它们也只是链接到 xpi 文
构建传统的 Firefox 扩展,您将在 install.rdf 中设置 minVersion 字段。由于这是由 package.json 和 cfx 抽象出来的,有没有办法设置 minVersion
请告诉我如何在 odoo9 中将文件夹(例如:custom_module)添加到“./odoo.py --addons=./addons” 我正在尝试将 custom_module 添加到“”./od
我用 simple-prefs配置插件设置的模块。我怎么能以编程方式 打开插件的设置页面? 最佳答案 我们在 test add-on here 中执行此操作 那里的代码比您需要的要多,因此较短的版本是
我有一个带有工作回调构造的插件: 库/main.js: function myLogin(loginname,loginfield) { var pageUrl = tabs.activeTa
为了在我的服务器上为我的插件提供自动更新,我需要创建一个 update.rdf文件。 我如何生成这样的文件? 文档非常多:https://developer.mozilla.org/en-US/doc
我在此链接中阅读了有关“请求”功能的信息: https://addons.mozilla.org/en-US/developers/docs/sdk/1.1/packages/addon-kit/do
我正在尝试使用 nsIHttpChannel 使用 firefox 插件 sdk 读取 header 喜欢.. var httpChannel = subject.QueryInterface(Ci.
有没有办法在内容脚本中访问 Fire Fox addon sdk 中的 Html5 文件 api? 这是为了存储用户添加的单词及其含义所必需的。数据可能会变大,因此本地存储不是一种选择。 windo
两者有什么区别: import React from 'react/addons'; let {PropTypes} = React; 对比 import React, { PropTypes } f
tl;dr:我们使用 Addon SDK 创建了一个 firefox 插件。由于编译插件是更大的构建系统中的一个步骤(我们也为 chrome 编译),我们的构建系统手动打包 xpi 并且不使用 jpm
我是 Windows 7 64 位用户,我在更新最新版本的 Android Studio 和 SDK 后遇到了 Android Studio 问题组件.. The following SDK comp
我正在研究一个Firefox扩展。问题是,如果我进行了任何更改,我需要关闭然后重新打开firefox浏览器以查看更改。我可以通过刷新页面来查看那些更改吗? 最佳答案 您可能想尝试Restart Fir
似乎是您从属性 title="test" 获得的工具提示不显示在面板内。 也用 stackoverflow loaded in the panel 测试过, 将鼠标悬停在热门、周、月上时没有工具提示。
截至 2019 年 6 月 27 日,所有语言词典的下载量约为 1,800 次。我已从该页面查看了一些示例仪表板... https://addons.mozilla.org/en-US/firefox
我正在尝试通过 msi 安装程序静默安装 firefox xpi。我是通过以下方法这样做的: 解压我的 xpi在某个临时目录中并将其中的所有内容复制到 %APPDATA%\Mozilla\Firefo
我是一名优秀的程序员,十分优秀!