/*
* This is a test to check the performance of different Duff's device and normal loop
*/
var myArray = new Array(1000033);
var myArray1 = new Array(1000033);
var myArray2 = new Array(1000033);
// Jeff Greenberg's implementation of Duff's device
function jeffDuff(){
var iterations = Math.ceil(myArray.length / 8),
startAt = myArray.length % 8,
i = 0;
do {
switch(startAt){
case 0: myArray[i++] = i;
case 7: myArray[i++] = i;
case 6: myArray[i++] = i;
case 5: myArray[i++] = i;
case 4: myArray[i++] = i;
case 3: myArray[i++] = i;
case 2: myArray[i++] = i;
case 1: myArray[i++] = i;
}
startAt = 0;
} while (--iterations > 0);
}
// Andrew B. King's implementation of Duff's device
function kingDuff(){
var iterations = Math.floor(myArray1.length / 8),
leftover = myArray1.length % 8,
i = 0;
if (leftover > 0){
do {
myArray1[i++] = i;
} while (--leftover > 0);
}
do {
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
myArray1[i++] = i;
} while (--iterations > 0);
}
// normal loop
function normalLoop(){
for(var i=0, len=myArray2.length;i<len;i++){
myArray2[i++] = i;
}
}
console.time("normalLoop");
normalLoop();
console.timeEnd("normalLoop");
console.time("kingDuff");
kingDuff();
console.timeEnd("kingDuff");
console.time("jeffDuff");
jeffDuff();
console.timeEnd("jeffDuff");
// release memory
myArray = null;
myArray1 = null;
myArray2 = null;
Different Duff's device and normal loop test
最新推荐文章于 2022-02-11 20:10:38 发布