gprof 在我的系统 (MinGW) 上无法正常工作,因此我想知道以下哪一个片段的平均效率更高。
我知道 C 编译器内部会将所有内容转换为指针算术,但尽管如此,我还是想知道以下任何代码片段是否比其他代码片段具有任何显着优势。
该数组已作为一维数组在连续内存中动态分配,并且可以在运行时重新分配(它适用于简单的棋盘游戏,其中允许玩家重新定义棋盘的大小,只要他想要)。
请注意,i 和 j 必须在每次循环迭代中计算并传递到函数 set_cell() 中(gridType 是一个简单的结构,带有一些整数和指向另一个单元结构的指针)。
提前致谢!
分配内存
grid = calloc( (nrows * ncols), sizeof(gridType) );
代码段 #1(按 1D 顺序解析)
gridType *gp = grid;
register int i=0 ,j=0; // we need to pass those in set_cell()
if ( !grid )
return;
for (gp=grid; gp < grid+(nrows*ncols); gp++)
{
set_cell( gp, i, j, !G_OPENED, !G_FOUND, value, NULL );
if (j == ncols-1) { // last col of current row has been reached
j=0;
i++;
}
else // last col of current row has NOT been reached
j++;
}
代码段#2(解析为二维数组,仅使用指针)
gridType *gp1, *gp2;
if ( !grid )
return;
for (gp1=grid; gp1 < grid+nrows; gp1+=ncols)
for (gp2=gp1; gp2 < gp1+ncols; gp2++)
set_cell( gp2, (gp1-grid), (gp2-gp1), !G_OPENED, !G_FOUND, value, NULL );
代码段 #3(解析为 2D,仅使用计数器)
register int i,j; // we need to pass those in set_cell()
for (i=0; i<nrows; i++)
for (j=0; j<ncols; j++)
set_cell( &grid[i * ncols + j], i, j, !G_OPENED, !G_FOUND, value, NULL);
可用内存
free( grid );
编辑: 在保罗修正之后,我在第一个循环中将 #2 形式 gp1++) 修复为 gp1+=ncols)(谢谢!)
最佳答案
对于这样的事情,答案将取决于编译器和运行它的机器。您可以尝试每个代码片段,并计算每个代码片段需要多长时间。
然而,这是过早优化的一个典型例子。最好的办法是选择看起来最清晰、最可维护的片段。从长远来看,这样做会给您带来更多的好处,而不是选择在您的机器上最快的机器(无论如何在别人的机器上可能不是最快的!)而节省任何费用。
关于c - C 中的二维动态数组 : Which of those 3 snippets gets executed faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943071/