double到int的快速转换
(2014-01-19 13:39:56)
图形表示用double,显示用int,很常规的提高效率的小方子。可是,你知道吗?最普通的类型转换其实是相当慢的: int a = (int)dbl; 今天搜索定点数运算时,无意中看到一篇文章,说的就是double转int的快速方法。
先把代码贴上来,其实是lua的源代码,:-)
=============================================================
作者也分析了原因。
我就不罗嗦了,记得有这个方法就好。
最后,我做了小实验,比较一下这个方法和直接类型转换的速度差别。
#define LOOPS 200000000
union luai_Cast { double l_d; long l_l; };
#if 1
#define dbl2int(d, i)\
{ volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0;
(i) = u.l_l; }
#else
#define dbl2int(d, i) (d)+=6755399441055744.0; (i)=*(int*)&d;
#endif
int main(int argc, char* argv[])
{
printf("Hello World!\n");
long val;
double dbl=7.56;
long t1 = GetTickCount();
for (int i=0; i
{
dbl2int(dbl, val);
dbl=i;
val+=1;
}
long t2 = GetTickCount();
printf("start: %d\n
end: %d\ntime=%d\n", t1, t2, t2-t1);
dbl=7.86;
long t3 = GetTickCount();
for (int j=0; j
{
val=(int)dbl;
dbl=j;
val+=1;
}
long t4 = GetTickCount();
printf("start: %d\n
end: %d\ntime=%d\n\n %f\n\n", t3, t4, t4-t3, 1.0*(t4-t3)/(t2-t1));
printf("val=%d\n", val);
return 0;
}
运行结果如下:
Hello World!
start: 11795010
end: 11795761
time=751
start: 11795761
end: 11799546
time=3785
5.039947
val=199999999
Press any key to continue
先把代码贴上来,其实是lua的源代码,:-)
=============================================================
#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \
(defined(__i386) || defined (_M_IX86) || defined(__i386__))
union
luai_Cast {
double
l_d;
long
l_l; };
#define lua_number2int(i,d) \
{
volatile
union
luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
#define lua_number2integer(i,n) lua_number2int(i, n)
#else
#define lua_number2int(i,d) ((i)=(int)(d))
#define lua_number2integer(i,d) ((i)=(lua_Integer)(d))
#endif
===========================================================
帖子原文在这里
http://rangercyh.blog.51cto.com/1444712/1313162
作者也分析了原因。
我就不罗嗦了,记得有这个方法就好。
最后,我做了小实验,比较一下这个方法和直接类型转换的速度差别。
#define LOOPS 200000000
union luai_Cast { double l_d; long l_l; };
#if 1
#define dbl2int(d, i)\
#else
#define dbl2int(d, i) (d)+=6755399441055744.0; (i)=*(int*)&d;
#endif
int main(int argc, char* argv[])
{
}
运行结果如下:
Hello World!
start: 11795010
time=751
start: 11795761
time=3785
val=199999999
Press any key to continue
速度相差5倍。
同时还比较了联合与指针运算的速度差别,用指针取值也是需要时间的,不如联合快,意料之中的。