在Linux上没有太多经验,我有一些经过良好测试的代码,没有任何补偿错误/来自MSVC,ICC的警告,也可以在Windows平台上完美运行。
然后我将这些代码复制到我新安装的Linux系统(Ubuntu 13.10 with GCC 4.8.1)然后我用CDT安装了最新版本的eclipse(3.8.1左右),并使用系统的GCC编译器进行配置。 / p>
Eclipse CDT / GCC可以很好地处理我编写的所有琐碎的测试代码,然后我要求GCC从Windows编译大量经过良好测试的代码。
GCC编译它没有任何错误并且没有警告,并且程序运行良好的琐碎工作负载,但是,一旦我给程序一些真实的有效负载,它基本上freezen,需要永远完成(当在Windows中,同一个程序可以在几秒钟内完成“真实世界”的有效载荷。
任何人都可以告诉我应该找到什么来解决这个问题,或者GCC在调试模式下是那么慢(我的意思是,比ICC / MSVC的调试模式慢至少2-3个数量级),谢谢。
对于发布模式,编译优化级别设置为O3,并且调试模式的默认设置(没有优化,或者至少是我认为的那样)。
问题是,我的感觉是ICC / MSVC的调试模式(没有优化)二进制比GCC快得多(我的意思是,快一千倍)。
更新:(目前看来我无法在stackoverflow发表评论,所以我必须在这里回复,对不起):
ams:好吧,我等了几分钟,看到程序仍然运行我只是中止它,所以我不知道程序是否可以完成。但是,只要有效载荷非常小,它就可以正常完成。
至于代码的瓶颈,嗯,我认为它的记忆有限。
大部分时间(80 +%)代码正在使用大输入数据阵列进行基数排序,我写的优化基数排序代码可以在Windows中每秒排序200-300万32位浮点值,但是使用相同的硬件,在linux中似乎需要几个小时才能对1000万长度数据阵列进行排序。
更新
感谢所有人的帮助,我发现问题出在一些宏,我搞砸了linux,现在一切正常。
答案 0 :(得分:1)
您有三种选择:
答案 1 :(得分:1)
我同意那些说在gdb
之类的调试器下运行它并用Ctrl-C中断它的人(在程序的输出窗口中)。然后在gdb
中说thread 1
以使其进入活动线程。然后说bt
以获得堆栈跟踪。
然后通过在堆栈中键入up
和down
(以及在必要时通过键入p variablename
)数据来检查每行代码,这样您就可以理解为什么它正在执行它在你打断它的时间。
既然你知道它需要的时间比它应该的长,那就意味着你在行为不端的情况下抓住它的可能性非常接近于确定。
(注意:没有必要1.将此视为测量问题,或2.尝试区分无限循环或只是长时间运行。)
这是random-pausing技术。
答案 2 :(得分:0)
除了所有其他建议之外,我还想提一下GCC提供的new compiler flag -Og应该可以提高调试版本的性能。
答案 3 :(得分:0)
你使用" top"或者其他命令/工具来监视系统资源的运行时间(分配)....以便在处理期间更深入地了解内存消耗和CPU负载?
使用调试器,例如" gdb" (在Linux上可以正常工作)您可以添加(和删除)条件和无条件断点并逐步执行代码(在构建调试可执行文件之后)。 我用" gdb"集成在Eclipse中,它为您提供了许多关于运行时进程的视图(例如按钮和控制台窗口)。 您还可以添加其他测试代码打印语句,默认情况下会转发到您的控制台窗口....
使用调试器,可以确定在哪个子进程中消耗了大量时间/资源。在确定之后,您可以专注于解决特定问题/不规则/错误/资源食者。
您是否也在非调试模式下运行可执行文件("运行"而不是" debug")?如果是,您可以比较相对"表演"。