Monthly Archives: June 2020

定点数优化:性能成倍提升

定点数这玩意儿并不是什么新东西,早年 CPU 浮点性能不够,定点数技巧大量活跃于各类图形图像处理的热点路径中。今天 CPU 浮点上来了,但很多情况下整数仍然快于浮点,因此比如:libcario (gnome/quartz 后端)及 pixman 之类的很多库里你仍然找得到定点数的身影。那么今天我们就来看看使用定点数到底能快多少。 简单用一下的话,下面这几行宏就够了: #define cfixed_from_int(i) (((cfixed)(i)) << 16) #define cfixed_from_float(x) ((cfixed)((x) * 65536.0f)) #define cfixed_from_double(d) ((cfixed)((d) * 65536.0)) #define cfixed_to_int(f) ((f) >> 16) #define cfixed_to_float(x) ((float)((x) / 65536.0f)) #define cfixed_to_double(f) ((double)((f) / 65536.0)) … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

快除 255:到底能有多快?

真金不怕火炼,我先前在《C 语言有什么奇技淫巧?》中给出的整数快速除以 255 的公式: #define div_255_fast(x) (((x) + (((x) + 257) >> 8)) >> 8) 有人觉得并没有快多少,还给出了测试: 红色为 255 快除法的消耗时间,看他的测试好像也只快了那么一点,是这样的么? 并非如此,我们只要把测试用例中的 long long j 改成 int j 就有比较大的性能提升了: 链接:http://quick-bench.com/t3Y2-b4isYIwnKwMaPQi3n9dmtQ 这才是真实的快除法性能。 原评测的作者其他地方都是用 int ,这里故意改成 64 位去和原始的 / 255 对齐,引入一个干扰项,得到一个比较慢的结果,到底是为了黑而黑呢?还是别的什么原因? 编译器生成的 / 255 … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

快速范围判断:再来一种新写法

C 语言的魔法数不胜数,我在《C 语言有什么奇技淫巧?》中过给快速范围判断的公式,将: if (x >= minx && x <= maxx) … 改做: if (((x – minx) | (maxx – x)) >= 0) … 能有一倍的性能提升,我也提到,如果你的数据 99% 都是超出范围的那继续用 && 最快。今天再给大家介绍另外一种新写法,它有更均衡的性能,并且在最坏的情况下,任然表现良好: if ((unsigned)(x – minx) <= (unsigned)(maxx – minx)) … 该公式在各种测试数据中能有更均衡的表现,类型安全狂们可以写作: if … Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment