Tôi đang tải một tập tin script thông qua AJAX, và để chạy nội dung của nó Tôi đang làm điều này:Sử dụng của `Function` và hiệu suất mới phát
new Function('someargument',xhr.responseText)(somevalue);
Tuy nhiên, theo MDN:
Function
đối tượng được tạo bằng hàm tạoFunction
được phân tích cú pháp khi hàm được tạo. Điều này kém hiệu quả hơn việc khai báo một hàm và gọi nó trong mã của bạn, bởi vì các hàm được khai báo với câu lệnh hàm được phân tích cú pháp với phần còn lại của mã.
Tôi thực sự không hiểu lắm. Nếu một hàm được khai báo, nó vẫn phải được phân tích cú pháp từ định dạng chuỗi của tệp, vậy tại sao một chuỗi được tải qua new Function
sẽ kém hiệu quả hơn?
Điều này thực sự là một điều tò mò đối với tôi. Tôi có thể hiểu tại sao nó sẽ là xấu trong một vòng lặp (phải tái phân tích cùng một chuỗi), nhưng đối với một cái gì đó như thế này tôi không nghĩ rằng có bất kỳ vấn đề, là có?
Nó được phân tích cú pháp gần giống như eval, được biết là chậm. Tôi * giả sử * nó sẽ nhanh hơn một chút, vì không phải móc nối chuỗi phạm vi. – bfavaretto
Không gửi các chức năng bằng AJAX, gửi dữ liệu. Có các hàm của bạn được định nghĩa trong _.js_ hoặc '
Tôi nghĩ rằng những gì họ đang nói là nếu bạn sử dụng các nhà xây dựng chức năng trong mã của bạn như thế này:
Cơ quan chức năng được phân tách hai lần: lần đầu tiên như là một chuỗi khi mã được nạp, và lần thứ hai khi hàm được xây dựng khi chạy. Trong trường hợp của bạn, bạn đang tạo hàm từ phản hồi ajax sau khi mã đã được phân tích cú pháp, vì vậy thực sự là một thỏa thuận hoàn toàn khác.
Nguồn
2013-05-08 01:37:58
Tôi không biết tác giả của bài viết MDN đó là gì, nhưng đây là một cách diễn giải.
Nhiều phiên dịch JS hiện đại sử dụng trình biên dịch tối ưu hóa để tạo mã gốc.
Ví dụ, "JavaScriptCore, the WebKit JS implementation" nói:
Trình biên dịch tối ưu hóa hoàn chỉnh hơn có mã biên dịch, càng tối ưu hóa nó có thể thực hiện, vì vậy chức năng tối ưu hóa càng cao. Ví dụ, nếu bạn biết rằng mọi tham chiếu đến một hàm được sử dụng để gọi nó ngay lập tức với một chuỗi như là đối số duy nhất của nó bởi vì nó được định nghĩa trong một cơ thể hàm nghiêm ngặt, thì bạn có thể tránh phân bổ một đối tượng hàm cho nó và thực hiện một số tối ưu hóa trong cơ thể của nó.
Khi bạn gọi
new Function
, trình biên dịch tối ưu hóa không nhận được ngữ cảnh cần thiết để thực hiện những điều đó và các tối ưu hóa khác.Nguồn
2013-05-08 01:48:48
Được rồi, vậy điều này sẽ áp dụng như thế nào với tình huống của tôi: Mã sử dụng 'hàm mới' là trình tải trước và mã được phân tích cú pháp là tập lệnh thực tế cho trò chơi tôi đang làm việc. –
@Kolink, nó có áp dụng cho trường hợp của bạn không? Bạn đã đo điểm chuẩn để xem liệu nó có tác động hiệu suất nào không? Không đưa ra quyết định hiệu suất mà không có dữ liệu khi dữ liệu dễ thu thập. Chỉ cần thử những gì bạn có và tương đương bằng cách sử dụng '
Các vấn đề liên quan