2008-10-17 22 views
31

Vấn đề nằm trong tiêu đề - IE đang hoạt động sai và đang nói rằng có một tập lệnh chạy chậm - FF và Chrome không gặp sự cố này.một tập lệnh trên trang này đang gây ra tức là chạy chậm

Tôi làm cách nào để tìm sự cố. Có rất nhiều JS trên trang đó. Kiểm tra bằng tay không phải là một ideea tốt

EDIT: Đó là một trang từ một dự án tôi đang làm việc ... nhưng tôi cần một công cụ để tìm sự cố.

Kết thúc: Hóa ra là UpdatePanel - bằng cách nào đó nó sẽ bị "nhầm lẫn" và mất quá nhiều thời gian để xử lý điều gì đó. Tôi vừa ném nó ra ngoài cửa sổ - sẽ chỉ sử dụng JQuery từ bây giờ: D.

Và tôi đang chọn câu trả lời của Remy Sharp bởi vì tôi thực sự không biết về công cụ và nó có vẻ khá thú vị.

+1

http://support.microsoft.com/kb/175500 –

+0

Cảm ơn, đó là câu trả lời tôi đang tìm kiếm. Tôi đã tạo một trang sẽ chạy trên một máy cục bộ cho một khách hàng và nó rất JS chuyên sâu (cho phép tìm kiếm/sắp xếp 100.000 bản ghi), vì vậy thực sự không có cách nào để "tối ưu hóa" thêm nữa, nó chỉ là vấn đề của rất nhiều dữ liệu đang được vận hành. – jsuggs

Trả lời

18

Có được cho mình một bản sao của IBM Trang Profiler:

https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=61d74777-1701-4014-bfc0-96067ed50156

Nó hoàn toàn miễn phí (luôn luôn là một chiến thắng). Bắt đầu nó trong nền, cho nó một vài giây, sau đó làm mới trang trong IE. Quay trở lại profiler và nó sẽ liệt kê tất cả các tài nguyên được sử dụng trên trang và cung cấp cho bạn thông tin hồ sơ chi tiết - đặc biệt khi JavaScript mất nhiều thời gian để thực thi.

Nó sẽ là một khởi đầu tốt để tìm ra nguồn gốc của vấn đề của bạn.

Nếu thẻ tập lệnh nội tuyến, tôi khuyên bạn nên tạo bản sao cục bộ của tệp và tách các thẻ tập lệnh ra để tách các tệp nếu bạn có thể.

+2

Tôi có thể thiếu một cái gì đó, nhưng công cụ bạn liên kết không xuất hiện để làm hồ sơ javascript bạn đề nghị. Tất cả những gì nó làm là cung cấp thông tin chi tiết về những tài nguyên nào đã được tải. – andynormancx

+0

Công cụ này dùng để phân tích toàn bộ trang. Vì vậy, nó phá vỡ các thành phần riêng lẻ, cho tôi biết thời gian yêu cầu, thời gian giao hàng và kết xuất (hoặc thời gian xử lý) - cả trên bộ nhớ cache trống và mồi. Điều này sẽ giúp xác định các thành phần chậm và giúp điểm chuẩn bất kỳ thay đổi nào bạn thực hiện. –

+1

nhưng làm thế nào có thể cung cấp cho các giải pháp cho vấn đề này là vấn đề này là do một số ong chạy javascript hoặc vòng lặp vô hạn trong trang mã khối profiler chỉ gicves phần mạng của nó –

9

Xóa một nửa mã và xem mã vẫn còn xảy ra hay không. Nếu không, đó là một nửa bạn đã loại bỏ. Lặp lại cho đến khi bạn tìm ra khối mã nào đang gây ra sự cố.

+2

đã cố gắng này - nhưng vẫn không có may mắn ... sẽ tiếp tục cố gắng. Tôi đã hy vọng cho một công cụ của một số loại. – sirrocco

+0

Đã làm việc cho tôi. thủ phạm là selectivizr. Đây là sửa chữa: - https://github.com/keithclark/selectivizr/pull/51/files – BenG

3

Nó thường là một vòng lặp vô hạn gây ra điều này. Kiểm tra vòng lặp của bạn và điều kiện thoát của họ.

0

Tôi không tin rằng có một công cụ có thể tìm thấy tập lệnh vi phạm. Bạn có thể thử đính kèm một trình gỡ lỗi IE như Visual Studio và có thể nó sẽ phá vỡ tại thời điểm xảy ra sự cố. Nhưng tôi không thể đưa ra bất kỳ đảm bảo nào về việc đó.

Trong quá khứ khi tôi gặp sự cố tương tự, tôi đã chỉ đơn giản nhận xét các phần mã để kiểm tra thu hẹp nơi xảy ra sự cố, thường trong mẫu kiểu tìm kiếm nhị phân. Nhận xét một nửa số thư viện javascript, v.v.

Ngoài việc đó như những người khác đã nói, loại sự cố này xảy ra từ các vòng lớn và nhiều cuộc gọi hàm setTimeout hoặc vòng lặp đệ quy setTimeout.

0

Nếu javascript liên kết xử lý trang trong hơn 10 giây, bạn sẽ nhận được thông báo này. IE rõ ràng có một động cơ javascript chậm hơn, gây ra điều này.

Tôi đoán rằng một số tối ưu hóa mã chắc chắn sẽ hữu ích và thử giảm số lượng thực thi javascript khi tải trang. Có lẽ sử dụng setTimeout() để trì hoãn việc xử lý một số thứ không cần thiết nếu bạn phải.

Theo như các công cụ, hãy sử dụng trình thu thập dữ liệu của Firebug để xem bạn đang dành nhiều thời gian ở đâu.

+0

Vấn đề là nó không chờ đợi trong 10 giây .. có thể 2-3 giây trước khi hiển thị thông báo. Nhưng ... cho đến thứ hai tôi sẽ không có cách nào để kiểm tra ... sẽ cập nhật vào thứ hai. – sirrocco

+0

Nếu đúng như vậy, có thể bạn đang ở trong vòng lặp vô hạn. Để chứng minh điều này, bạn có thể thử Firefox trên một máy thực sự, chậm hoặc IE trên một máy thực sự nhanh. –

+0

Bạn có bất kỳ tham chiếu nào cho giới hạn 10 giây không? Tôi chưa bao giờ thấy điều đó trước đây nhưng nó trùng với kinh nghiệm của riêng tôi. – liammclennan

51

dài script chạy được phát hiện cách khác nhau bởi các trình duyệt khác nhau:

  • IE sẽ nâng cao cảnh báo lần 5 triệu báo cáo đã được thực hiện (more info on MSDN)
  • Firefox sẽ cảnh báo nếu tập lệnh mất nhiều hơn 10 giây (more info on MDN)
  • Safari sẽ cảnh báo nếu tập lệnh mất nhiều hơn 5 giây
  • Chr ome (1.0) không có giới hạn được thiết lập và sẽ chỉ tiếp tục cố gắng cho đến khi ngoại lệ OutOfMemory tại thời điểm nó bị treo
  • Opera sẽ chỉ tiếp tục chạy mãi mãi mà không cần cảnh báo.

Nicholas Zakas has written an excellent article covering this topic.

Như vậy - cách tốt nhất để tránh những vấn đề là bằng cách giảm vòng lặp, đệ quy và thao tác DOM.

1

Tôi chỉ blogged about this và đặt những gì tôi nghĩ là một giải pháp khá phong cách. Vì vậy, có một cái nhìn. Như đã đề cập ở trên giải pháp của tôi chỉ phá vỡ các hoạt động chạy dài thành khối nhưng tôi cung cấp một lớp tiện ích tốt đẹp để làm điều này.

Cảm ơn

Guido

0

Nếu bạn có kiểm soát đối với JavaScript, bạn có thể phá vỡ nó thành kịch bản riêng hoặc thử một cách tiếp cận tải Lazy.

Chỉ cần $ .02

1

bạn cũng có thể kiểm tra xem có javascript google analytics bao gồm trong trang của bạn hay không. Các lỗi xảy ra chỉ với IE và một khi mã google đã được gỡ bỏ, nó đã làm việc!

1

Hãy chắc chắn rằng dưới mã JavaScript được chỉ chạy một lần:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(win_onload); 

Trên code đang bên trong hàm win_onload().

0

Trong trường hợp của tôi có quá nhiều điều khiển ASP.NET HoverMenuExtender trong GridView bị ràng buộc với nhiều hàng đang gây ra hiệu suất cực kỳ chậm. Tôi đã xóa HoverMenuExtender và các vấn đề tốc độ của tôi (và hộp thoại) đã biến mất. Không hoàn toàn liên quan đến lý do tại sao hộp thoại bật lên, nhưng nó có thể giúp ai đó.

1

Tôi thấy rằng việc thêm cảnh báo ('trước khi X') ('sau X') là hữu ích cho tôi để tìm sự cố của tôi. Chúng tôi được gửi đến $ của tôi (function() {

}

0

Có vài lý do cho các loại hình báo

  1. số các hướng dẫn thực hiện bởi JS IE vượt quá giới hạn được xác định trước. Điều này có thể được sửa bằng cách chỉnh sửa đăng ký cửa sổ xem Here

  2. Tối ưu hóa mã javascript để thời gian thực hiện bị giảm.

  3. Tối ưu hóa mã JS là một chủ đề thử nghiệm và lỗi thực sự và có một số quy tắc nhỏ để làm như vậy. Tra Google đi.
+0

Thật khó để tìm ra kịch bản nào là cổ chai. Có thể là trình gỡ lỗi studio trực quan có thể được sử dụng để theo dõi vị trí. – Kinu

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