C中的2D动态数组:这3个片段中的哪一个执行得更快?

Har*_* K. -1 c arrays 2d dynamic

gprof在我的系统上运行不正常(MinGW)所以我想知道以下哪个片段平均效率更高.

我知道内部C编译器会将所有内容转换为指针算术,但我仍然想知道以下任何一个代码段是否比其他代码段具有任何显着优势.

该数组已作为1d数组动态分配在连续内存中,并且可以在运行时重新分配(它用于简单的棋盘游戏,允许玩家按照自己的意愿重新定义棋盘的大小) .

请注意,i&j必须计算并在每次循环迭代中传递给函数set_cell()(gridType是一个带有几个int的简单结构和一个指向另一个单元结构的指针).

提前致谢!

分配内存

grid = calloc( (nrows * ncols), sizeof(gridType) );
Run Code Online (Sandbox Code Playgroud)

片段#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++;
}
Run Code Online (Sandbox Code Playgroud)

Snippet#2(解析为2D数组,仅使用指针)

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 );
Run Code Online (Sandbox Code Playgroud)

代码段#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);
Run Code Online (Sandbox Code Playgroud)

免费记忆

free( grid );
Run Code Online (Sandbox Code Playgroud)

编辑:我修正了#2格式gp1 ++)到gp1 + = ncols),在第一个循环中,保罗修正后(thx!)

tho*_*att 5

对于这样的事情,答案将取决于编译器和您运行它的机器.您可以尝试每个代码段,并计算每个代码片段的时长.

但是,这是过早优化的一个主要例子.最好的办法是选择看起来最清晰,最易维护的片段.从长远来看,你可以获得更多的好处,而不是从你选择机器上最快的那些节省中获得的好处(无论如何,这可能不是别人的最快!)