2013-12-13 16 views
0

我有一个函数可以生成一个从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]))?

+1

“这是不是检查数组的内容更加昂贵” ---你花更多的时间写这个问题比它会采取设立jsperf.com PS测试:一般的例外是贵 – zerkms

+0

几乎是肯定的。现代JavaScript实现可以很好地优化比较。我不知道有任何优化异常的实现。只在异常对象中构建堆栈跟踪可能值得几十万比较。 –

+0

为什么不简单地返回'null',一个空字符串或类似的东西?这将只需要一个比较... – Bergi

回答

0

性能结果会因运行环境而异。因此,不同的浏览器,操作系统等都可能产生影响。尽管如此,通常抛出异常是一件非常昂贵的事情(想想构建堆栈轨迹,生成对象等所涉及的所有工作)。所以在大多数情况下,如果可以的话,最好使用比较。

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

+1

感谢您的回答。我创建了一个[jsperf](http://jsperf.com/js-exception-vs-array-comparison),强化了你的陈述。 – nietonfir

+0

总是一个好主意来验证事情:) –