优化:将浮点数乘以整数或另一个浮点数是否更快
Optimization: Is it faster to multiply a float by an integer or another float
如果我尝试将浮点数乘以整数,将其乘以整数表示的整数是否更快
int x;
...
float y = 0.5784f * x; //Where x contains a dynamically chosen whole number
或通过另一个浮点数(前提是精度没有损失)
float x;
...
float y = 0.5784f * x; //Where x contains a dynamically chosen and floating point representable whole number
还是硬件之间差异很大?是否有处理浮点数和整数乘法的通用电路(在大多数浮点单元中都有),或者硬件的一般做法是先将整数转换为浮点数,然后使用执行 float * float 的电路?如果所表示的整数非常小,例如动态确定的值 0 或 1,并用于确定是否将浮点数添加到总和中而不进行分支怎么办?
int x;
...
float y = 0.5784f + 0.3412f * x; //Where x contains either 0 or 1 (determined dynamically).
提前感谢您的帮助。
Is it faster to multiply a float by an integer or another float
在 general 中,float * float
更快,但我怀疑差异很小或没有差异。程序的速度是整个代码的结果,而不仅仅是这一行。这里快一点,其他地方可能要多花一个。
相信您的编译或获得更好的编译器来发出执行 0.5784f * some_int
良好的代码。
在 0.5784f * some_int
的情况下,语言 强制 some_int
表现得好像先转换为 float
*1 乘法前。但是一个敏锐的编译器可能知道实现特定的技巧来直接执行乘法 better/faster 而无需单独的显式转换 - 只要它获得允许的结果..
在 float y = 0.5784f + 0.3412f * x; //Where x contains either 0 or 1 (determined dynamically).
编译中 可能 也看到这一点,并利用它发出高效的代码。
只有在 select 的情况下并且有了经验,你才能猜对编译器。首先为清楚起见编写代码。
您总是可以 profile 不同的 codes/compiler 选项并进行比较。
提示:根据我的经验,与发布的问题相比,我发现通过更大的代码视图可以获得更多的性能提升 - 接近 micro-optimization。
*1 其他可能性参见 FLT_EVAL_METHOD
。
如果我尝试将浮点数乘以整数,将其乘以整数表示的整数是否更快
int x;
...
float y = 0.5784f * x; //Where x contains a dynamically chosen whole number
或通过另一个浮点数(前提是精度没有损失)
float x;
...
float y = 0.5784f * x; //Where x contains a dynamically chosen and floating point representable whole number
还是硬件之间差异很大?是否有处理浮点数和整数乘法的通用电路(在大多数浮点单元中都有),或者硬件的一般做法是先将整数转换为浮点数,然后使用执行 float * float 的电路?如果所表示的整数非常小,例如动态确定的值 0 或 1,并用于确定是否将浮点数添加到总和中而不进行分支怎么办?
int x;
...
float y = 0.5784f + 0.3412f * x; //Where x contains either 0 or 1 (determined dynamically).
提前感谢您的帮助。
Is it faster to multiply a float by an integer or another float
在 general 中,float * float
更快,但我怀疑差异很小或没有差异。程序的速度是整个代码的结果,而不仅仅是这一行。这里快一点,其他地方可能要多花一个。
相信您的编译或获得更好的编译器来发出执行 0.5784f * some_int
良好的代码。
在 0.5784f * some_int
的情况下,语言 强制 some_int
表现得好像先转换为 float
*1 乘法前。但是一个敏锐的编译器可能知道实现特定的技巧来直接执行乘法 better/faster 而无需单独的显式转换 - 只要它获得允许的结果..
在 float y = 0.5784f + 0.3412f * x; //Where x contains either 0 or 1 (determined dynamically).
编译中 可能 也看到这一点,并利用它发出高效的代码。
只有在 select 的情况下并且有了经验,你才能猜对编译器。首先为清楚起见编写代码。
您总是可以 profile 不同的 codes/compiler 选项并进行比较。
提示:根据我的经验,与发布的问题相比,我发现通过更大的代码视图可以获得更多的性能提升 - 接近 micro-optimization。
*1 其他可能性参见 FLT_EVAL_METHOD
。