处理需要GA的问题.在完成编译器优化之前,我已经完成了所有这些工作并花了相当多的时间来修剪脂肪并优化代码.因为GA由于用户输入而运行,所以它必须在合理的时间段内找到解决方案,否则UI会停止并且根本不会很好地运行.我得到了这个二进制GA在iPhone 3GS上解决了大约0.1秒的27变量问题.
为了达到这种性能水平,整个GA用C编码,而不是Objective-C.
为了进一步减少运行时间,我考虑了仅为求解器模块使用"-O3"优化开关的想法.我尝试了它,它将运行时间减少了近一半.
我应该通过将优化设置为"-O3"来关注任何陷阱吗?请记住,我在文件级别执行此操作,而不是整个项目.
-O3 flag会使代码以与之前相同的方式工作(只有更快),只要你不做任何不安全或者依赖于编译器对它做什么的棘手的东西.
此外,正如评论中所建议的那样,让计算在单独的线程中运行以防止UI锁定可能是个好主意.这也使您可以灵活地使计算更加昂贵,或者显示进度条或其他任何内容.
棘手的东西
如果您尝试直接访问堆栈中的内容,或者将堆栈指针移动到其他位置,或者如果您执行某些本质上非法的操作,那么优化将产生意外结果,例如忘记初始化变量(某些编译器(MinGW)会将它们设置为0) .
例如
int main() {
int array[10];
array[-2] = 13; // some negative value might get the return address
}
Run Code Online (Sandbox Code Playgroud)
其他一些棘手的事情涉及优化器自身填充.下面是一个例子当-O3完全打破了代码.