Duff's Device and Fast InvSqrt

1. Duff‘s Device

  Invited by Tom Duff in 1983, Duff‘s device is a good practical example of loop unrolling in software-based instruction-level parallelism, which approximately reduces the instructions that control the loop into 1/8.

void memcpy(char *to, char *from, size_t count)
{
    size_t n =(count+7)/8;
    switch (count%8)
    {
    case 0: do {        *to++=*from++;
    case 7:        *to++ = *from++;
    case 6:        *to++ = *from++;
    case 5:        *to++ = *from++;
    case 4:        *to++ = *from++;
    case 3:        *to++ = *from++;
    case 2:        *to++ = *from++;
    case 1:        *to++ = *from++;
        } while(--n>0);
    }
}

2. Fast Inverse Square Root

  This algorithm can speed up the caculation of normalized vectors in IEEE floating point format, and it was devised by John Carmack in 1990s. Up to now, I still have no idea about why this program is so magic.

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
    y  = * ( float * ) & i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}

Duff's Device and Fast InvSqrt

时间: 2024-10-26 10:24:29

Duff's Device and Fast InvSqrt的相关文章

达夫设备(Duff's Device)

达夫设备设备是一段非常巧妙,看起来非常诡异的c代码,它可以很大的提高程序执行的效率(本文将试验),达夫设备的来源我就不说了,我们来分析一下. 达夫设备是考虑到我们一般用for或者while循环的时候,如果执行循环内容本身用不了多少时间,那么时间将被主要消耗在每次循环的比较语句上边. 事实上比较语句是有很大优化空间的,假设你要循环1000次,结果你从第一次开始就不断的比较是否达到上界,这是很徒劳的. 达夫这个哥们利用了switch语句的跌落行为设计了达夫设备. 我们用达夫设备计算一个累加运算,累加

Fast InvSqrt()(平方根倒数速算法)

浮点数的平方根倒数常用于计算正规化矢量.3D图形程序需要使用正规化矢量来实现光照和投影效果,因此每秒都需要做上百万次平方根倒数运算,而在处理坐标转换与光源的专用硬件设备出现前,这些计算都由软件完成,计算速度亦相当之慢.在1990年代这段代码开发出来之时,多数浮点数操作的速度更是远远滞后于整数操作.因而针对正规化矢量算法的优化就显得尤为重要.下面陈述计算正规化矢量的原理: 要将一个矢量标准化,就必须计算其欧几里德范数,以求得矢量长度,为此便需对矢量的各分量的平方和求平方根:而当求取到其长度,并以之

javascript性能优化之循环迭代(duff)

这段时间一直再学习<高性能javascript>这本书,在这里记录一些学习心得和笔记... 循环迭代之“Duff's Device”优化迭代次数在1000以上的循环. 函数如下: 1 function duff(items) { 2 if(items && items.length) { 3 var l = items.length, i = l % 8; 4 while(i) { 5 console.log(items[-- l]); 6 i --; 7 } 8 i = Ma

c malloc分配内存

php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中进行的,以至于efree,也不会向OS退回内存,而只是设置标志位,标识efree这块内存不再使用了,这样做的好处是,速度快,避免系统调用,因为频繁的从用户态和内核态之间的切换是很费CPU的. C语言的malloc函数的后面是glibc(内存管理系统) , 前段时间在看到php内存分配时,看到了ema

Javascript之高效编程

前言: Javascript绝对是最火的编程语言之一,一直具有很大的用户群,具有广泛的应用前景.而在前端开发中,它也是三驾马车之一,并且是最重要的一环.要想给用户提供更流畅的操作体验,更友好的交互,对Javascript程序进行优化.提高执行效率也就必不可少.那么我们怎么样才能编写出高性能的JS程序呢?本文是在阅读<高性能网站建设进阶指南>和<高性能JavaScript>之后写的一篇总结,自己也加深一下印象,希望可以帮助大家! 一.数据访问      1.高效数据存储       

前端性能之js代码优化点

作用域 JavaScript执行时会构建一个作用域链,用来进行变量解析,全局执行上下文只有一个object变量,定义了js中所有变量和函数.当创建一个函数时,会出现产生一个新的局部作用域,以this.arguments和命名的形参以及其他局部变量和函数初始化.整个作用域链的顶端是活动的作用域,变量解析的顺序是首先从当前作用域查找,当查找到结果后就终止查询,否则就继续往上一层作用域查询,直到全局作用域为止.因此,一个比较大的变量如果在解析的过程中跨越多层作用域,就会比较影响性能.作用域在性能上的改

【分析】dalvik虚拟机解释执行字节码

参考源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. dvmInterpret函数中调用了dvmInterpretPortable函数对方法的字节码进行解释执行,dvmInterpret在dalvik/vm/interp/Interp.cpp文件中. dvmInterpretPortable函数在dalvik/vm/mterp/out/InterpC-portable.cpp文件中. 使用gcc -E -P -C InterpC-portable.cpp > Int

C puzzles详解【9-12题】

第九题 #include <stdio.h> int main() { float f=0.0f; int i; for(i=0;i<10;i++) f = f + 0.1f; if(f == 1.0f) printf("f is 1.0 \n"); else printf("f is NOT 1.0\n"); return 0; } 知识点讲解: 浮点寄存器 浮点寄存器是FPU的组成部分.硬件架构不同,浮点寄存器的个数和位数也不同.X86架构的浮

js 性能优化 篇一

JS性能优化 摘自:http://www.china125.com/design/js/3631.htm 首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内置优化引擎,将JS编译成本地代码的浏览器,其它浏览器也陆续实现了JS的编译过程.但是,即使到了编译执行JS的新阶段,仍然会存在低效率的代码.)以下总结一些可以改进代码的整体性能的方法. 1.注意作用域 记住一点,随着作用域中的作用域数量的增加,访问当前作用域以外的变量的时间也在增加.所以,访问全局变量