【发布时间】:2016-11-30 21:33:23
【问题描述】:
假设我有一个已知大小的小矩阵,其大小在软件的生命周期内不太可能发生变化。如果我需要检查每个矩阵元素,使用循环或手动索引到每个矩阵位置会更有效吗?
例如,假设我有一个由 3 个窗口组成的系统,每个窗口有 2 个窗格。我需要跟踪每个窗格的状态。在我的系统中,只有 3 个窗口,每个窗口 2 个窗格。
static const int NUMBER_OF_WINDOWS = 3;
static const int NUMBER_OF_PANES = 2;
static const int WINDOW_LEFT = 0;
static const int WINDOW_MIDDLE = 1;
static const int WINDOW_RIGHT = 2;
static const int PANE_TOP = 0;
static const int PANE_BOTTOM = 1;
paneState windowPanes[NUMBER_OF_WINDOWS][NUMBER_OF_PANES];
这些访问方法中哪一种更有效?
循环版本:
for (int ii=0; ii<NUMBER_OF_WINDOWS; ii++)
{
for (int jj=0; jj<NUMBER_OF_PANES; jj++)
{
doSomething(windowPanes[ii][jj];
}
}
对比
手动访问版本:
doSomething(windowPanes[WINDOW_LEFT][PANE_TOP]);
doSomething(windowPanes[WINDOW_MIDDLE][PANE_TOP]);
doSomething(windowPanes[WINDOW_RIGHT][PANE_TOP]);
doSomething(windowPanes[WINDOW_LEFT][PANE_BOTTOM]);
doSomething(windowPanes[WINDOW_MIDDLE][PANE_BOTTOM]);
doSomething(windowPanes[WINDOW_RIGHT][PANE_BOTTOM]);
循环代码是否会生成分支指令,这些指令是否会比手动访问时生成的指令成本更高?
【问题讨论】:
-
最好使用定义 (
#define NUMBER_OF_WINDOWS 3) 而不是常量,因为编译器更明显地根据我的回答优化 for 循环。 -
如果你真的想知道,用
-S编译并查看程序集。和/或分析两组代码。根据doSomething中的代码,编译器可以做出很多不同的选择。 -
“数据集......不会更改”。直到它发生。
标签: c++ c performance