由于性能开销而替换 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的主要内容,如果未能解决你的问题,请参考以下文章
Linux 操作系统原理 — NUMA 架构中的多线程调度开销与性能优化