在 Linux 上没有太多经验,我有一些经过良好测试的代码,没有从 MSVC、ICC 得到编译错误/警告,在 Windows 平台上也能完美运行。
然后我将这些代码复制到我新安装的 linux 系统(带有 GCC 4.8.1 的 Ubuntu 13.10),然后我使用 CDT 安装了最新版本的 eclipse(3.8.1 左右)并使用系统的 GCC 编译器对其进行了配置。
Eclipse CDT/GCC 可以很好地处理我编写的所有琐碎的测试代码,然后我要求 GCC 从 Windows 编译大量经过良好测试的代码。
GCC 编译它没有错误也没有警告,并且程序在微不足道的工作负载下运行良好,但是,一旦我给程序一些真实世界的负载,它基本上卡住,需要永远完成(在 Windows 中,同样的程序可以在几秒钟内完成“真实世界”的有效载荷。
谁能告诉我我应该寻找什么来解决这个问题,或者 GCC 在 Debug模式下太慢了(我的意思是,至少比 ICC/MSVC 的 Debug模式慢 2-3 个数量级),谢谢。
Release模式的编译优化级别设置为 O3, Debug模式的默认设置(没有优化,或者至少我是这么认为的)。
问题是,我的感觉是 ICC/MSVC 的 Debug模式(没有优化)二进制文件比 GCC 的二进制文件快得多(我的意思是,大约快 1000 倍)。
更新:(目前我似乎无法在 stackoverflow 发表评论,所以我必须在这里回复,抱歉):
ams: 好吧,我等了几分钟,看到程序还在运行我就中止了它,所以我不知道程序是否能完成。但是,只要payload很小,就可以正常完成。
至于代码的瓶颈,嗯,我认为是内存限制。
代码的大部分时间 (80+%) 都在对大型输入数据数组进行基数排序,我编写的优化基数排序代码可以在 Windows 中每秒对 200-3 亿个 32 位浮点值进行排序,但是使用相同的硬件,在 Linux 中,似乎要花费数小时甚至永远来对大约 1000 万长度的数据数组进行排序。
更新:
感谢大家的帮助,我发现问题出在我在 linux 上搞砸的一些宏,现在一切正常。
最佳答案
你有三个选择:
- 启用日志记录以查看代码的作用。如果您没有日志记录,请添加它。
- 使用分析器收集有关时间花在何处的信息。看看valgrind .我有点担心您的应用程序永远不会终止;不确定 valgrind 是否可以处理这个问题。
- 使用调试器并在一段时间后中断您的程序,看看它做了什么。重复直到你看到一个模式
关于linux - Debug模式下速度极慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20047666/