【问题标题】:Catching an exception instead of comparing array values for performance?捕获异常而不是比较数组值的性能?
【发布时间】:2013-12-13 09:01:50
【问题描述】:

我有一个函数可以生成从 3x3 矩阵中的一个位置到另一个位置的路径,这样我就可以在方向变化时平滑地为图像过渡设置动画。它返回一个数组,其中包含在 CSS 类中翻译的定位参数,例如:["top left vert", "left slow", "left"]。在我的动画逻辑中的后续 setTimout() 调用中处理过渡。

在移动循环结束时,相关元素返回到停止位置。此转换不由生成路径的函数处理,而是引发异常。在我的动画逻辑中,我有一个 try/catch 块,如果抛出异常,我将忽略它。这样我就知道我必须执行停止转换:

var move = moveClass.join(" ");
try {
    move = updateDirection(move);
} catch(e) {}

if (move instanceof Array) {…} else {/* stop */}

该函数可以返回数组中的相同位置,而不是抛出异常,我将不得不比较数组的元素(而不是使用instanceof Array)。

我知道不应该像这样滥用异常。 ;-) 我的问题是:这是否比检查数组的内容更昂贵(例如if (move[0] == move[1] && move[0] == move[2]))?

【问题讨论】:

  • “这比检查数组的内容更昂贵吗” --- 你写这个问题的时间比在 jsperf.com 上设置测试花费的时间还要多 PS:通常例外是昂贵的
  • 几乎可以肯定。现代 JavaScript 实现可以很好地优化比较。我不知道有任何优化异常的实现。仅仅在异常对象中构建堆栈跟踪可能值得几十万次比较。
  • 为什么不简单地返回null,一个空字符串等?那只需要一个比较……
  • @Bergi 因为该函数必须在某些部分重写,因为稍后将数组转换为相应的类。
  • @nietonfir:你能不能展示一下整个函数代码?

标签: javascript performance exception-handling


【解决方案1】:

性能结果会因运行环境而异。因此不同的浏览器、操作系统等都会产生影响。

话虽如此,通常抛出异常是一件相当昂贵的事情(想想构建堆栈跟踪、生成对象等所涉及的所有工作)。所以在大多数情况下,如果可以的话,最好使用比较。

作为大多数(如果不是所有)语言的一般设计原则,异常应该就是这样 - 规范的异常。您不应该使用它们来控制程序的常规流程,而应该使用它们来处理罕见的异常情况或异常情况,通常涉及错误、失败或某种错误。

【讨论】:

  • 感谢您的回答。我创建了一个 jsperf 来强化你的陈述。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多