2009-04-14 43 views
6

Các bạn có thể giúp tôi xác định sự khác biệt về hiệu suất của mỗi câu trong số các câu lệnh này không? Bạn sẽ sử dụng cái nào?Câu hỏi về Hiệu suất của Câu lệnh JavaScript

  1. Làm một mảng mới sử dụng

    - var new_list = new Array(); or 
    - var new_list = [] 
    
  2. Phụ thêm yếu tố sử dụng

    • push ('a')
    • new_list [i]; (Nếu tôi biết chiều dài)
  3. hành ternary hoặc if() {} else() {}

  4. Đang cố gắng để làm cho isodd chức năng, đó là nhanh hơn
    (! (Is_even)) hoặc (x% 2! = 0)

  5. foreach hoặc lặp đi lặp lại bình thường

thêm một

  1. a = b = 3; hoặc b = 3; a = b;

[chỉnh sửa: Im tạo Thư viện toán học. Vì vậy, bất kỳ cuộc thảo luận về hiệu suất nào cũng được hoan nghênh :)]

Cảm ơn sự giúp đỡ của bạn.

+0

Tôi thích sử dụng 'var myArray = [];' bởi vì nó đơn giản hơn ... –

Trả lời

4

Đặc điểm hiệu suất cho tất cả trình duyệt (đặc biệt là ở cấp độ chức năng thư viện cá nhân) có thể thay đổi đáng kể, do đó rất khó đưa ra câu trả lời có ý nghĩa thực sự.

Anyhoo, chỉ cần nhìn vào nhanh js động cơ (do Nitro, TraceMonkey, và V8)

  1. [ ] sẽ nhanh hơn so với new Array-new Array biến thành logic sau

    1. cons = thuộc tính tra cứu "Mảng", nếu không tìm thấy nó, hãy ném một ngoại lệ
    2. Kiểm tra xem nếu cons có thể được sử dụng như một nhà xây dựng, nếu không muốn nói: ném một ngoại lệ
    3. thisVal = runtime tạo ra một đối tượng mới trực tiếp
    4. res = kết quả của gọi cons qua thisVal làm giá trị cho this - đòi hỏi logic để phân biệt chức năng JS từ các hàm thời gian chạy chuẩn (giả sử các hàm thời gian chạy chuẩn không được triển khai trong JS, đây là trường hợp bình thường). Trong trường hợp này, Array là một hàm tạo bản địa sẽ tạo và trả về một đối tượng mảng thời gian chạy mới.
    5. nếu res không xác định hoặc không thì kết quả cuối cùng là thisVal nếu không kết quả cuối cùng là res. Trong trường hợp gọi Array một đối tượng mảng mới sẽ được trả lại và thisVal sẽ được vứt bỏ

    [ ] chỉ nói động cơ JS để trực tiếp tạo ra một đối tượng mảng runtime mới ngay lập tức với không có logic bổ sung. Điều này có nghĩa là new Array có một số lượng lớn logic bổ sung (không phải rất rẻ), và thực hiện và phân bổ đối tượng không cần thiết bổ sung.

  2. newlist[newlist.length] = ... là nhanh hơn (đặc biệt. Nếu newlist không phải là một mảng thưa thớt), nhưng đẩy đủ thông thường đối với tôi mong đợi các nhà phát triển động cơ đặt khá một chút công sức vào việc cải thiện hiệu suất để thay đổi này thể trong thời gian.

  3. Nếu bạn có một vòng lặp đủ chặt chẽ có thể có một chiến thắng rất nhẹ để các nhà điều hành ternary, nhưng cho là đó là một lỗ hổng cơ trong trường hợp trival của a = b ? c : d vs if (b) a = c; else a = d

  4. Chỉ cần chức năng gọi overhead mình sẽ lùn chi phí của nhiều hoặc ít hơn bất kỳ nhà điều hành JS, ít nhất là trong các trường hợp lành mạnh (ví dụ: bạn đang thực hiện số học trên các số thay vì đối tượng)

  5. Cú pháp foreach chưa được chuẩn hóa nhưng hiệu suất cuối cùng của nó sẽ phụ thuộc trên một số lượng lớn các chi tiết; Các ngữ nghĩa JS thường dẫn đến các câu lệnh tìm kiếm hiệu quả kém hiệu quả hơn - ví dụ như. for (var i in array) ... chậm hơn for (var i = 0; i < array.length; i++) ... vì ngữ nghĩa JS yêu cầu in liệt kê để xây dựng danh sách tất cả các thuộc tính trên đối tượng (bao gồm chuỗi nguyên mẫu) và rồi kiểm tra để đảm bảo rằng mỗi thuộc tính vẫn nằm trên đối tượng trước khi gửi thông qua vòng lặp. Oh, và các thuộc tính cần phải được chuyển đổi từ số nguyên (trong trường hợp mảng anyway) thành chuỗi, mà chi phí thời gian và bộ nhớ.

4

tôi muốn đề nghị bạn viết mã một kịch bản đơn giản như:

for(var i = 0; i < 1000; i++){ 
    // Test your code here. 
} 

Bạn có thể chuẩn bất cứ điều gì bạn muốn như vậy, có thể bổ sung thêm các chức năng thời gian trước và sau khi tuyên bố for được chính xác hơn.

Tất nhiên, bạn sẽ cần phải tinh chỉnh giới hạn trên (1000 trong ví dụ này) tùy thuộc vào tính chất hoạt động của bạn - một số sẽ yêu cầu lặp lại nhiều hơn, số khác ít hơn.

+0

Tôi đã làm điều này trước đây, và tôi có một vài lời khuyên. Đầu tiên, thử nghiệm trong nhiều trình duyệt, vì chúng có các công cụ JS khác nhau. Thứ hai, bạn sẽ cần hơn 1000 lần lặp để xem bất kỳ kết quả nào. Và thứ ba, bạn sẽ phải tắt cảnh báo tập lệnh trên các trình duyệt như IE. –

+0

Ngoài ra, mỗi trình duyệt theo dõi thời gian khác nhau (không chính xác). Giống như, tôi nghe nói rằng có những trường hợp khi IE sẽ bỏ qua thời gian ít hơn 15ms. –

3
  1. Cả hai đều là các nhà xây dựng gốc có thể không có sự khác biệt.
  2. đẩy nhanh hơn, nó ánh xạ trực tiếp đến nguồn gốc, nơi như [] là Evaluative
  3. Có lẽ không có nhiều sự khác biệt, nhưng về mặt kỹ thuật, họ không làm điều tương tự, vì vậy nó không táo để táo
  4. x% 2, bỏ qua cuộc gọi hàm tương đối chậm
  5. Tôi đã nghe, mặc dù không thể tìm thấy liên kết tại thời điểm này, lặp lại đó nhanh hơn foreach, điều này khiến tôi ngạc nhiên.

Edit: On # 5, tôi tin rằng lý do có liên quan đến this, trong đó foreach được lệnh về phía trước, đòi hỏi các incrementor để đếm về phía trước, trong khi cho vòng được bao giờ nên infinitesimally nhanh hơn khi họ đang chạy ngược:

for(var i=a.length;i>-1;i--) { 
    // do whatever 
} 

ở trên là hơi nhanh hơn:

for(var i=0;i<a.length;i++) { 
    // do whatever 
} 
+0

Bạn phải giống như ninja javascript này. Số 5 là điều gây sốc nhất. có bất kỳ hack hiệu suất nào khác mà bạn đề xuất không. – unj2

+0

Trên thực tế, nó khá đơn giản là tại sao, bạn cần đánh giá a.length cho mỗi lần lặp, trong khi với lần đầu tiên bạn chỉ lấy nó đi ban đầu và thử nghiệm với số không. – cgp

+1

A cho # 5, có một phương án khác dựa trên ví dụ đầu tiên của bạn: var l = data.length; cho (var i = 0; i

1

Áp phích khác như đề nghị, tôi nghĩ làm một số điểm chuẩn thô được đặt cược tốt nhất của bạn ... Tuy nhiên, tôi muốn cũng lưu ý rằng bạn sẽ p robably có được kết quả rất khác nhau từ các trình duyệt khác nhau, vì tôi chắc chắn hầu hết các câu hỏi mà bạn yêu cầu đều đi đến việc triển khai nội bộ cụ thể của các cấu trúc ngôn ngữ chứ không phải chính ngôn ngữ đó.

5

Tôi luôn giả định rằng vì (x & 1) là một thao tác bitwise, nó sẽ là cách nhanh nhất để kiểm tra các số chẵn/lẻ, thay vì kiểm tra phần còn lại của số.

1

Bạn có thể quan tâm đến this question và câu trả lời cho số

+0

Haha, tôi nghĩ "ooh có thể thú vị" sau đó phát hiện ra tôi là câu trả lời hàng đầu: - / – olliej