js 優(yōu)化次數(shù)過多的循環(huán) 考慮到性能問題
更新時(shí)間:2011年03月05日 23:55:15 作者:
IE沒有我們想象中笨,它知道總的循環(huán)次數(shù)還是一千萬次。因此,得把這一百個(gè)十萬次循環(huán)分開執(zhí)行。雖然Javascript是單線程的,但也可以通過setTimeout或setInterval模擬多線程。
假設(shè)要生成一千萬個(gè)隨機(jī)數(shù),常規(guī)的做法如下:
var numbers = [];
for (var i = 0; i < 10000000; i++) {
numbers.push(Math.random());
}
然而,在IE下執(zhí)行這段代碼時(shí),卻彈出了一個(gè)窗口提示用戶是否停止這段腳本。出現(xiàn)這種情況,首先想到的是優(yōu)化循環(huán)體。但明顯地,循環(huán)體很簡單,沒什么優(yōu)化的余地。即使把循環(huán)體清空,提示仍然存在。于是,我得出了一個(gè)結(jié)論:在IE下,一旦循環(huán)次數(shù)超過了某個(gè)特定值,就會(huì)彈出停止腳本的提示。
原因找到了,該如何解決呢?我首先想到的是把一千萬次循環(huán)分成若干個(gè)次數(shù)較少的循環(huán)。比如分成一百次,每次執(zhí)行十萬次循環(huán):
for (var i = 0, j; i < 100; i++) {
for (j = 0; j < 100000; j++) {
......
}
}
IE沒有我們想象中笨,它知道總的循環(huán)次數(shù)還是一千萬次。因此,得把這一百個(gè)十萬次循環(huán)分開執(zhí)行。雖然Javascript是單線程的,但也可以通過setTimeout或setInterval模擬多線程。整段代碼優(yōu)化如下:
var numbers = [];
function begin() {
for (var i = 0; i < 100000; i++) {
numbers.push(Math.random());
}
if (numbers.length < 10000000) { // 是否已完成
setTimeout(begin, 0);
} else {
alert("complete");
}
}
begin();
復(fù)制代碼 代碼如下:
var numbers = [];
for (var i = 0; i < 10000000; i++) {
numbers.push(Math.random());
}
然而,在IE下執(zhí)行這段代碼時(shí),卻彈出了一個(gè)窗口提示用戶是否停止這段腳本。出現(xiàn)這種情況,首先想到的是優(yōu)化循環(huán)體。但明顯地,循環(huán)體很簡單,沒什么優(yōu)化的余地。即使把循環(huán)體清空,提示仍然存在。于是,我得出了一個(gè)結(jié)論:在IE下,一旦循環(huán)次數(shù)超過了某個(gè)特定值,就會(huì)彈出停止腳本的提示。
原因找到了,該如何解決呢?我首先想到的是把一千萬次循環(huán)分成若干個(gè)次數(shù)較少的循環(huán)。比如分成一百次,每次執(zhí)行十萬次循環(huán):
復(fù)制代碼 代碼如下:
for (var i = 0, j; i < 100; i++) {
for (j = 0; j < 100000; j++) {
......
}
}
IE沒有我們想象中笨,它知道總的循環(huán)次數(shù)還是一千萬次。因此,得把這一百個(gè)十萬次循環(huán)分開執(zhí)行。雖然Javascript是單線程的,但也可以通過setTimeout或setInterval模擬多線程。整段代碼優(yōu)化如下:
復(fù)制代碼 代碼如下:
var numbers = [];
function begin() {
for (var i = 0; i < 100000; i++) {
numbers.push(Math.random());
}
if (numbers.length < 10000000) { // 是否已完成
setTimeout(begin, 0);
} else {
alert("complete");
}
}
begin();
您可能感興趣的文章:
- javascript教程:關(guān)于if簡寫語句優(yōu)化的方法
- js中if語句的幾種優(yōu)化代碼寫法
- nodejs的10個(gè)性能優(yōu)化技巧
- JavaScript性能優(yōu)化之小知識(shí)總結(jié)
- js性能優(yōu)化 如何更快速加載你的JavaScript頁面
- JavaScript也談內(nèi)存優(yōu)化
- JavaScript定時(shí)器和優(yōu)化的取消定時(shí)器方法
- JS對(duì)img標(biāo)簽進(jìn)行優(yōu)化使用onerror顯示默認(rèn)圖像
- Uglifyjs(JS代碼優(yōu)化工具)入門 安裝使用
- 深入探究JavaScript中for循環(huán)的效率問題及相關(guān)優(yōu)化
- javascript for循環(huán)從入門到偏門(效率優(yōu)化+奇特用法)
- 整理AngularJS框架使用過程當(dāng)中的一些性能優(yōu)化要點(diǎn)
- javascript定時(shí)器取消定時(shí)器及優(yōu)化方法
- JavaScript中對(duì)循環(huán)語句的優(yōu)化技巧深入探討
- JS代碼優(yōu)化技巧之通俗版(減少js體積)
- angularjs的一些優(yōu)化小技巧
- Extjs優(yōu)化(二)Form表單提交通用實(shí)現(xiàn)
- JS代碼優(yōu)化的8點(diǎn)建議
相關(guān)文章
JavaScript 中 JSON.parse 函數(shù) 和 JSON.stringify 函數(shù)
這篇文章主要介紹了JavaScript -- JSON.parse 函數(shù) 和 JSON.stringify 函數(shù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12
Javascript json object 與string 相互轉(zhuǎn)換的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄狫avascript json object 與string 相互轉(zhuǎn)換的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
JS實(shí)現(xiàn)自適應(yīng)高度表單文本框的方法
這篇文章主要介紹了JS實(shí)現(xiàn)自適應(yīng)高度表單文本框的方法,實(shí)例分析了針對(duì)IE內(nèi)核與非IE內(nèi)核下的javascript控制文本框樣式的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
js實(shí)現(xiàn)有趣的倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)有趣的倒計(jì)時(shí)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
javascript實(shí)現(xiàn)無法關(guān)閉的彈框
本文分享了javascript實(shí)現(xiàn)無法關(guān)閉的彈框的實(shí)例代碼,感興趣的朋友可以看下2016-11-11
JS模擬實(shí)現(xiàn)哈希表及應(yīng)用詳解
這篇文章主要介紹了JS模擬實(shí)現(xiàn)哈希表及應(yīng)用,結(jié)合實(shí)例形式分析了javascript模擬實(shí)現(xiàn)哈希表的步驟、相關(guān)操作技巧與使用方法,需要的朋友可以參考下2018-05-05

