2013-04-17 63 views
6

爲了訪問數組中的數據,我創建了一個類似於enum的變量,使字段具有人類可讀標識符。爲什麼凍結的「枚舉」會變慢?

var columns = { first: 0, second: 1 }; 
var array = ['first', 'second']; 
var data = array[columns.first]; 

當我發現了Object.freeze我想用這個枚舉,以便它不能被改變,我預計VM使用此信息,以它的優勢。

事實證明,測試在Chrome和Node上變慢,但在Firefox上略快(與按數字直接訪問相比)。

的代碼可以在這裏找到:http://jsperf.com/array-access-via-enum

下面是從節點的基準(對應於JSPerf測試):

fixed Number: 12ms 
    enum: 12ms 
    frozenEnum: 85ms 

不V8只是尚未有一個偉大的實現,或者是有什麼這種方法對我的用例來說不是最理想的嗎?

+1

看來V8的靜態代碼分析是相當不錯的,並且將列的枚舉訪問轉換爲固定數字。它不會使用'frozen'枚舉對象,因爲它被Object.freeze改變 - FF看起來更聰明。 – Bergi

回答

4

我試過了你在Firefox 20中的測試,它大大加快了整個板子的速度,並且IE 10的測試速度稍快一些。

所以我的答案是沒有,V8還沒有一個偉大的實施

+0

由於某些技術原因,節點人員有時會暫時推遲一些新的V8功能/改進。可以改變功能。 – TheHippo

1

根據這一bugreport,凍結對象目前所說的「字典方式」,這是緩慢的。

因此,不是改善性能,而是「枚舉」/小陣列的明顯放緩。