提高Qt程序的性能:Windows vs Linux

Seu*_*eub 15 c++ linux windows performance qt

我已经在这里发布了这个问题,但由于它可能不是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 =我的2核笔记本电脑(@ 1.73Ghz)和Windows 7
  • PC1-linux =我的2核笔记本电脑(@ 1.73Ghz)和Ubuntu 12.04
  • PC2-linux =我的8核笔记本电脑(@ 2.20Ghz)和Ubuntu 12.04

(当然,PC2速度更快并不令人震惊.对我来说不可思议的是PC1-windows和PC1-linux之间的区别).

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

编辑:我将在这里回答一些问题我在评论中被问到.

  • 我刚刚在Windows上安装了Qt SDK,所以我想我有最新版本的所有东西(包括MinGW?).编译器是MinGW.Qt版本是4.8.1.

  • 我没有使用优化标志,因为我注意到当我在发布模式(使用Qt Creator)构建时它们会被自动使用.在我看来,如果我写了像QMAKE_CXXFLAGS + = -O1这样的东西,这只会在调试版本中产生影响.

  • 线程的生命周期等:这很简单.当用户单击"计算"按钮时,同时启动2到6个线程(取决于他正在计算的内容),它们在计算结束时终止.没什么太花哨的.每个线程只进行残酷的计算(实际上,除了一个,每30ms进行一次(不那么)小的计算,基本上检查错误是否足够小).

编辑:最新发展和部分答案

以下是一些新的发展,提供了所有这些的答案:

  • 我想确定速度上的差异是否真的与线程有关.所以我修改了程序,以便计算只使用1个线程,这样我们就可以比较"纯C++代码"的性能了.事实证明,现在Windows只比Linux略慢(15%左右).所以我认为差异的一小部分(但并非无意义)是系统固有的,但最大的部分是由于线程管理.

  • 正如在评论中建议的那样(Luca Carlon,感谢您),我尝试使用Microsoft Visual Studio(MSVC)的编译器而不是MinGW构建应用程序.令人惊讶的是,计算(包括所有线程和所有内容)现在"仅"比Linux慢20%到50%!我想我会继续并对此感到满意.我注意到,奇怪的是,"纯C++"计算(只有一个线程)现在甚至更慢(与MinGW相比),这必须考虑整体差异.所以据我所知,MinGW比MSVC略胜一筹,只不过它会处理像白痴一样的线程.

所以,我想我可以做些什么来制作MinGW(理想情况下我宁愿使用它而不是MSVC)更好地处理线程,或者它不能.我会感到惊讶,怎么可能不知道并记录下来?虽然我想我应该过于谨慎地得出结论,但我只是在一台计算机上进行比较(目前).

Alb*_*rto 4

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