c++ - 节点原生插件:在工作线程中将字符串参数转换为 UTF-8
问题描述
我有一个高性能节点应用程序,主线程中不必要地阻塞的每一毫秒都是有害的。大多数繁重的处理都是在 C++ 本机节点插件中完成的。效果很好。
有时,Javascript 代码需要将很长的字符串传递给插件 C++ 代码。困扰我的(通过分析验证)是当(复制&)将(非常长的)字符串转换为 UTF-8 时,主线程中有一个重要的块,然后副本最终被卸载到工作线程。
是否可以将复制和转换卸载到工作线程?
我知道通常一个人可能不会从一个单独的线程访问 Javascript 对象,但这不是一个硬性规则(正如一些人所建议的那样)。例如,可以(并且常见)Persistent
引用一个Buffer
对象并在单独的线程中直接访问数据(无副本)。理想的解决方案是对字符串数据执行相同的操作,从而避免在主线程中复制任何字符串。
解决方案
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 提供了此类场景的示例。
推荐阅读
- .net - 在 .net 中使用 Kafka 进行 Pact 测试的任何示例
- python - 如何确定终端是否可以在 python 中显示颜色?
- swift - MailChimp PATCH 请求
- ruby-on-rails - 如何将 has_one_attached 转换为 has_many_attached 到带有 has_one attachemnts 的现有表?
- r - R脚本“找不到命令?”
- react-native - 导入/导出错误?找不到“组件”、“getComponent”或“儿童”道具
- javascript - (x) 秒后移动图像
- mysql - 在 SQL 中编写多个子查询是否有更好的选择?
- python - os.environ.get 返回 None 而终端返回正确的环境变量
- c# - 每当我尝试从当前目录读取文件时都会引发 System.IO.FileNotFoundException