在 C 中使用参数调用与使用全局变量

标签 c assembly arguments

我对 x86 汇编有很好的理解,并且我知道当调用函数时,所有参数都会被插入堆栈。

我有一个函数,它基本上循环遍历 8 x 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

最佳答案

您在分析方面做得很好。您需要考虑最坏情况下的函数并对其进行更详细的分析。

在进行分析时,您可能想要尝试不同的编译器优化设置。

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

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

如果该函数正常工作,我建议发布到 CodeReview@StackExchange.com。

不要假设任何事情。

关于在 C 中使用参数调用与使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384782/

相关文章:

c - 不确定数据部分反汇编中的一些说明

assembly - 检查数字是奇数还是偶数(数学奇偶校验)

javascript - 使用从对象中获取的参数创建一个元素 - JavaScript

bash - 如果 arguments 等于这个字符串,定义一个像这个字符串的变量

我可以依靠 malloc 返回 NULL 吗?

c - C 中的缓冲区互斥锁和条件变量

c++ - 返回类型 int 的函数默认返回值 1?

debugging - 代码突出显示在OllyDbg上不起作用

c# - 如何将参数传递给通过 Assembly.CreateInstance 加载的 C# 插件?

c - 字符串数组、strcpy 和字符串的问题