关于Javascript循环体变量声明与初始化的效率问题

来源:互联网 发布:mac safari浏览器 设置 编辑:程序博客网 时间:2024/05/22 01:34
针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下:
function test(n) {    console.time('Internally declared');    for (let i = 0; i < n; i++) {        let a = i;    }    console.timeEnd('Internally declared');    console.time('Externally initialized');    let a = 0;    for (let i = 0; i < n; i++) {        a = i;    }    console.timeEnd('Externally initialized');    console.time('Externally declared');    let b;    for (let i = 0; i < n; i++) {        b = i;    }    console.timeEnd('Externally declared');}

 

Chromium 58.0.3029.110下的测试结果,没有考虑更多的测试条件、环境因素影响等等:

test(1000000000)Script snippet #2:6 Internally declared: 2894.2080078125msScript snippet #2:13 Externally initialized: 2867.099853515625msScript snippet #2:20 Externally declared: 2895.260986328125msundefinedtest(100000000)Script snippet #2:6 Internally declared: 355.6640625msScript snippet #2:13 Externally initialized: 296.761962890625msScript snippet #2:20 Externally declared: 296.949951171875msundefinedtest(10000000)Script snippet #2:6 Internally declared: 68.672119140625msScript snippet #2:13 Externally initialized: 43.97705078125msScript snippet #2:20 Externally declared: 35.217041015625msundefinedtest(1000000)Script snippet #2:6 Internally declared: 12.23388671875msScript snippet #2:13 Externally initialized: 10.057861328125msScript snippet #2:20 Externally declared: 8.0849609375msundefinedtest(100000)Script snippet #2:6 Internally declared: 0.94873046875msScript snippet #2:13 Externally initialized: 1.088134765625msScript snippet #2:20 Externally declared: 0.931884765625msundefinedtest(10000)Script snippet #2:6 Internally declared: 0.1181640625msScript snippet #2:13 Externally initialized: 0.176025390625msScript snippet #2:20 Externally declared: 0.145751953125msundefinedtest(1000)Script snippet #2:6 Internally declared: 0.044921875msScript snippet #2:13 Externally initialized: 0.04296875msScript snippet #2:20 Externally declared: 0.046875msundefinedtest(100)Script snippet #2:6 Internally declared: 0.025146484375msScript snippet #2:13 Externally initialized: 0.033935546875msScript snippet #2:20 Externally declared: 0.02783203125msundefinedtest(10)Script snippet #2:6 Internally declared: 0.024169921875msScript snippet #2:13 Externally initialized: 0.024169921875msScript snippet #2:20 Externally declared: 0.02197265625msundefinedtest(1)Script snippet #2:6 Internally declared: 0.02490234375msScript snippet #2:13 Externally initialized: 0.032958984375msScript snippet #2:20 Externally declared: 0.030029296875msundefined

Firefox 54.0下的测试结果,没有考虑更多的测试条件、环境因素影响等等:

test(1000000000)Internally declared: 计时器开始Internally declared: 768.81msExternally initialized: 计时器开始Externally initialized: 697.8msExternally declared: 计时器开始Externally declared: 704.16msundefinedtest(100000000)Internally declared: 计时器开始Internally declared: 131.84msExternally initialized: 计时器开始Externally initialized: 84.42msExternally declared: 计时器开始Externally declared: 70.98msundefinedtest(10000000)Internally declared: 计时器开始Internally declared: 19.92msExternally initialized: 计时器开始Externally initialized: 17.09msExternally declared: 计时器开始Externally declared: 15.33msundefinedtest(1000000)Internally declared: 计时器开始Internally declared: 3.46msExternally initialized: 计时器开始Externally initialized: 3.06msExternally declared: 计时器开始Externally declared: 2.75msundefinedtest(100000)Internally declared: 计时器开始Internally declared: 1.49msExternally initialized: 计时器开始Externally initialized: 1.11msExternally declared: 计时器开始Externally declared: 2.14msundefinedtest(10000)Internally declared: 计时器开始Internally declared: 1.03msExternally initialized: 计时器开始Externally initialized: 1.11msExternally declared: 计时器开始Externally declared: 1.11msundefinedtest(1000)Internally declared: 计时器开始Internally declared: 1.25msExternally initialized: 计时器开始Externally initialized: 0.84msExternally declared: 计时器开始Externally declared: 0.82msundefinedtest(100)Internally declared: 计时器开始Internally declared: 1.29msExternally initialized: 计时器开始Externally initialized: 1.02msExternally declared: 计时器开始Externally declared: 1.21msundefinedtest(10)Internally declared: 计时器开始Internally declared: 1.29msExternally initialized: 计时器开始Externally initialized: 1.1msExternally declared: 计时器开始Externally declared: 1.64msundefinedtest(1)Internally declared: 计时器开始Internally declared: 1.15msExternally initialized: 计时器开始Externally initialized: 0.97msExternally declared: 计时器开始Externally declared: 0.89msundefined

 

 三种方式无明显差别。从一般性逻辑来分析,声明和初始化是两种操作,其中任何一种操作发生的次数越多耗时越多;但变量声明时就及时初始化是个好的编程习惯,未初始化的变量就直接参与运算常常会得到意想不到的结果,如(undefined) + 1 = NaN、(undefined) + 'string' = "undefinedstring",当然很多编程语言对于未初始化的变量以默认类型值初始化,而Javascript默认值为undefined。另外,这里不探讨存储性能和垃圾回收机制。

 

原创粉丝点击