将变量从double改为float会获得多少性能增益
How much performance gain for changing variables from double to float?
我有一个花费太多时间的程序,所以我想优化一下我的代码。
到目前为止,我对每个变量都使用了double
类型。如果我将类型更改为float
,是否会出现任何性能优势? 要回答这个问题是不可能的:这取决于你的代码和硬件。这个变化将有许多可能的影响:
- 内存使用将会减少
- 缓存丢失将更少。
- CPU指令需要更少的周期。 编译器可以自动向量化,也可以以不同的方式自动向量化。
- 应用中的数值算法可能不再正确收敛。
判断实际性能差异的唯一方法是自己测试。听起来像是一个简单的搜索& &;替换工作。
最有可能的是,只有当您的代码在非常大的内存块上工作时,您才会看到明显的改进。如果您正在对数百万个值的数组进行double
操作,则可以通过切换到float
来减少一半的内存带宽。(我假设你是在一个标准的体系结构上,float
是32位,double
是64位。)
在降低CPU负载方面,我不希望看到显著的变化。
现代处理器对于双精度操作数和单精度操作数执行大多数FP操作所需的时间大致相同。下降到单精度的唯一显著的速度差异是:
- 更小的大小,可能导致更多的缓存一致性。对于大多数算法来说,这不是一个重大问题。
- SIMD中的更多插槽(没有AVX的SSE为4个插槽,SSE为2个插槽)。显然,只有当你在SIMDizing你的代码时才需要考虑。
- 更快的除法、平方根和超越。这种差异在一些极端的内循环中可能会很明显,但一般来说,你的FP操作不会占你总运行时的很大一部分。
总的来说,它不太可能是一个重大的胜利,除了利基案例。如果您不熟悉浮点不精度的本质以及如何减少它,那么最好坚持使用双精度,并为您提供更多的回旋余地。
如果你想要更好的性能,你不应该这样做,如果你需要精度,你应该这样做。
相关参考
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 复制列表初始化的隐式转换的等级是多少
- 递归列出所有目录中的C++与Python与Ruby的性能
- while循环中while循环的时间复杂度是多少
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 在条件变量中触发错误信号的频率是多少
- 函数的时间复杂度是多少?
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 必须为 C++20 协程帧保留多少内存?
- 每个帧的参考中都有多少性能影响
- 将变量从double改为float会获得多少性能增益