2013-04-17 23 views
6

Để truy cập dữ liệu trong một mảng, tôi đã tạo một biến số enum để có số nhận dạng có thể đọc được của con người đối với các trường.Tại sao "enum" bị đóng băng chậm hơn?

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

Khi tôi phát hiện ra về Object.freeze Tôi muốn sử dụng này cho enum để nó không thể thay đổi, và tôi mong đợi VM sử dụng thông tin này để lợi thế của nó.

Khi nó quay ra, các thử nghiệm sẽ chậm hơn trên Chrome và Nút, nhưng nhanh hơn một chút trên Firefox (so với truy cập trực tiếp theo số).

Mã này có sẵn ở đây: http://jsperf.com/array-access-via-enum

Sau đây là các tiêu chuẩn từ Node (tương ứng với các bài kiểm tra JSPerf):

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

Liệu V8 chỉ chưa có một thực hiện rất tốt, hoặc là có một cái gì đó suboptimal với phương pháp này cho trường hợp sử dụng của tôi?

+1

Dường như phân tích mã tĩnh của V8 khá tốt và dịch các truy cập enum 'cột' thành các số cố định. Nó không làm điều đó với đối tượng enum 'frozen' vì nó bị biến đổi bởi' Object.freeze' - FF có vẻ thông minh hơn ở đó. – Bergi

Trả lời

4

Tôi đã thử nghiệm của bạn trong Firefox 20, nhanh hơn rất nhiều trên bảng và IE 10 nhanh hơn và ổn định hơn.

Vì vậy, câu trả lời của tôi là Không, V8 vẫn chưa có một thi lớn

+0

Và vì một số lý do kỹ thuật, đôi khi mọi người trì hoãn một số tính năng/cải tiến mới của V8 trong một thời gian. Có thể thay đổi trong đối tượng địa lý. – TheHippo

1

Theo bugreport này, đóng băng một đối tượng hiện đang đặt nó trong "từ điển-mode", mà là chậm.

Vì vậy, thay vì cải thiện hiệu suất, nó sẽ trở thành một sự suy giảm rõ ràng cho "enums"/mảng nhỏ.

Các vấn đề liên quan