一个简单的多维数组取消引用会很慢吗?
Can a simple multi-dimensional array dereference be slow?
我很难理解我从 gprof 获得的输出。
我有一个简单的包装器 class 围绕着我需要在内存中连续的二维数组。
它的构造函数和我用来访问值的方法是:
Array2d::Array2d(int size, double initialValue)
: mSize(size) {
data = new double *[size];
data[0] = new double[size * size];
for (int i = 1; i < size; ++i) {
data[i] = data[0] + i * size;
}
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
data[i][j] = initialValue;
}
}
}
double &Array2d::operator()(int i, int j) {
return data[i][j];
}
在我正在处理的数字代码中,这是我从 gprof 获得的一个输出:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
49.33 34.80 34.80 43507867293 0.00 0.00 Array2d::operator()(int, int)
18.05 47.53 12.73 jacobi(Array2d&, Array2d&, int, int, double, double, double, int)
我很惊讶 运行 几乎 50% 的时间都花在了访问数组中的值上。
这个 Array2d class 取代了 std::vector<double>
的使用,速度更快。
我在这里没理解什么?
I'm surprised to see that almost 50% of the running time is spent
accessing values from the array.
在没有看到您的代码的情况下,我们不能说太多。编写单次调用百分比较高的代码很容易。考虑
int main() {
while(true){
foo();
}
}
分析器会告诉您接近 100% 的运行时间花在 foo
上。这是否意味着 foo
很慢?不,我们不知道。
您从探查器中获得的百分比更像是在提示您代码中热点的位置。如果您知道 50% 的时间花费在一个特定的函数调用上,那么您就知道这是提高性能的一个很好的候选者。如果你优化这个函数调用,你可以实现高达 x2 的加速(cf amdahls law)。
另一方面,一个仅使用总运行时间 0.1% 的函数可以快 1000 倍,而不会对总运行时间产生重大影响。
无论您的元素访问是慢还是快,您只能知道是否实现了第二个变体,将代码中的其他所有内容保持原样并重复分析。导致更高百分比的变体表现更差。
我很难理解我从 gprof 获得的输出。
我有一个简单的包装器 class 围绕着我需要在内存中连续的二维数组。
它的构造函数和我用来访问值的方法是:
Array2d::Array2d(int size, double initialValue)
: mSize(size) {
data = new double *[size];
data[0] = new double[size * size];
for (int i = 1; i < size; ++i) {
data[i] = data[0] + i * size;
}
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
data[i][j] = initialValue;
}
}
}
double &Array2d::operator()(int i, int j) {
return data[i][j];
}
在我正在处理的数字代码中,这是我从 gprof 获得的一个输出:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
49.33 34.80 34.80 43507867293 0.00 0.00 Array2d::operator()(int, int)
18.05 47.53 12.73 jacobi(Array2d&, Array2d&, int, int, double, double, double, int)
我很惊讶 运行 几乎 50% 的时间都花在了访问数组中的值上。
这个 Array2d class 取代了 std::vector<double>
的使用,速度更快。
我在这里没理解什么?
I'm surprised to see that almost 50% of the running time is spent accessing values from the array.
在没有看到您的代码的情况下,我们不能说太多。编写单次调用百分比较高的代码很容易。考虑
int main() {
while(true){
foo();
}
}
分析器会告诉您接近 100% 的运行时间花在 foo
上。这是否意味着 foo
很慢?不,我们不知道。
您从探查器中获得的百分比更像是在提示您代码中热点的位置。如果您知道 50% 的时间花费在一个特定的函数调用上,那么您就知道这是提高性能的一个很好的候选者。如果你优化这个函数调用,你可以实现高达 x2 的加速(cf amdahls law)。
另一方面,一个仅使用总运行时间 0.1% 的函数可以快 1000 倍,而不会对总运行时间产生重大影响。
无论您的元素访问是慢还是快,您只能知道是否实现了第二个变体,将代码中的其他所有内容保持原样并重复分析。导致更高百分比的变体表现更差。