首页 > 解决方案 > 节点原生插件:在工作线程中将字符串参数转换为 UTF-8

问题描述

我有一个高性能节点应用程序,主线程中不必要地阻塞的每一毫秒都是有害的。大多数繁重的处理都是在 C++ 本机节点插件中完成的。效果很好。

有时,Javascript 代码需要将很长的字符串传递给插件 C++ 代码。困扰我的(通过分析验证)是当(复制&)将(非常长的)字符串转换为 UTF-8 时,主线程中有一个重要的块,然后副本最终被卸载到工作线程。

是否可以将复制和转换卸载到工作线程?

我知道通常一个人可能不会从一个单独的线程访问 Javascript 对象,但这不是一个硬性规则(正如一些人所建议的那样)。例如,可以(并且常见)Persistent引用一个Buffer对象并在单独的线程中直接访问数据(无副本)。理想的解决方案是对字符串数据执行相同的操作,从而避免在主线程中复制任何字符串。

标签: c++node.jsmultithreadingnode.js-addon

解决方案


ArrayBuffer 或 TypedArray的使用可能会通过避免内存复制来最大限度地减少内容重复,这是一个示例。

https://github.com/msatyan/MyNodeC/blob/master/src/mync1/ArrayBuff.cpp https://github.com/msatyan/MyNodeC/blob/master/test/TestArrayBuff.js

为了避免阻塞 node.js 主线程,您可以通过将繁重的任务委托给线程来引入异步操作。下面的 StackOverflow 帖子通过使用 Promise 提供了此类场景的示例。

如何使用返回 Promises 的 NAPI 创建异步函数


推荐阅读