Fixing Duff’s Device

While researching for my book, I came across Jeff Greenburg’s JavaScript port of Duff’s Device, a generic way to unroll loops for optimization. Jeff’s original algorithm looks like this:

var iLoopCount = iIterations / 8; 
var iTestValue = iIterations % 8; 
do { 
    switch (iTestValue) { 
        case 0: [execute statement]; 
        case 7: [execute statement]; 
        case 6: [execute statement]; 
        case 5: [execute statement]; 
        case 4: [execute statement]; 
        case 3: [execute statement]; 
        case 2: [execute statement]; 
        case 1: [execute statement]; 
    iTestValue = 0; 
} while (--iLoopCount > 0);

This is, more or less, a direct port from the original C code. The problem is the value of iLoopCount, which will end up as a floating-point value in many situations. Operations involving floating-point numbers are more expensive than those using integers, so this isn’t optimal. To fix this, you can use Math.ceil() to convert the result into an integer:

var iLoopCount = Math.ceil(iIterations / 8);

Remember, the purpose of Duff’s Device is to speed up loop operations, so every little bit helps.

Was this helpful? If you found this post helpful, I would very much appreciate your support. Donations of any amount gratefully accepted.