JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率

JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率

for循环估计是大家平时用到的最多的循环遍历了,一般情况下大家都会使用编程软件写一个for敲一下Tab,自动生成for循环结构

for (let index = 0; index < array.length; index++) {
        const element = array[index];
        
    }

应为for循环用的比较多,那有没有什么方法能提高一下for循环的效率,观察主体结构,index没什么好说的,循环的索引,中间的<是循环跳出的条件,逻辑运算符,也不能动,只能向array.length下手了,我们知道每次循环的时候都需要用indexarray.length比较,而获取array.length时,还需要计算一下数组元素的长度,这就导致了每次循环都要计算一次,所以我们可以提前把这个长度计算出来,存入变量,用的时候直接来取。

let arr = [];
//创建一个数组,提供测试
function arrCreat() {
    for (let index = 0; index < 1000000; index++) {
        arr.push(false);
    }
}
arrCreat();
//不提前计算长度,遍历数组
function forNolength(arr) {
    for (let index = 0; index < arr.length; index++) {
        if(arr[index].boolean === false) {
            arr[index].boolean = true;
        }
    }
}
console.time('NoNoNo1');
forNolength(arr);
console.timeEnd('NoNoNo1');
//提前计算长度,遍历数组
function forAndLength(arr) {
    for (let index = 0, length = arr.length;index < length; index++) {
        if(arr[index].boolean === false) {
            arr[index].boolean = true;
        }
    }
}
console.time('forAndLength1');
forAndLength(arr);
console.timeEnd('forAndLength1');

查看遍历时间(NoNoNo表示没有提前计算长度,forAndLength表示没有提前计算长度)

在这里插入图片描述

第二次运行结果
第二次

第三次
在这里插入图片描述

可以看出提前计算长度的循环时间都比较短,减少计算,提高运算速度,虽然差别不大,但是蚊子肉也是肉,能快一点是一点,不过由于提前把length计算出来,会额外需要一块内存用来存放length,不过使用的是let定义,循环结束,这块内存就会释放掉。想要内存使用少,遍历速度又快的话,只能研究一种更高明的算法了。

for系列遍历循环测试

  • for
  • forEach
  • for in
  • for of
  • map
  • filter
function nativeFor(array) {
    for (let index = 0, length = array.length; index < length; index++) {
        if(arr[index].boolean === false) {
            arr[index].boolean = true;
        }
    }
}
console.time('nativeFor');
nativeFor(arr);
console.timeEnd('nativeFor');
function forEach(array) {
    array.forEach((element) => {
        if (element.boolean === false) {
            element.boolean = true;
        }
    });
}
console.time('forEach');
forEach(arr);
console.timeEnd('forEach');
function forIn(array) {
    for (const key in array) {
        if (array[key].boolean === false) {
            array[key].boolean = true;
        }
    }
}
console.time('forIn');
forIn(arr);
console.timeEnd('forIn');
function forOf(array) {
    for (const iterator of array) {
        if (iterator.boolean === false) {
            iterator.boolean = true;
        }
    }
}
console.time('forOf');
forOf(arr);
console.timeEnd('forOf');
function forMap(array) {
    array.map((element) => {
        if (element.boolean === false) {
            element.boolean = true;
        }
    });
}
console.time('forMap');
forMap(arr);
console.timeEnd('forMap');
function filter(array) {
    array.filter((item) => {
        return item === false;
    });
}
console.time('filter');
filter(arr);
console.timeEnd('filter');

运行结果

在这里插入图片描述

上面虽然for in的时间比较长,是因为for in设计之初是用来遍历对象的,for循环只能遍历数组,数组也是对象,数组中的属性和方法,for in也可以遍历出来,其中为了不把原型上的属性和方法遍历出来,还需要增加obj.hasOwnProperty(prop)用来判断是否为原型上的属性或方法。
forEachES5提供的遍历方法,写法简单,但是不能跳出,性情比较直爽,不循环出来,不罢休。
for ofES6提供的遍历方法,可以使用continue和break。
filter循环,通常用于过滤数组元素。
map会让原数组中的每个值通过匿名函数,产生一个对应的值,然后返回一个新的数组所以从执行效率来看,使用消耗最多,因为做的工作更多,开辟了新地址,再把原数据一个一个走一遍函数,之后再存进新地方。
以上的执行效率会随着计算机的运行状态变化而变化,并不是唯一确定的,大家做个参考就可以了,个人推荐使用的遍历方法for of写法比较简单,而且也是ES6中新增的方法,建议大家使用。

数组添加效率比较

let baseArrStr = ['123', '456', '789'];
function concatArrFunc() {
    let tempArr = [];
    for (let index = 0; index < 10000; index++) {
        tempArr = tempArr.concat(baseArrStr);
    }
}
console.time('concatArrFunc');
concatArrFunc(arr);
console.timeEnd('concatArrFunc');

function pushArrFunc() {
    let tempArr = [];
    for (let index = 0; index < 10000; index++) {
        for (let index1 = 0, length = baseArrStr.length; index1 < length; index1++) {
            tempArr.push(baseArrStr[index1]);
        }
    }
}
console.time('pushArrFunc');
pushArrFunc(arr);
console.timeEnd('pushArrFunc');

function extendArrFunc() {
    let tempArr = [];
    for (let index = 0; index < 10000; index++) {
        tempArr.push(...baseArrStr);
    }
}
console.time('extendArrFunc');
extendArrFunc(arr);
console.timeEnd('extendArrFunc');

function applyArrFunc() {
    let tempArr = [];
    for (let index = 0; index < 10000; index++) {
        Array.prototype.push.apply(tempArr, baseArrStr);
    }
}
console.time('applyArrFunc');
applyArrFunc(arr);
console.timeEnd('applyArrFunc');

在这里插入图片描述

请注意,大家看一下extendArrFunction的执行结果,...是ES6的扩展运算符,ES6是真的香,执行效率快,最最最最主要的是太方便了,而且这几个函数里面,是不是感觉extendArrFunc这个最有牌面,能小装一下。

  • 两个大数组拼接,看看执行效率会有什么变化
let arr1 = [];
let arr2 = [];
function arrCreat() {
    for (let index = 0; index < 100000; index++) {
        arr1.push('123');
        arr2.push('123');
    }
}
arrCreat();

function concatArrFunc(arr1, arr2) {
    arr1 = arr1.concat(arr2);
}
console.time('concatArrFunc');
concatArrFunc(arr1, arr2);
console.timeEnd('concatArrFunc');



function pushArrFunc(arr1, arr2) {
    for (let index = 0, length = arr2.length; index < length; index++) {
        arr1.push(arr2[index]);
    }
}
console.time('pushArrFunc');
pushArrFunc(arr1, arr2);
console.timeEnd('pushArrFunc');



function extendArrFunc(arr1, arr2) {
    arr1.push(...arr2);
}
console.time('extendArrFunc');
extendArrFunc(arr1, arr2);
console.timeEnd('extendArrFunc');



function applyArrFunc(arr1, arr2) {
    Array.prototype.push.apply(arr1, arr2);
}
console.time('applyArrFunc');
applyArrFunc(arr1, arr2);
console.timeEnd('applyArrFunc');

运行结果如下

在这里插入图片描述

这里可以直观的看出来concat在拼接较大数组时候的效率,还是很可观的
大家编写程序的时候,可根据不同情况下的使用不同的方法,虽然几种方法差别不大,但是积少成多,少用点时间,页面响应就能快一点,当然了,部分情况还需要考虑到内存的使用情况,执行效率增加后,相应的可能会占用更多的内存,之间的利弊怎么衡量,看各位小伙伴的项目需要了。
该篇文章借鉴了沈老师的关于for循环效率测试的内容,如果有侵权,请联系我删除。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容