繁体   English   中英

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

[英]Speed performance of a Qt program: Windows vs Linux

我已经在这里发布了这个问题,但由于它可能不是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)更好地处理线程,或者它不能。 我会感到惊讶,怎么可能不知道并记录下来? 虽然我想我应该过于谨慎地得出结论,但我只是在一台计算机上进行比较(目前)。

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

我听说过一个案例,如果你做错了,Windows写文件的速度非常慢。 (这与Qt无关。)

在这种情况下的问题是开发人员使用SQLite数据库,编写了大约10000个数据集,并在每次插入后执行了SQL COMMIT 这导致Windows每次都将整个DB文件写入磁盘,而Linux只会更新RAM中文件系统inode的缓冲版本。 在这种情况下,速度差异更加严重:Linux上1秒,Windows上1分钟。 (之后他将SQLite改为仅在最后提交一次,在Windows上也是1秒。)

因此,如果您将计算结果写入磁盘,则可能需要检查是否经常调用fsync()fflush() 如果您的编写代码来自库,您可以使用strace (仅限Linux,但应该给您一个基本的想法)。

根据互斥体在Windows和Linux上的运行方式,您可能会遇到性能差异。

每次锁定时存在争用资源时,Windows上的纯互斥代码都可以等待15ms。 Windows上更好的同步机制是关键部分 在大多数情况下,它不会遇到常规互斥体经历的锁定惩罚。

我发现在Linux上,常规互斥锁执行与Windows上的Critical Sections相同。

它可能是内存分配器,尝试使用谷歌的jemalloctcmalloc Glibc的ptmalloc3明显优于MSVC的crt中的旧硬壳分配器。 Microsoft的可比选项是Concurrency CRT,但您不能简单地将其作为替代品放入。

我注意到我的电脑上的行为完全相同。 我运行Windows 7(64位),Ubuntu(64位)和OSX(Lion 64位),我的程序比较2个XML文件(每个超过60Mb)。 它也使用多线程(2个线程):

-Windows : 40sec

-Linux : 14sec (!!!)

-OSX : 22sec.

我使用个人类来处理线程(而不是Qt),它在linux / OSX上使用“pthread”,在windows上使用“线程”。 我使用Qt / mingw编译器,因为我需要Qt的XML类。

我发现没有办法(现在)让3 OS有类似的表现......但我希望我会!

我认为另一个原因可能是内存:我的程序使用大约500Mb的RAM。 所以我认为Unix是最好的管理,因为在单线程中,Windows的速度正好慢1.89倍,而且我认为Linux的速度不会慢2倍!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM