数组中的不同浮点值会影响性能 10 倍 - 为什么?
Different float values in array impact performance by 10x - why?
请查看我的代码和下面的问题 - 谢谢
法典:
#include <iostream>
#include <chrono>
using namespace std;
int bufferWriteIndex = 0;
float curSample = 0;
float damping[5] = { 1, 1, 1, 1, 1 };
float modeDampingTermsExp[5] = { 0.447604, 0.0497871, 0.00247875, 0.00012341, 1.37263e-05 };
float modeDampingTermsExp2[5] = { -0.803847, -3, -6, -9, -11.1962 };
int main(int argc, char** argv) {
float subt = 0;
int subWriteIndex = 0;
auto now = std::chrono::high_resolution_clock::now();
while (true) {
curSample = 0;
for (int i = 0; i < 5; i++) {
//Slow version
damping[i] = damping[i] * modeDampingTermsExp2[i];
//Fast version
//damping[i] = damping[i] * modeDampingTermsExp[i];
float cosT = 2 * damping[i];
for (int m = 0; m < 5; m++) {
curSample += cosT;
}
}
//t += tIncr;
bufferWriteIndex++;
//measure calculations per second
auto elapsed = std::chrono::high_resolution_clock::now() - now;
if ((elapsed / std::chrono::milliseconds(1)) > 1000) {
now = std::chrono::high_resolution_clock::now();
int idx = bufferWriteIndex;
cout << idx - subWriteIndex << endl;
subWriteIndex = idx;
}
}
}
如您所见,im正在测量每秒bufferWriteIndex
的计算次数或增量。
问题:
为什么使用modeDampingTermsExp
时性能更快 - 程序输出:
12625671
12285846
12819392
11179072
12272587
11722863
12648955
与使用modeDampingTermsExp2
?
1593620
1668170
1614495
1785965
1814576
1851797
1808568
1801945
它的速度大约快了 10 倍。似乎这两个数组中的数字对计算时间有影响。为什么?
我正在使用带有以下标志的Visual Studio 2019:/O2/Oi/Ot/fp:fast
这是因为您正在击中非正常数字(另请参阅此问题(。
你可以像这样摆脱异常:
#include <cmath>
// [...]
for (int i = 0; i < 5; i++) {
damping[i] = damping[i] * modeDampingTermsExp2[i];
if (std::fpclassify(damping[i]) == FP_SUBNORMAL) {
damping[i] = 0; // Treat denormals as 0.
}
float cosT = 2 * damping[i];
for (int m = 0; m < 5; m++) {
curSample += cosT;
}
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在容量内调整矢量大小时的性能影响
- 未达到的情况会影响开关外壳性能
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- 为 lambda 分配名称会影响性能吗?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 每个帧的参考中都有多少性能影响
- C++:if 内部循环的性能影响
- C :对输入验证函数进行编程的性能影响可以对其进行编程,而每次都可以将其编程
- GSL 的预期 (cond) 对运行时施加的性能影响是什么?
- VS2005调试模式和发布模式之间存在巨大的性能影响
- 如何分析指针锯齿的性能影响
- 指针和性能影响
- notify_one性能影响
- 可变长度阵列性能影响 (C/C++)
- 包含每个标头是否有任何性能影响
- 在'for-loop'中使用'break'的性能影响
- 当RVO显示最大的性能影响时
- signal():任何性能影响
- 解引用字符串迭代器和性能影响