浅谈性能优化之----被你忽视了的取值操作

在程序猿日常的coding中,取值是一个不可避免的操作。

也许很多盆友觉得一个取值操作并没有什么可谈,其实不然。今天我将给大家展示一下,取值这一简单的操作,在性能优化上也大有可为。

首先贴一下本次测试的代码:
let    type = 0,
        size = 10,
        arr0 = new Array(size).fill({name: 'zhangsan', sex: 'male'}),
        arr1 = new Array(size).fill({name: 'zhangsan', sex: 'male'}),
        sum0 = 0,
        sum1 = 0;

    for(let i=0; i<20;i++){
        testFunc();
    }

    console.log(sum0)
    console.log(sum1)

    function testFunc() {
        let time = '';
        if(!type){
            time = Date.now();
            for(let i=0,l=arr0.length;i<l;i++){
                arr0[i].name += '第一次相加';
                arr0[i].name += '第二次相加';
                arr0[i].name += '第三次相加';
            }
            sum0 += (Date.now() - time);
        }else{
            time = Date.now();
            for(let i=0,l=arr1.length;i<l;i++){
                let name = arr1[i].name;

                name += '第一次相加';
                name += '第二次相加';
                name += '第三次相加';
            }
            sum1 += (Date.now() - time);
        }

        type = !type;
    }
解释下变量的用途:
  • type:最大化保证测试的公平性,两种取值操作交替进行

  • size:测试数组大小

  • arr0、arr1:用于测试的两个数组

  • sum0、sum1:统计两组测试的总耗时长

好了,首先我们来测试下size=10的情况:
测试结果

可以看出,这个情况下基本上两者没有区别,耗时近乎0ms。

ok,现在我们再来考虑size=100的情况:
测试结果-1
测试结果-2

经过N次的刷新,可以看出,大概出现了2种结果,但是出现最多的仍然是 0 - 0这种情况。可以看出这时候两者也大概旗鼓相当,难分伯仲。

前两种情况两者性能几乎相当,接下来我们将考虑更大量级的数据,size=1000的情况:

测试结果-1

这个时候两者的性能开始有一些差距了。虽然经过N次刷新,也是出现了各种各样的数据,但总体而言,两者性能差距在2-3倍。
看到这个时候很多小伙伴还是觉得你这个优势微乎其微,没劲。

但是我想告诉大家的是,不积跬步无以至千里,不积小流何以成江海(手动滑稽),更何况有更优秀的写法我们为何不选择呢,是吧?
可以想象现在各位对我的态度
好吧,装逼也抵挡不了各位看官对我的鄙视,那接下来给大家看看10倍的性能差距。

我们只需轻轻的将size设置为10000,然后随便一刷浏览器:


测试结果

怎么样,小老弟

看到这里想必各位被强行打成共识的看官都怒了,你这***数据量谁玩啊?
但是我们想想,前端数据可视化想必各位也不陌生,数据量达到w级的可不在少数。当然也有其他使用场景,我们不必深究。

下面再贴几张其他数量级的测试结果:
size=100000的测试结果

size=1000000的测试结果

各位可能会惊讶,下一量级的测试数据呢?我为什么不贴,我是不会告诉你的。


size=10000000的测试结果

不管怎么样,可以看出数据量级越大,优势就越明显(请忽略被type0搞崩溃了的size=10000000)。
不死心的我单独测试了一下size=10000000时type1的结果,结果挺欣慰(手动痛哭流涕):


size=10000000 type1的测试结果
接下来,简单分析一下出现这种情况的原因。

两种代码唯一的区别在于type0多次从arr上取同一属性值,而type1每次循环只取值一次,同时记录在作用域内成为局部变量,下一次用到时将不再从arr上寻找,直接使用域内的变量。可以预见,如果type0中出现更多对arr同一属性的取值操作,两者的性能差距也将会更大。

本次测试就到这里,如有疏忽错误之处欢迎大家指正。
同时也希望更多的小伙伴(共勉.jpg)注意日常的coding,早日写出优雅简洁,性能强大的前端代码。


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