2013-05-08 22 views
5

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ạo Function đượ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ó?

+2

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

+0

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 '

6

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:

new Function('bar', 'console.log(bar);')); 

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.

1

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:

Trong trường hợp đó có được phân tầng lập giữa ba hình thức: phân tích ban đầu và biên soạn sản xuất bytecode, có thể được tối ưu hóa với các phương pháp JIT, có thể được tối ưu hóa bởi DFG JIT. Tuy nhiên, trên thực tế, trên hầu hết các nền tảng, trình thông dịch không được bao gồm, để tất cả các mã chạy qua phương thức JIT.

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.

+0

Đượ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. –

+1

@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 '