使用参数调用而不是在C中使用Globals

时间:2015-05-21 21:35:58

标签: c assembly arguments

我对x86程序集有一个很好的理解,我知道当一个函数被调用时,所有参数都被压入堆栈。

我有一个函数,它基本上循环通过一个8乘8的数组,并根据数组中的值调用一些函数。这些函数调用中的每一个都涉及传递6-10个参数。这个程序需要很长时间才能运行,它是一个国际象棋AI,但这个功能需要20%的运行时间。

所以我想我的问题是,如何让我的函数以更快的方式访问他们需要的变量?

int row,col,i;  
determineCheckValidations(eval_check, b, turn);
int * eval_check_p = &(eval_check[0][0]);

for(row = 0; row < 8; row++){
    for(col = 0; col < 8; col++, eval_check_p++){
        if (b->colors[row][col] == turn){
            int type = b->types[row][col];
            if (type == PAWN)
                findPawnMoves(b,moves_found,turn,row,col,last_move,*eval_check_p);
            else if (type == KNIGHT)
                findMappedNoIters(b,moves_found,turn,row,col,*move_map_knight, 8, *eval_check_p);
            else if (type == BISHOP)
                findMappedIters(b,moves_found,turn,row,col,*move_map_bishop, 4, *eval_check_p);
            else if (type == ROOK)
                findMappedIters(b,moves_found,turn,row,col,*move_map_rook, 4, *eval_check_p);
            else if (type == QUEEN)
                findMappedIters(b,moves_found,turn,row,col,*move_map_queen, 8, *eval_check_p);
            else if (type == KING){
                findMappedNoIters(b,moves_found,turn,row,col,*move_map_king, 8, *eval_check_p);
                findCastles(b,moves_found,turn,row,col);
            }
        }
    }
}

所有代码都可以在@ https://github.com/AndyGrant/JChess/tree/master/_Core/_Scripts

找到

个人资料的样本:

  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 20.00      1.55     1.55  2071328     0.00     0.00  findAllValidMoves
 14.84      2.70     1.15 10418354     0.00     0.00  checkMove
 10.06      3.48     0.78  1669701     0.00     0.00  encodeBoard
  7.23      4.04     0.56 10132526     0.00     0.00  findMappedIters
  6.84      4.57     0.53  1669701     0.00     0.00  getElement
  6.71      5.09     0.52 68112169     0.00     0.00  createNormalMove

1 个答案:

答案 0 :(得分:0)

您在分析方面做得很好。您需要在最坏的情况下使用该功能并更详细地描述它。

您可能希望在配置文件时尝试不同的编译器优化设置。

尝试一些常见的优化技术,例如循环展开和从循环中分解出不变量。

通过设计处理器数据缓存的功能,您可以获得一些改进。在网上搜索“优化数据缓存”。

如果功能正常,我建议发布到CodeReview@StackExchange.com。

不要假设任何事情。