c++ - 正确处理 Persistent<ArrayBuffer>

标签 c++ v8 arraybuffer

我得到了非常简单的代码:

struct Dyn {
 float *ptr;
 int n;
};


void setWeakFunction1(const WeakCallbackInfo<Dyn> &data) {
}
void setWeakFunction(const WeakCallbackInfo<Dyn> &data) {
 auto *v = data.GetParameter();
 data.SetSecondPassCallback(setWeakFunction1);
 std::cout << v->n << " Collector\n";
 delete[] v->ptr;
 delete v;

}

void getIndex(const FunctionCallbackInfo<Value> &args) {
  Dyn *d = new Dyn;
  float *ptr = new float[amount];
  for (size_t i = 0; i < amount; ++i) {
    ptr[i] = i + 2;
  }

  auto isolate = Isolate::GetCurrent();
  HandleScope scope(isolate);
  Local<ArrayBuffer> ab =
      ArrayBuffer::New(isolate, ptr, amount * sizeof(float));
  Persistent<ArrayBuffer> pab(isolate, ab);
  pab.SetWeak(d, setWeakFunction, WeakCallbackType::kInternalFields);
  pab.MarkIndependent();
  args.GetReturnValue().Set(ab);
}

void RegisterModule(Local<Object> exports, Local<Object>) {
 auto isolate = Isolate::GetCurrent();
 exports->Set(String::NewFromUtf8(isolate, "getIndex"),
           FunctionTemplate::New(isolate, getIndex)->GetFunction());
}

NODE_MODULE(commander, RegisterModule)

这段代码对我来说有些尴尬。

因为有一个计数器,我希望为我创建的每个 Persistence 存储调用 setWeakFunction。当 float 量小于 10000 时,它会调用每个 Persistent cell。但是当 float 的大小变为 100 000 时,它不会尝试处理任何对象,直到有 1Gb 的内存被吃掉,然后它不断删除,但留下 2-3 个对象。

我有一个想法,垃圾收集器为一堆对象调用一次 WeakCallback,但没有找到信息,证实了这一点。

更糟糕的是,我从未见过任何针对 1000 000 float 组的垃圾收集调用。

如何正确处理这个数组?

最佳答案

让我尝试修复上面的代码:

struct Dyn {
    Persistent<ArrayBuffer> pab;
    float *ptr;
    int n;
};

void setWeakFunction(const WeakCallbackInfo<Dyn> &data) {
    auto *v = data.GetParameter();
    std::cout << v->n << " Collector\n";
    v->pab.Reset();
    delete[] v->ptr;
    delete v;

}

void getIndex(const FunctionCallbackInfo<Value> &args) {
    Dyn *d = new Dyn;
    float *ptr = new float[amount];
    for (size_t i = 0; i < amount; ++i) {
        ptr[i] = i + 2;
    }

    auto isolate = args.GetIsolate();
    HandleScope scope(isolate);
    Local<ArrayBuffer> ab =
        ArrayBuffer::New(isolate, ptr, amount * sizeof(float), ArrayBufferCreationMode::kExternalized);
    d->pab.Reset(isolate, ab);
    d->pab.SetWeak(d, setWeakFunction, WeakCallbackType::kParameter);
    d->pab.MarkIndependent();
    args.GetReturnValue().Set(ab);
}

void RegisterModule(Local<Object> exports, Local<Object>) {
    auto isolate = Isolate::GetCurrent();
    exports->Set(String::NewFromUtf8(isolate, "getIndex"),
        FunctionTemplate::New(isolate, getIndex)->GetFunction());
}

NODE_MODULE(commander, RegisterModule)

关于c++ - 正确处理 Persistent<ArrayBuffer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36264254/

相关文章:

c++ - 过度使用宏会影响性能吗?

V8:将对象从 JavaScript 传递到 uv_work 函数

javascript - 损坏的 v8 日期解析器有什么解决方法吗?

javascript - NodeJS流暂停/恢复不适用于XMLHttpRequest,但适用于curl?

javascript - Blob 到 Uint8Array,无需回调

c# - 如何在 Node.js WebSocket 服务器和 C# 客户端之间交换二进制数据?

c++ - 现代C++中的动态数组

c++ - 我应该在 C++11 中显式声明转换运算符吗?

c++ - gprof 输出问题

c++ - 如何从 C++ 调用 javascript 回调