2011-04-10 54 views
6

处理需要GA的问题。我已经完成了所有这些工作,并花费了相当多的时间来修改fat并在优化代码之前优化编译器。由于GA是作为用户输入的结果运行的,因此它必须在合理的时间内找到解决方案,否则用户界面将失去作用,并且根本无法正常运行。我在iPhone 3GS上得到这个二进制遗传算法解决了约0.1秒的27个变量问题。遗传算法优化 - 使用-O3标志

为了达到这样的性能水平,整个遗传算法用C编码,而不是Objective-C编码。

为了进一步减少运行时间,我正在考虑将“-O3”优化开关仅用于求解器模块的想法。我试过了,它将运行时间缩短了近一半。

我应该通过将优化设置为“-O3”来关注任何问题吗?请记住,我在文件级而不是整个项目都是这样做的。

+0

-O3通常还是比较安全的,只要你写的代码是“标准的”,并且不做任何非常具体的诡计。即便如此,由于iPhone的编译器只需为少数几个系统生成工作代码,它可能会好起来的。 – 2011-04-10 03:06:53

+0

只需添加,如果您担心UI拖延,您可能需要考虑在并发线程上执行计算。 – David 2011-04-10 03:13:05

+0

我想过要添加一个并发线程。问题在于现在编写代码的方式我没有数据来启动GA,直到用户与UI进行交互。为了启动一个单独的线程,我不得不扩展主状态机来做一些预见性的工作,并预测GA将需要什么。不是不可能的,但如果我可以通过让GA更快地避免它,我宁愿继续处理更紧迫的问题。我应该补充一点,GA的输出决定了下一次UI更新的样子。 – 2011-04-10 03:20:37

回答

5

-O3标志将使代码的工作方式与以前相同(只是速度更快),只要您不做任何不安全的事情或者依赖于编译器对它做什么。

另外,正如评论中所建议的,让计算在单独的线程中运行以防止UI被锁定可能是一个好主意。这也使您可以灵活地使计算更加昂贵,或者显示进度条等等。


棘手的东西

优化产生意想不到的结果,如果你试图在栈上直接别的地方访问的东西,或移动堆栈指针,或者如果你做一些固有的非法的,像忘记初始化一个变量(一些编译器(MinGW)将它们设置为0)。

例如

int main() { 
    int array[10]; 
    array[-2] = 13; // some negative value might get the return address 
} 

其他一些棘手的东西涉及到优化器本身填塞。当-O3完全破坏代码时,这是一个example

+0

我接受了你的回答。不过,如果你可以像别人所说的那样涵盖“棘手的东西”,那就太好了。 – 2011-04-11 20:10:46

+0

对不起,延迟,没有互联网。增加了一些会失败的东西 – evgeny 2011-04-14 07:12:27