瀏覽器根據(jù)什么來判定腳本失控?
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在Web開發(fā)的時候,經(jīng)常會遇到的一種情況就是瀏覽器提示腳本運(yùn)行時間過長,停止還是繼續(xù),無論你選擇什么,相信你都會想盡一切辦法讓這個對話框遠(yuǎn)離你的用戶們??赡闶欠裰溃@些不同的瀏覽器究竟是如何判斷,哪些腳本處于“失控”狀態(tài)么?本文作者,就從Internet Explorer、Firefox、Safari、Chrome和Opera五種瀏覽器,分析了這個情況出現(xiàn)的原因。
原文標(biāo)題:What determines that a script is long-running? 原文作者:Nicholas C. Zakas 以下是對原文的翻譯: Web開發(fā)者經(jīng)常遇到并必須及時處理的問題就是“提示腳本運(yùn)行時間過長的提示框”(或者稱為“失控腳本提示”),這些令人討厭的對話框會在你的腳本 執(zhí)行時間過長的時候出現(xiàn)。對于Web開發(fā)者的基本準(zhǔn)則就是,無論什么時候,都不要讓用戶看到這些對話框,因?yàn)檫@會給人一種代碼缺乏結(jié)構(gòu)化的印象,更簡單的 說,你的代碼負(fù)擔(dān)太重了。 用Brendan Eich(JavaScript的發(fā)明人)的話來講,如果JavaScript運(yùn)行的時間需要用秒來計(jì)算,一定是什么地方搞錯了。我個人可以忍受的上限可 能更小一些,不論什么腳本,在任何時間、任何瀏覽器上執(zhí)行,都不應(yīng)該超過100毫秒。如果實(shí)際執(zhí)行的時間長于這個底限,一定要將進(jìn)程分解成若干更小的代碼 段。 另外,其實(shí)很少有人真正意識到究竟是什么原因?qū)е履_本在不同的瀏覽器中運(yùn)行時間過長,連我自己都沒有深究過。所以我決定坐下來好好研究一下,我們究 竟會在什么情況才會看到那個討厭的對話框。判斷腳本是否失控,無外乎就兩種方法。一種是根據(jù)執(zhí)行了多少條語句,一種是判斷腳本執(zhí)行花費(fèi)的時間。各個瀏覽器 判斷腳本失控的具體方法會有略微的不同。 Internet Explorer Internet Explorer判斷一個腳本是否失控,主要通過JScript引擎執(zhí)行語句的總數(shù)來判斷。默認(rèn)情況下,這個上限是500萬條語句,這個值是可以通過注冊表修改的。當(dāng)你的腳本執(zhí)行的語句數(shù)量超過這個限制,你就會看到下面的窗口。 這個對話框提示:“這個頁面上有一段腳本導(dǎo)致Internet Explorer運(yùn)行緩慢,如果你繼續(xù)運(yùn)行,你的計(jì)算機(jī)可能會變?yōu)闊o響應(yīng)狀態(tài)”。要不是追求技術(shù)上的準(zhǔn)確性,這樣說確實(shí)有點(diǎn)過了。對話框有兩個選項(xiàng),要么 停止腳本執(zhí)行,要么允許腳本繼續(xù)運(yùn)行。當(dāng)這個對話框顯示的時候,腳本已經(jīng)被完全停止了。如果你選擇繼續(xù)運(yùn)行腳本,就會重新計(jì)算當(dāng)前執(zhí)行的語句數(shù),也就是 說,如果這個數(shù)值再次達(dá)到上限時,你會再次看到這個對話框。 Firefox Firefox是根據(jù)腳本引擎持續(xù)執(zhí)行代碼的時間來判斷一段腳本是否失控。默認(rèn)的上限是10秒,可以通過about:config頁面來修改這個值。這里需要注意的是,當(dāng)彈出類似alert的模式對話框的時候,是不計(jì)時的。當(dāng)瀏覽器執(zhí)行腳本的時間達(dá)到這個上限,F(xiàn)irefox就會顯示類似下面的對話框: Firefox的對話框提示:“這個頁面的一段腳本目前運(yùn)行忙,或者這段腳本已經(jīng)停止響應(yīng)。你可以停止執(zhí)行這段腳本,并在調(diào)試器中打開這段腳本,或 者保持這段腳本繼續(xù)運(yùn)行”。更清楚的描述了遇到的問題,并且沒有IE說的那么恐怖。在這個對話框上可以執(zhí)行三種操作:停止腳本執(zhí)行、調(diào)試腳本或者讓腳本繼 續(xù)運(yùn)行。和Internet Explorer一樣,當(dāng)運(yùn)行腳本繼續(xù)運(yùn)行以后,對持續(xù)運(yùn)行腳本時間的統(tǒng)計(jì)就會重置。調(diào)試腳本按鈕,只有在你安裝了Firebug,并在該頁面激活了調(diào)試 的時候才會出現(xiàn)。執(zhí)行調(diào)試腳本操作后,可以顯示執(zhí)行時間過長的代碼段的具體位置。 Safari Safari同樣根據(jù)腳本引擎持續(xù)執(zhí)行腳本的時間來判斷,當(dāng)我對Webkit的源代碼進(jìn)行反復(fù)研究后,發(fā)現(xiàn)默認(rèn)的超時時間是5秒,一旦達(dá)到這個上限,就會給出下面的對話框提示: 對話框提示:“在頁面url上的腳本讓Safari失去響應(yīng),你是要繼續(xù)運(yùn)行腳本還是終止腳本”。同樣的,對于用戶來說,也不是什么可怕的提示。在Safari中,可以關(guān)閉失控腳本的檢測功能。 Chrome Chrome在跟蹤技術(shù)上有點(diǎn)狡猾,失控腳本檢測功能似乎和tab的事故控制(crash control)關(guān)聯(lián)到一起。我仔細(xì)看了源代碼,卻沒有找到具體的限制,但基本確定的是,這個限制是以時間為基礎(chǔ)的,估計(jì)在10秒左右(要么是5秒,要么 是10秒,總要和Safari或者Firefox看齊么)。我正在聯(lián)系Chrome項(xiàng)目組中的朋友,看看能不能得到確定的信息。盡管如此,如果網(wǎng)頁中存在 失控的腳本,用戶還是會看到下面的對話框: 毫無疑問,Chrome的提示比起其他瀏覽器來說,顯得都更加嚴(yán)重。點(diǎn)擊“Wait”按鈕,腳本會繼續(xù)運(yùn)行,直到達(dá)到下一個上限為止,也可以點(diǎn)擊“Kill pages”,直接關(guān)閉該頁面在內(nèi)存中的所有信息,并用一個空白頁取而代之。 Opera Opera的情況比較有趣:他貌似沒有針對失控腳本的相應(yīng)限制。我運(yùn)行了幾個很長的測試,甚至花了幾分鐘,而在這個過程中,瀏覽器一直可以正常響應(yīng),這很出我的意料之外。我不是很確定,對于現(xiàn)在的情況來說,這個方法是好是壞,但至少它生效了,不是么? 一些建議 無論你的用戶使用什么瀏覽器,都不應(yīng)該在任何時候看到類似的提示。在你的網(wǎng)站或者Web應(yīng)用程序作為產(chǎn)品發(fā)布之前,做一些常規(guī)的性能測試是非常有必要的。在這方面有很多工具可以加以利用,比如Firebug's profiler(只支持Firefox)、YUI Profiler (支持全部瀏覽器)或者Internet Explorer 8's Profiler。 你應(yīng)該毫不猶豫地將那些執(zhí)行時間超過100毫秒的腳本找出來,哪怕這些腳本只是在某些瀏覽器上運(yùn)行不暢,這些腳本包含了一些需要執(zhí)行很長時間的代碼段,而 這些代碼應(yīng)該通過性能檢測工具進(jìn)行重新評估。確保你不是使用Chrome作為測試的底線,因?yàn)镃hrome在執(zhí)行JavaScript的速度上比其他瀏覽 器要高出一個數(shù)量級(和Firefox 3.1還有最新的WebKit Nightly相當(dāng))。最好使用Internet Explorer作為測試的底線,然后再測試其他瀏覽器,因?yàn)闊o論什么時候,IE的JavaScript引擎都是最慢的,當(dāng)在IE上修復(fù)問題以后,十有八 九在其他瀏覽器上也可以正常運(yùn)行了。 該文章在 2011/3/10 12:10:38 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |