我已经在这里发布了这个问题,但是因为它可能不是Qt特定的,我想我也可以在这里试试我的机会。我希望这样做没有不合适(告诉我是否合适)。
我开发了一个小型的科学程序,可以进行一些数学计算。我试着优化它,使它尽可能快。现在我几乎完成了为Windows、Mac和Linux用户部署它。但是我还没有能够在许多不同的计算机上测试它。
让我烦恼的是:为了部署Windows,我使用了一台同时安装了Windows7和Ubuntu12.04的笔记本电脑(双启动)。我比较了应用程序在这两个系统上运行的速度,我震惊地发现它在Windows上的速度至少是原来的两倍!如果存在微小的差异,我不会感到惊讶,但如何解释这种差异呢?
以下是一些精度:
我很担心这个应用程序在Windows上的速度会慢很多(2到4倍),这真的很奇怪。另一方面,我还没有在其他装有Windows的电脑上试用过。不过,你知道为什么会有不同吗?
附加信息:一些数据...
尽管Windows似乎在使用两个内核,但我认为这可能与线程管理有关,原因如下:
示例计算n°1(此示例启动2个QThread):
示例计算n°2(此示例启动3个QThread):
示例计算n°3(这一个启动6个Q线程):
哪里:
(当然,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)更好地处理线程,要么就是做不到。我会很惊讶,它怎么会不为人所知和记录?虽然我想我应该小心不要太快下结论,但我只在一台电脑上比较了(目前)。
通过互斥体在Windows和Linux上的运行方式,您可能会体验到性能差异。
windows上的纯互斥代码在锁定时,每次出现资源争用时都会有15毫秒的等待。在Windows上更好地执行同步机制至关重要。它不会像常规互斥体在大多数情况下那样受到锁定惩罚。
我发现在Linux上,常规互斥体的性能与Windows上的关键部分相同。
我听说过一个案例,如果你写错了,Windows写文件的速度非常慢。(这与Qt无关。)
在这种情况下,问题是开发人员使用了SQLite数据库,编写了大约10000个数据集,并在每次插入后执行SQLCOMMIT
。这导致Windows每次都将整个DB文件写入磁盘,而Linux只会更新RAM中文件系统索引节点的缓冲版本。在这种情况下,速度差异甚至更大:在Linux上是1秒,而在视窗上是1分钟。(在他最后将SQLite更改为只提交一次后,在Windows上也是1秒。)
因此,如果您将计算结果写入磁盘,您可能需要检查是否经常调用fsync()
或fflush()
。如果您编写的代码来自一个库,您可以使用strace
来实现这一点(Linux,但应该会给您一个基本的想法)。
另一个选择可能是:在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