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