一维数组映射方式的性能差异问题
Performance of differences 1-dimensional array mapping way issue
现在我要遵循以下主题
二维阵列与一维数组的性能
特别是,当我在我的代码中分配.cpp代码时。
实际上下面的方法非常慢,然后只是映射
1
int getIndex(int row, int col) return row*NCOLS+col;
#define NROWS 10
#define NCOLS 20
This:
int main(int argc, char *argv[]) {
int myArr[NROWS*NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[getIndex(i,j)] = i+j;
}
}
return 0;
}
比
阿拉伯数字
#define NROWS 10
#define NCOLS 20
This:
int main(int argc, char *argv[]) {
int myArr[NROWS*NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[row*NCOLS+col] = i+j;
}
}
return 0;
}
但我不明白为什么"1"比"2"慢?
在实验中,"1"几乎是"2"的两倍。 我认为这是没有道理的。
因为您没有启用优化。getIndex()
足够小,可以(几乎可以肯定)内联。仅仅在Visual Studio上启用发布模式就使"慢速"版本变得如此之快,以至于我无法使阵列足够大来测量时间而不会遇到堆栈溢出。访问堆上的数组会扭曲测试结果,因此这不是一个选项。除此之外,您没有在代码中使用 2D 数组,它看起来像这样:int myArr[NROWS][NCOLS]
.
简单的数学(如i + j
)很可能也不会成为代码中的瓶颈。如果它成为一个,你应该先寻找新的算法。例如:你真的需要遍历整个数组,还是其他不按索引访问数组的数据类型更合适?在极少数情况下,像这样的微优化是真正必要的。可能永远不会,如果您的数组大小为10*20
个元素。
追求可读性,完成程序,分析它,然后欺骗该循环是否真的需要优化。
因为在第一个示例中使用函数,而在第二个示例中使用它内联。您可能知道,当程序调用函数时,它会保存其当前状态,然后再次返回。为此,它需要一点时钟周期。
所以根据您的代码。您的第一个示例通过调用函数使用一点位时钟周期,而不是第二个示例。因此,第二个可能比第一个更快。
在这里,您可以找到类似的逻辑:http://www.cplusplus.com/forum/articles/20600/
相关文章:
- 在类中使用随机生成器时出现性能问题
- Qt OpenGL 渲染到纹理性能问题
- 剪辑性能问题
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- OpenCV - 基本操作 - 性能问题 [模式:发布]
- 使用 #define 进行跟踪日志记录以避免性能问题
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- std::函数有性能问题,如何避免?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 在C 中读取大型CSV文件性能问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 如何修复macOS线程互斥锁性能缓慢的问题?
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- C 功能性能问题
- 一维数组映射方式的性能差异问题
- 在C 性能问题中使用Getter返回地图
- 初始化每个班级成员时的性能问题
- 事件(开始,结束),1天的最大事件.C++ 中的性能问题
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- OpenGL:MESA3D屏幕上的软件渲染性能问题