gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:14:21 24 4
gpt4 key购买 nike

我对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com