c++ - Qt 程序的速度性能 : Windows vs Linux

标签 c++ windows linux performance qt

我已经发布了这个问题 here ,但由于它可能不是特定于 Qt 的,我想我也可以在这里尝试一下。我希望这样做不是不合适的(如果是,请告诉我)。

我开发了一个小型科学程序来执行一些数学计算。我试图优化它,使其尽可能快。现在我几乎已经为 Windows、Mac 和 Linux 用户部署了它。但是我还没有能够在许多不同的计算机上测试它。

困扰我的是:为了部署 Windows,我使用了一台同时安装了 Windows 7 和 Ubuntu 12.04 的笔记本电脑(双启动)。我比较了在这两个系统上运行的应用程序的速度,我震惊地观察到 在 Windows 上它至少慢两倍! 如果有一点点差异,我不会感到惊讶,但是如何解释这种差异呢?

这里有几个精度:

  • 我让程序做的计算只是一些残酷而愚蠢的数学计算,基本上,它在一个循环中计算乘积和余弦,这个循环被称为十亿次。另一方面,计算是多线程的:我启动了 6 个 QThreads 之类的东西。
  • 笔记本电脑有两个内核@1.73Ghz。起初我认为 Windows 可能没有使用其中一个内核,但后来我查看了处理器事件,根据小图形,两个内核都在 100% 运行。
  • 然后我认为 Windows 的 C++ 编译器没有使用 Linux 的 C++ 编译器自动执行的优化选项(比如 -O1 -O2)(在发布版本中),但显然它确实如此。

  • 我很烦恼这个应用程序在 Windows 上太慢了(2 到 4 倍),这真的很奇怪。另一方面,我还没有在其他装有 Windows 的计算机上尝试过。不过,您知道为什么会有所不同吗?

    附加信息:一些数据…

    尽管 Windows 似乎使用了两个内核,但我认为这可能与线程管理有关,原因如下:

    示例计算 n°1(这个启动了 2 个 QThreads):
  • PC1-windows:7.33s
  • PC1-linux:3.72s
  • PC2-linux:1.36s

  • 示例计算 n°2(这个启动了 3 个 QThreads):
  • PC1-windows:6.84s
  • PC1-linux:3.24s
  • PC2-linux:1.06s

  • 示例计算 n°3(这个启动了 6 个 QThreads):
  • PC1-windows:8.35s
  • PC1-linux:2.62s
  • PC2-linux:0.47s

  • 在哪里:
  • PC1-windows = 我的带有 Windows 7 的 2 核笔记本电脑 (@1.73Ghz)
  • PC1-linux = 我的 2 核笔记本电脑 (@1.73Ghz) 和 Ubuntu 12.04
  • PC2-linux = 我的 8 核笔记本电脑 (@2.20Ghz) 和 Ubuntu 12.04

  • (当然,PC2 更快并不令人震惊。令我难以置信的是 PC1-windows 和 PC1-linux 之间的差异)。

    注意:我还尝试在 Mac OS 下的最近的 PC(4 或 8 核 @~3Ghz,不记得确切)上运行该程序,速度与 PC2-linux 相当(或稍快)。

    编辑:我将在这里回答我在评论中被问到的几个问题。
  • 我刚刚在 Windows 上安装了 Qt SDK,所以我想我拥有所有东西的最新版本(包括 MinGW?)。编译器是MinGW。 Qt 版本是 4.8.1。
  • 我没有使用优化标志,因为我注意到当我在 Release模式下(使用 Qt Creator)构建时会自动使用它们。在我看来,如果我写一些类似 QMAKE_CXXFLAGS += -O1 的东西,这只会在调试版本中起作用。
  • 线程的生命周期等:这很简单。当用户点击“计算”按钮时,会同时启动 2 到 6 个线程(取决于他在计算什么),当计算结束时它们会终止。没有什么太花哨的。每个线程都只是进行粗暴的计算(除了一个,实际上,它每 30 毫秒进行一次(不那么)小“计算,基本上是检查错误是否足够小)。

  • 编辑:最新动态和部分答案

    以下是一些新的发展,为所有这些提供了答案:
  • 我想确定速度的差异是否真的与线程有关。所以我修改了程序,以便计算只使用 1 个线程,这样我们就可以比较“纯 C++ 代码”的性能。事实证明,现在 Windows 只比 Linux 慢一点(大约 15%)。所以我猜 差异的一小部分(但并非不显着)是系统固有的,但最大的部分是由于线程管理 .
  • 正如有人(Luca Carlon,感谢您)在评论中建议的那样,我尝试使用 Microsoft Visual Studio (MSVC) 的编译器而不是 MinGW 来构建应用程序。令人惊讶的是,计算(包括所有线程和所有内容)现在“仅”比 Linux 慢 20% 到 50%!我想我会继续前进并对此感到满意。不过,我注意到奇怪的是,“纯 C++”计算(只有一个线程)现在甚至更慢(比使用 MinGW),这必须解释整体差异。据我所知, MinGW 比 MSVC 稍好,只是它像白痴一样处理线程 .

  • 所以,我想要么我可以做些什么来使 MinGW(理想情况下我宁愿使用它而不是 MSVC)更好地处理线程,要么就是不能。我会很惊讶,它怎么可能不被广为人知和记录?虽然我想我应该小心不要太快得出结论,但我只在一台计算机上比较了东西(目前)。

    最佳答案

    另一个选项可能是:在 linux 上刚刚加载 qt,这可能会发生,即如果您使用 KDE,而在 Windows 中必须加载库,因此这会减慢计算时间。要检查有多少库加载浪费了您的应用程序,您可以使用纯 C++ 代码编写一个虚拟测试。

    关于c++ - Qt 程序的速度性能 : Windows vs Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878980/

    相关文章:

    c++ - 工厂方法是否适合我的问题?

    python - pip 版本 virtualenv 不匹配,不会升级

    windows - Microsoft SysVAD虚拟音频设备驱动程序(SYSVAD)

    javascript - 在 Windows Metro 风格的 Javascript 应用程序中读取文件内容

    linux - 用于重命名文件的 Shell 脚本 - Shell 脚本

    javascript - 使用 grep 捕获 javascript 链接

    c++ - 多线程 TCP 服务器的 TCPStream 类

    c++ - 删除链表末尾的节点C++

    c++ - stringstream 在 4GB 处溢出

    C: 未初始化的 int 类型大小必须大于