由于性能开销而替换 nodejs 中的 try/catch

Posted

技术标签:

【中文标题】由于性能开销而替换 nodejs 中的 try/catch【英文标题】:Replacement for try/catch in nodejs due to performance overhead 【发布时间】:2014-10-30 05:16:28 【问题描述】:

我目前正在使用try/catch to handle JSON.parse errors。但是我最近在阅读了一些best practices 后发现在nodejs 上使用try/catch 有一些performance overhead。性能开销是否已经修复,是否有另一种方法可以在不使用 try/catch 的情况下避免 JSON.parse 上的错误?

【问题讨论】:

如果你不将JSON.parse 包裹在try-catch 中,它会在荒野中抛出一个错误——所以你必须在其他地方捕获它。因此,该答案中显示的技术是正确的。 相关:programmers.stackexchange.com/questions/144326/… 【参考方案1】:

没有您自己的解析器,没有简单的方法可以避免 try-catch。

试试这个性能测试: http://jsperf.com/try-catch-performance-overhead

使用 Chrome 进行测试,因为 NodeJS 只是 V8。就我而言,有 41% 的性能损失。但是,除非您打算每秒读取数千个 JSON,否则我建议您只使用标准的 try-catch 并使您的代码可读。

请注意,对于 Firefox,这 3 个测试之间几乎没有区别。

【讨论】:

我已经在我的问题中声明了该网址。不过谢谢。【参考方案2】:

使用 try/catch 构造而不是回调错误函数的问题是 try/catch 无法捕获异步事件,并且在捕获异常时可能会泄漏太多数据。

最佳实践是在同步事件中使用 try/catch:

try

  dangerous.function();

catch(error);

  console.log(error);

以及异步触发事件的回调函数:

dangerous.function(function(error)

  console.log(error);
);

【讨论】:

“导致数据过多”是什么意思? 就像,从我听到的内容中泄露你的整个堆栈跟踪。

以上是关于由于性能开销而替换 nodejs 中的 try/catch的主要内容,如果未能解决你的问题,请参考以下文章

有效地存储数据以节省内存使用量,而无需 C# 中的查找开销

Linux 操作系统原理 — NUMA 架构中的多线程调度开销与性能优化

Linux 操作系统原理 — 进程管理 — NUMA 架构中的多线程调度开销与性能优化

nodejs中的fiber(纤程)库详解

使用nodejs替换文件中的多个字符串

java Vector