2013-12-13 54 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

總是一個好主意來驗證事情:) –