Để 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?
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