当前位置: 首页 > 知识库问答 >
问题:

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

慕永年
2023-03-14

我已经在这里发布了这个问题,但是因为它可能不是Qt特定的,我想我也可以在这里试试我的机会。我希望这样做没有不合适(告诉我是否合适)。

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

让我烦恼的是:为了部署Windows,我使用了一台同时安装了Windows7和Ubuntu12.04的笔记本电脑(双启动)。我比较了应用程序在这两个系统上运行的速度,我震惊地发现它在Windows上的速度至少是原来的两倍!如果存在微小的差异,我不会感到惊讶,但如何解释这种差异呢?

以下是一些精度:

  • 我让程序做的计算只是一些残酷而愚蠢的数学计算,基本上,它在一个循环中计算乘积和余弦,这个循环被称为10亿次。另一方面,计算是多线程的:我启动了类似于6个QThreads的东西

我很担心这个应用程序在Windows上的速度会慢很多(2到4倍),这真的很奇怪。另一方面,我还没有在其他装有Windows的电脑上试用过。不过,你知道为什么会有不同吗?

附加信息:一些数据...

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

示例计算n°1(此示例启动2个QThread):

  • PC1-windows: 7.33s
  • PC1-linux: 3.72s
  • PC2-linux: 1.36s

示例计算n°2(此示例启动3个QThread):

  • PC1窗口:6.84s

示例计算n°3(这一个启动6个Q线程):

  • PC1-windows: 8.35s
  • PC1-linux: 2.62s
  • PC2-linux: 0.47s

哪里:

  • PC1 windows=my 2核笔记本电脑(@1.73Ghz)和windows 7
  • PC1 linux=my 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.

    我没有使用优化标志,因为我注意到在发布模式(使用QtCreator)中构建时会自动使用它们。在我看来,如果我编写类似QMAKE_cxflags=-O1的代码,这只会在调试构建中起作用。

    线程的生命周期等:这非常简单。当用户单击“计算”按钮时,同时启动2到6个线程(取决于他正在计算的内容),当计算结束时,线程终止。不要太花哨。每个线程都会进行残酷的计算(实际上,除了一个线程,它每隔30毫秒进行一次(不是很小的)计算,基本上是检查错误是否足够小)。

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

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

    >

    正如某人(Luca Carlon,谢谢)在评论中建议的那样,我尝试使用Microsoft Visual Studio(MSVC)编译器而不是MinGW构建应用程序。令人惊讶的是,计算(所有线程和所有东西)现在只比Linux慢20%到50%!我想我会继续,并对此感到满意。我注意到奇怪的是,“纯C”计算(只有一个线程)现在甚至比MinGW更慢,这必须解释整体差异。就我所知,MinGW比MSVC稍微好一点,只是它像傻瓜一样处理线程。

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

  • 共有3个答案

    谈禄
    2023-03-14

    通过互斥体在Windows和Linux上的运行方式,您可能会体验到性能差异。

    windows上的纯互斥代码在锁定时,每次出现资源争用时都会有15毫秒的等待。在Windows上更好地执行同步机制至关重要。它不会像常规互斥体在大多数情况下那样受到锁定惩罚。

    我发现在Linux上,常规互斥体的性能与Windows上的关键部分相同。

    壤驷向明
    2023-03-14

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

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

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

    裴威
    2023-03-14

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

     类似资料:
    • 我正在用docx4j做一些测试。我需要做的是将复杂的Word文档(2-3页的文本、表格、项目符号列表、图像)转换成XHTML。

    • 我在我的应用程序中创建了第二个DataSource。 我用HikariDataSource创建了它,因为它断开了连接,所以出现了问题。 现在它没有断开,但是很慢 我的配置如下: 爪哇: 有人能告诉我如何提高绩效吗。 它们是表的小查询,分页约为25条记录,需要4秒钟。 我观察到,查询一个select的200条记录需要46秒,而查询只需要2秒。 以前,它们是千分之一秒。 非常感谢。

    • 我们运行在apache kafka 0.10.0. x和Spring 3. x上,不能使用Spring kafka,因为它支持Spring框架版本4. x。 因此,我们使用原生的Kafka Producer API来生成消息。 现在我关心的是我的制片人的表现。问题是我相信有人打电话给是真正连接到Kafka broker,然后将消息放入缓冲区,然后尝试发送,然后可能会调用。 现在,KafkaProd

    • 您可以通过优化您的计算机系统、After Effects、您的项目和您的工作流程来改进性能。此处提供的某些建议不是通过提高渲染速度而是通过降低其他操作(例如,打开项目)所需的时间来改进性能的。 注意:到目前为止,用来改进总体性能的最好方法是提前规划、针对您的工作流程和输出管道运行早期测试、并确认您所提供的内容是您的客户实际需要和预期的内容。(请参阅规划您的工作。) Lloyd Alvarez 在

    • 我有一个cron作业方法,它根据用户的特色故事构建用户的故事提要,跟踪类别并跟踪用户。 最终提要按正确顺序添加到以下数据库表中: 用户提要表: Uid 方法如下,包含注释<代码: 对于30名用户,上述方法需要约35秒才能完成<问:我如何改进代码和性能?

    • 问题内容: 我在基于JBoss的Web应用程序中使用JAXBContext.newInstance操作。据我了解,此操作非常繁重。我只需要Marshaller类的两个唯一实例。 我最初的建议是要有一个静态初始值设定项块,该类将在加载类时仅初始化一次这两个实例: 如果这是一个合理的解决方案,那么我想我会回答自己的问题,但是我想知道这是否是正确的方法? 问题答案: JAXB实现(Metro,Eclip