2015-02-17 23 views
5

Tôi đã thừa kế một thư viện gần đây, có một phương thức cập nhật tồn tại trên một lớp học. Đây là một ví dụ.Tối ưu hóa vi mô, liệu nó có được tối ưu hóa bởi các trình duyệt hiện đại không?

onPointerMove(pointer, x, y, isPressed){ 
    var floor = Math.floor; 
    var cx = this.currentX; 
    var cy = this.currentY; 
    var tm = this.toolManager; 
} 

Loại mã này chủ yếu chỉ tồn tại trên các nội dung quan trọng về hiệu suất. Hầu hết các phần còn lại của dự án không được viết theo cách này.

  1. Sàn được sử dụng hai lần. Chắc chắn bộ nhớ đệm nó trong một biến địa phương chỉ đơn giản là lực lượng phân bổ bộ nhớ "tạm thời" mỗi khi nó được chạy? Làm thế nào là nhanh hơn chỉ đơn giản là tìm kiếm một chức năng?
  2. This.currentX được tham chiếu nhiều lần trong phần thân của hàm nhưng bộ nhớ đệm thực sự nhanh hơn? Tôi đã có thể nghĩ rằng this.currentX liên quan đến không có vấn đề tra cứu nhưng có lẽ tôi sai. Vì điều này đang xảy ra với mã còn lại trong ví dụ, tất cả các thuộc tính này được lưu trữ.

Có bất kỳ điều này thực sự quan trọng hơn nữa trên các công cụ JavaScript hiện đại không? Tôi sẽ giả định rằng các tối ưu hóa như thế này, nếu chúng được nhanh hơn .... Sẽ được thực hiện như là một cho tối ưu hóa anyway bên trong V8. Ví dụ, nếu Math.round được gọi là 20 lần trong một hàm, thì công cụ sẽ cache nó? Tôi cũng mong đợi những thứ như caching một chiều dài trước khi bạn "cho nó" cũng là một ví dụ khác về những gì tôi cho là tối ưu hóa động cơ để làm anyway khi giải thích mã (một lần nữa, chỉ nếu nó thậm chí làm cho một sự khác biệt).

Tất cả những gì tôi thực sự muốn biết là ... từ ngày này trở đi, tôi có nên thực hiện các Tối ưu hóa vi mô này (cho các trình duyệt thường xanh) và tối ưu hóa mã của mình hay không. Hiệu suất JavaScript)

Cảm ơn!

+1

Không tối ưu hóa (đặc biệt: hy sinh khả năng đọc/bảo trì) trừ khi bạn gặp sự cố và bạn đã sử dụng trình thu thập thông tin để tìm ra nút cổ chai/vấn đề. Bằng cách này: bạn có thể trả lời hầu hết, nếu không phải tất cả, của các câu hỏi trong bài viết của bạn nếu bạn chỉ đơn giản là sử dụng một hồ sơ (hoặc các phương tiện đo). Chỉ cần tạo một testcase và profile/đo nó. Đơn giản như thế. Tôi sẽ trỏ bạn đến [jsperf.com] (http://jsperf.com/) nhưng hiện tại nó đã bị hỏng. – RobIII

+0

Cảm ơn bạn đã chỉ ra hồ sơ RobIII! Tôi đã thêm nó vào danh sách việc cần làm của mình để hiểu rằng quá trình đó tốt hơn. – Clark

Trả lời

3

Không tối ưu hóa sớm. Trừ khi một số hồ sơ cho thấy rằng những điều này trong mã thực sự gây ra một số loại nút cổ chai, hoặc sử dụng tài nguyên không cân xứng, đừng bận tâm tối ưu hóa chúng theo lý thuyết về hiệu suất.

Đối với hiệu suất thực tế: tra cứu thuộc tính đối tượng (chẳng hạn như Math.floor hoặc this.currentX) là o (1) hoạt động, vì chúng là các tra cứu hashmap hiệu quả. Lưu chúng vào một biến như vậy trông giống như tăng cường khả năng đọc hơn bất cứ thứ gì.