具有空构造函数使数组未初始化会使计算速度变慢
Having empty constructor that leaves arrays uninitialized makes slower calculation
我对一件事感到非常困惑... 如果我将构造函数添加到结构 A,那么在 for 循环中计算会变慢很多倍。为什么?我不知道。
在我的计算机上,输出中代码段的时间是:
带构造函数:1351
不带构造函数:220
这是一个代码:
#include <iostream>
#include <chrono>
#include <cmath>
using namespace std;
using namespace std::chrono;
const int SIZE = 1024 * 1024 * 32;
using type = int;
struct A {
type a1[SIZE];
type a2[SIZE];
type a3[SIZE];
type a4[SIZE];
type a5[SIZE];
type a6[SIZE];
A() {} // comment this line and iteration will be twice faster
};
int main() {
A* a = new A();
int r;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for (int i = 0; i < SIZE; i++) {
r = sin(a->a1[i] * a->a2[i] * a->a3[i] * a->a4[i] * a->a5[i] * a->a6[i]);
}
high_resolution_clock::time_point t2 = high_resolution_clock::now();
cout << duration_cast<milliseconds>(t2 - t1).count() << ": " << r << endl;
delete a;
system("pause");
return 0;
}
但是,如果我像这样从 for 循环中删除 sin() 方法:
for (int i = 0; i < SIZE; i++) {
r = a->a1[i] * a->a2[i] * a->a3[i] * a->a4[i] * a->a5[i] * a->a6[i];
}
删除构造函数无关紧要,执行时间相同,等于 78。
你对这段代码有类似的行为吗?你知道其中的原因吗?
编辑: 我用Visual Studio 2013编译它
是的,如果在发布配置中编译(通过优化),则此行为在Visual Studio 2019中仍然可以重现。
如果struct A
具有空的用户构造函数,则其字段在new A()
后保持未初始化状态。
另一方面,如果struct A
没有构造函数,则它将成为聚合,new A()
用零填充其字段。
计算乘法然后正弦具有独立于输入参数的相同性能(如果它们不是非规范化值,这里不是这种情况),但是在初始化带有零的字段后,它们会出现在 CPU 缓存中,因此以下计算速度更快,这解释了无构造函数版本的"好处"(当然, 如果不包括在测量中,则包括对象构建的时间)。
如果保留空构造函数,然后手动用零填充对象:
A* a = new A();
for (int i = 0; i < SIZE; i++)
a->a1[i] = a->a2[i] = a->a3[i] = a->a4[i] = a->a5[i] = a->a6[i] = 0;
那么程序的速度将与A
中没有构造函数的情况下一样快。
相关文章:
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 计算速度与间隔反向比率
- 如何根据物体位置和速度,玩家位置和向前矢量计算左耳和右耳的音量?(3D声音)
- 使用额外的变量使计算更容易理解 - (多少)我减慢了代码的速度?
- 具有空构造函数使数组未初始化会使计算速度变慢
- 通过使用指针/引用,在C++中使用向量加快计算速度
- OpenGL 计算着色器分离循环的速度更快
- 可以在CUDA速度计算中实现TensorFlow自定义OP梯度
- 计算速度 /使程序更快
- C++计算套接字传输速度
- 分配std::vector数组会减慢后续计算的速度
- 诊断和提高计算速度
- 如何使程序在不同计算机上以相同的速度运行
- 从速度和方向计算速度
- 如何加快程序的计算速度
- c++比c#的计算速度快15倍,这是合法的吗?
- Python模拟显示慢性能,如何加快数组计算速度
- 提振.计算速度比普通CPU慢
- dll在多大程度上加快了循环等代码中的计算速度
- 如何提高我的c++计算速度?