2012-04-16 44 views
5

Tôi đã làm việc trên dự án web trong 4 tháng qua. Để tối ưu hóa hiệu suất mã, chúng tôi đã sử dụng một mẫu. Nghi ngờ của tôi là, nó có thực sự tăng hiệu suất hay không?javascript đối tượng này

khi nào chúng tôi phải sử dụng đối tượng this mà chúng tôi gán cho biến cục bộ và sử dụng.

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

giả định ở đây là, gán đối tượng this cho biến ngăn xếp cục bộ sẽ tăng hiệu suất.

Tôi chưa thấy loại mã hóa này ở bất kỳ đâu nên nghi ngờ nếu nó không được sử dụng.

EDIT: Tôi biết rằng việc gán đối tượng này cho biến cục bộ được thực hiện để bảo toàn đối tượng, nhưng đó không phải là trường hợp của chúng tôi.

+1

Điều này cực kỳ phổ biến trong nội dung của Node.js. Nhưng đó là nhiều hơn để giữ một tham chiếu trong callbacks, như trái ngược với một tăng hiệu suất tôi tin. – Chad

+1

Tôi sẽ đoán rằng điều này thực sự là * tồi tệ hơn * cho hiệu suất. Trình biên dịch đóng cửa của Google (với các tối ưu hóa nâng cao) sẽ loại bỏ khai báo var và thay thế các trường hợp 'thisObject' bằng' this', mặc dù sử dụng biến sẽ thường dẫn đến kích thước được rút gọn nhỏ hơn. Trình biên dịch đóng cửa tối ưu hóa cho tốc độ và kích thước, nhưng dường như ủng hộ tốc độ trên kích thước khi nó có một sự lựa chọn. –

Trả lời

7

Mặc dù đây là thực tiễn phổ biến trong Javascript, nhưng không phải không phải là vì lý do hiệu suất. Việc tiết kiệm đối tượng this ở một tên khác được đặt tên cục bộ thường được thực hiện để duy trì giá trị của this qua các lần gọi lại được xác định trong hàm.

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

hay không thisObject === this để đánh giá đúng sẽ phụ thuộc vào cách nó được gọi là

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

chúng tôi đã sử dụng mẫu này trong các chức năng đơn giản mà không có bất kỳ callbacks hay như vậy. những gì tôi muốn biết là nó có bất kỳ tăng hiệu suất? –

+0

@TejeshAlimilli nó rất không chắc rằng điều này có bất kỳ sự khác biệt hiệu suất đáng chú ý – JaredPar

+0

Cảm ơn. thats những gì tôi muốn biết. –

0

Ngay cả khi loại tối ưu hóa có tác dụng (tích cực), thì rất có thể phụ thuộc vào người phiên dịch.

Bản phát hành khác có thể hoàn nguyên kết quả.

Tuy nhiên, cuối cùng bạn nên đo lường, không đoán.

2

Như với TẤT CẢ các câu hỏi về hiệu suất, chúng cần được kiểm tra bằng cách thực sự đo lường hiệu suất. Trong một rather simple test case (mã thực tế của bạn có thể khác nhau một số), tôi tìm thấy kết quả khác nhau trên các trình duyệt:

enter image description here

Chrome và Firefox không có sự khác biệt rất nhiều giữa hai bài kiểm tra, nhưng sự khác biệt chút ít là ở đối diện hướng giữa hai người. IE9 cho thấy thử nghiệm bằng cách sử dụng một bản sao đã lưu của this mà tôi gọi là self chậm hơn đáng kể.

Không có chênh lệch hiệu suất đáng kể và nhất quán trong Chrome và Firefox và IE9 cho thấy trường hợp thử nghiệm this nhanh hơn đáng kể, tôi nghĩ bạn có thể kết luận rằng mẫu thiết kế bạn hỏi không mang lại hiệu suất nhất quán trên các trình duyệt.

Trong mã của mình, tôi lưu một bản sao this vào một biến khác chỉ khi tôi cần nó cho một tham chiếu nhất quán đối tượng gốc bên trong trình xử lý sự kiện nội tuyến, gọi lại hoặc phương thức trong đó this đã được đặt thành thứ khác. Nói cách khác, tôi chỉ áp dụng mẫu thiết kế này khi cần thiết. Trong một previous discussion of this design pattern here on SO, một số thư viện sử dụng mẫu thiết kế này để cho phép giảm thiểu tối đa vì không thể giảm thiểu tối thiểu bốn ký tự bên dưới bốn ký tự, nhưng gán nó cho biến cục bộ có thể được rút gọn thành tên biến ký tự đơn.

+0

Opera dường như vi tối ưu hóa trường hợp kiểm tra, chúng đang chạy chính xác theo thời gian :-) – Bergi

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