达夫设备 JavaScript

循环体在程序的执行过程中是一个开销非常大的操作,有效的优化可以很好的提升性能。循环性能的优化可以通过减少循环次数和降低每次循环的开销两方面入手。对于降低每次循环开销,可以使用局部变量缓存一些需要经常查询的类型,比如数组长度等;关于减小循环次数,可以使用Duff’s Device。
Duff’s Device即达夫设备,是一种通过展开循环体从而限制循环迭代次数的方法,其实质是在一次迭代中执行了原循环的多次循环操作,一般最多每次等效循环可以代替8次循环。Jeff Greenberg将Duff’s Device从C语言引入到了JavaScript中。其具体实现如下:

//credit: Jeff Greenberg
//平均运行时间约为2s
var items = Array(10000001).join(1).split('');

function process(arr,i) {
    arr[i] *= 2;
}
var len = items.length;
    startAt = len % 8,
    iterations = Math.ceil(len / 8);
    i = 0;

do {
    switch (startAt) {
        case 0: process(items, i++);
        case 7: process(items, i++);
        case 6: process(items, i++);
        case 5: process(items, i++);
        case 4: process(items, i++);
        case 3: process(items, i++);
        case 2: process(items, i++);
        case 1: process(items, i++);
    }
    startAt = 0;
} while (--iterations);

当迭代次数超过1000时,Duff’s Device的执行效率可以明显提升。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neil-

你们的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值