我们在项目中进行了大量的浮点到整数转换.基本上,这样的事情
for(int i = 0; i < HUGE_NUMBER; i++) int_array[i] = float_array[i];
执行转换的默认C函数非常耗时.
是否有任何工作(可能是手动调整功能)可以加快一点点的过程?我们不太关心精度.
这里的大多数其他答案只是试图消除循环开销.
只有deft_code的答案才能解决真正问题的核心 - 在x86处理器上将浮点转换为整数是非常昂贵的.deft_code的解决方案是正确的,但他没有给出任何引用或解释.
以下是技巧的来源,有一些解释以及特定于是否要向上,向下或向零的版本:了解您的FPU
很抱歉提供一个链接,但真的写在这里的任何东西,除了再现那篇优秀的文章,都不会让事情变得清晰.
inline int float2int( double d ) { union Cast { double d; long l; }; volatile Cast c; c.d = d + 6755399441055744.0; return c.l; } // this is the same thing but it's // not always optimizer safe inline int float2int( double d ) { d += 6755399441055744.0; return reinterpret_cast(d); } for(int i = 0; i < HUGE_NUMBER; i++) int_array[i] = float2int(float_array[i]);
双参数不是错误的!有办法直接用浮子做这个技巧,但是试图覆盖所有角落的情况变得丑陋.在当前形式中,如果要截断,则此函数将使浮点数舍入最接近的整数,而不是使用6755399441055743.5(少0.5).
我对不同的float-to-int转换方法进行了一些测试.简短的回答是假设您的客户具有支持SSE2的CPU并设置/ arch:SSE2编译器标志.这将允许编译器使用SSE 标量指令,其速度是魔术数字技术的两倍.
否则,如果你有很长的浮动字符串来研磨,请使用SSE2压缩操作.