Tag: v8

在Nodejs中创buildv8arrays的性能

我正在尝试将一个JSalgorithm移植到C ++中,以查看是否可以改进性能,但是在填充v8arrays时,我正面临着巨大的性能瓶颈。 这是一个片段,重现只是数组填充。 我创build了一个800k项目的数组,每个项目是17个数字的数组。 这个algorithm需要3秒才能在我的机器上执行,这是相当巨大的。 有反正加快吗? #include <node.h> namespace demo { using namespace v8; // just for lisibility of the example void Method(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); Local<Array> array = Array::New(isolate, 800000); for (int i = 0; i < 800000; ++i) { Local<Array> line = Array::New(isolate, 17); for (int j = 0; […]

v8是否仍然有连续的内存块的C风格的数组,我怎样才能确保我使用它们?

似乎有一个传统的观点认为,数组在第8版中被表示为从索引到值的hashmaps。 我发现,唯一的来源是否是这样的: 似乎权威,但是,它可以追溯到2012年。自那以后很多可能已经改变。 这是真的吗? var a1 = Array(1000)是引擎盖下的一个连续数组(除非你超出了数组的边界)并且var a2 = []不是?

在尝试检索时,通过nan传递数组返回未定义

我目前正在使用他们的c ++ / v8系统为NodeJS编写一个本地插件,并试图从Javascript写入一个数组到C ++,然后再检索它。 每当我尝试从数组中检索一个值并将其返回时,它将返回一个空数组 – 正如我最近潜入c ++中,我不确定这是我的误解指针/ c ++基础或NodeJS c ++交互。 我的档案如下: functions.cc #include "functions.h" #include <node.h> #include <nan.h> using namespace std; using namespace v8; NAN_METHOD(nothing) { } NAN_METHOD(aString) { info.GetReturnValue().Set(Nan::New("This is a thing.").ToLocalChecked()); } NAN_METHOD(aBoolean) { info.GetReturnValue().Set(false); } NAN_METHOD(aNumber) { info.GetReturnValue().Set(1.75); } NAN_METHOD(anObject) { v8::Local<v8::Object> obj = Nan::New<v8::Object>(); Nan::Set(obj, Nan::New("key").ToLocalChecked(), Nan::New("value").ToLocalChecked()); info.GetReturnValue().Set(obj); […]

JavaScript的内部:在什么时间间隔的事件循环运行?

这是一个关于JavaScript内部的问题。 比方说,我有10个asynchronous任务,都需要X秒运行。 在等待回应时,脚本闲置。 在后台,JavaScript引擎询问“任务队列中是否有任何内容”。 据我了解这是一个循环。 因此,事件循环。 我知道在Node中这是用Libuv实现的。 我已经阅读了这篇文章,它有点解释: https : //nikhilm.github.io/uvbook/basics.html 为了平衡应用程序的性能,JavaScript引擎是否对此事件循环运行的频率设置了限制? 它是否以设定的时间间隔运行? 如果我什么都没有,请纠正我。 我纯粹感兴趣的事件循环运行的时间间隔。

Nan无法用v8 :: Object字段打包和解包对象

起初,我是这样定义的(基本上和文档中的对象包装例子一样,唯一的区别是这个例子包装了一个double值属性,但是我的是一个v8::Object ): 。H: #include <nan.h> using v8::Local; using v8::Object; using Nan::FunctionCallbackInfo; class MyObject : public Nan::ObjectWrap { public: static void Init(v8::Local<v8::Object> module); private: explicit MyObject(Local<Object>); ~MyObject(); static Nan::Persistent<v8::Function> constructor; static void New(const FunctionCallbackInfo<v8::Value>& info); static void GetConfig(const FunctionCallbackInfo<v8::Value>& info); Local<Object> Config; }; .CC: using v8::Local; using v8::Object; Nan::Persistent<v8::Function> MyObject::constructor; MyObject::MyObject(Local<Object> config) : Config(config){} MyObject::~MyObject(){} // […]

Node.js 6 addon将Buffer.from()转换为const UInt8 *

嘿,我知道人们问过这个问题之前,无论出于何种原因,典型的答案不适合我。 基本上我有一个无符号的字节数组: var message = Buffer.from([ 0x27, 0x52, 0x00, 0x8E ]) myAddon.test(message); 在我的C ++模块中,我需要将ByteBuffer变成一个const UInt8 *数据结构。 我的代码目前是: #include <node.h> using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::Value; using v8::Exception; void test(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); if (!args[0] ->IsObject()) { isolate -> ThrowException(Exception::TypeError( v8::String::NewFromUtf8(isolate, "All arguments must be string") )); return; […]

Nodejs Addon – 将正则expression式string传递给C ++

我想弄清楚如何在C ++中创build一个正则expression式。 我想将从JavaScript传递到C ++的string转换为正则expression式。 我有这个: std::regex re; if (!args[1]->IsString()) { Nan::ThrowTypeError("Second argument to 'replace-line' must be a string regular expression."); return; } else{ v8::String::Utf8Value regexin(args[1]->ToString()); re(*regexin); } 但是这个编译失败,出现这个错误: ../hello.cpp: In function 'void Method(const v8::FunctionCallbackInfo<v8::Value>&)': ../hello.cpp:50:16: error: no match for call to '(regex_t {aka re_pattern_buffer}) (char*)' re(*regexin); 任何人都知道我可以声明/创build一个regex给这个v8::String ?

如何解除V8中的error.stack?

看来在第一次使用Error.prepareStackTrace后, Error.prepareStackTrace的输出被caching: try { null(); } catch (error) { Error.prepareStackTrace = () => { return 'Hello, World!'; }; console.log('#0', error.stack); Error.prepareStackTrace = () => { return 'Hello, Stack Trace!'; }; console.log('#1', error.stack); } 电stream输出: #0 Hello, World! #1 Hello, World! 预期产出: #0 Hello, World! #1 Hello, Stack Trace! 如何uncache error.stack值以允许进一步使用Error. prepareStackTrace Error. prepareStackTrace ? 没有这个,我不能保证当我有error […]

在Node.js中禁用GC

有没有办法完全禁用GC(或)清道夫,至less? 在这里find讨论 – https://github.com/nodejs/help/issues/462在这里 – https://twitter.com/dolftax/status/825742173698142209 我试过node –nouse_idle_notification –trace_gc –max-old-space-size=1000 –max-semi-space-size=64 –noconcurrent_sweeping example.js Scavenge和Mark-Sweep都不停止。 请参阅Github问题了解更多信息。 我的问题是,我错过了什么? 还有什么我可以做,让GC不能运行。 仅供参考,这是为了实验目的,不希望不停止GC的替代解决scheme。 节点v7.9.0 V8 5.4.500.45

Node.js:1D vs 2Darrays中的100M个元素 – 意外内存问题

比方说,我有一亿个随机floats我试图保存在一个数组中。 起初,我把数字保存在一个二维数组(基本上是一个matrix)中,但是后来我想,如果我把所有的100M单元存储在一个单一的线性一维数组中,那么我可以把整个数据做得更快。 令我惊讶的是,这发生了: 10 000×10000二维arrays 数组的创build和操作是相当快的, 即使默认的内存限制 ,Node也没有任何麻烦。 100M元素一维arrays 当试图生成100M随机浮动节点抛出 FATAL ERROR: invalid array length Allocation failed – JavaScript heap out of memory 即使用–max_old_space_size=8192调用 这是为什么? 这对我来说似乎是非常直观的。 我的猜测是使一个单一的长Array对象应该比另一个数组中存储10k数组更高的内存效率。 所以,是的,我的问题是: 为什么呢?