我目前正在重写我的一个程序。它具有很强的递归功能,可以解决peg-solitaire:
int solve(int draw) {
if (finished())
return true;
//loop over every possible move (about 76 long values)
//do a move (access the board, which is a long value)
if (solve(draw + 1))
return true;
return false;
}
所以我想知道使用这样的解决方案是否更快:
solve(int draw, long **moves, long *board) {}
目前,移动和董事会都是全局变量。
当然我要测试它,但如果有人告诉我这次尝试不会有效,我会节省一些时间:)。
最好的问候
答案 0 :(得分:9)
它可能效率不高,但唯一可以确定的方法是分析您的代码。如果大部分执行时间都花在了实际的游戏逻辑上,那么在堆栈上放置一些参数的微小开销应该可以忽略不计。
但是,从设计的角度来看,避免全局变量要好得多。它允许您的代码无状态,因此可能具有重入性和线程安全性。但是,这可能与您的申请相关,也可能不相关。
答案 1 :(得分:3)
我认为这不是性能瓶颈。
使用您显示的代码,我唯一想到的是:
你需要很长的变量吗?它们通常需要更多空间,这意味着有更多时间使用它们。我记得有一次我用浮点变量替换了双变量,我获得了大幅提升(执行时间缩短了50%)。这可能有点帮助:)
答案 2 :(得分:2)
这看起来好像太快了!
每次调用solve()时,都必须检查是否已完成()。完成()检查的成本将消除可变访问时间的任何差异。
首先纠正它,然后如果它太慢则对其进行分析,然后进行优化!
答案 3 :(得分:1)
将参数传递给函数有一定的开销 - 将参数写入堆栈。 在大多数(可能是全部)现代架构中,堆栈访问和全局数据访问具有相同的速度,因此最有可能传递参数的速度会慢一些。