我有一个相当大的公式,必须每秒计算大约300次。我的大多数变量都是浮点数,但有些变量只是进入该公式的参数。在某些情况下,不需要浮动。我可以使用int参数。但我想知道在计算中混合int和float类型是否会导致系统周围的类型,而不是保存性能。
答案 0 :(得分:4)
首先,是的,系统将转换变量,以便它可以在公共基类型中进行计算。其次,这不是你应该最担心的,除非你已经对你的程序进行了基准测试,并且你知道这是你的瓶颈。
只是为了澄清第一部分,如果你有
double a = 10.0;
int b = 5;
int c = 2;
你的公式是
double d = a + (b / c);
我所知道的大多数系统都会使用整数数学,对于这种情况下的除法运算,然后切换到需要它的浮点数学。简而言之,整数和浮点数学之间的决定是在操作员级别完成的。
答案 1 :(得分:3)
小心假设int操作总是比float操作快。他们可能是孤立的,但moving data between a float register and an int register is shockingly slow on modern processors。因此,一旦您的数据在浮点数上,您应该将它保留在浮点数上以进行进一步计算。
答案 2 :(得分:2)
取决于......结果的正确性对您来说很重要吗?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x = 5;
int y = 2;
float z = 12.3f;
float result = z + (x / y);
printf("%f\n", result);
result = z + ((float) x) / y;
printf("%f\n", result);
return EXIT_SUCCESS;
}
C:\Temp> t
14.300000
14.800000
做什么会给你正确的结果。
答案 3 :(得分:1)
我怀疑有好的经验法则。它可能在很大程度上取决于处理器,编译器以及您正在执行的特定操作组合。设置一个计时器,在计算之前和之后运行,并进行各种调整,看看哪个运行得更快。
原则上,从float转换为int通常会减慢你的速度,因为需要额外的指令才能做到这一点,但在实践中,唯一的方法就是测量。查看各种更改的汇编程序转储可以帮助您获得良好的直觉,但即便如此,处理器可能会以非显而易见的方式管道化甚至重新排序指令。
另外,请务必调查gcc的浮点优化开关,并确保为您使用最佳的开关。
答案 4 :(得分:0)
我会说这取决于什么对你更有意义。在性能方面,最好使用float,因为这样做你不会强制注入次数(大约每秒300次;))。
如果它是在您的代码中经常使用的东西,那么您可以关注它,否则不需要实现任何更改。如果你还没有听到或读过“The Fallacy of Premature Optimisation”这样做,现在可以帮助你。规则是20%的代码需要80%的性能。