为什么 C++ 代码在一台计算机上的运行时间比在另一台计算机上的运行时间长得多?

为什么 C++ 代码在一台计算机上的运行时间比在另一台计算机上的运行时间长得多?

代码完全相同——我将其从一台计算机复制到另一台计算机。代码在两台计算机上均使用从 fink on OSX 获得的 g++-4 (4.9.1) 进行编译,并且未并行运行。

编译器选项为“-O2”,计算机基本不做其他事情(CPU 和内存使用率低)。代码是 2400 行的研究代码关联

机器 1:

  • 2013 年末 MacBook Pro Retina,
  • 2.8 GHz i7-4558U,
  • 16GB 1600MHz DDR3,
  • 500GB 闪存

机器2:

  • 2013 年末 MacPro 工作站,
  • 3.5GHz 6 核 Intel Xeon E5-1650,
  • 32GB 1867MHz DDR3
  • 251GB 闪存,
  • 3TB 外置 SATA 硬盘

运行时间:
机器 1:输出 200 秒,不含 18 秒。
机器 2:(/ 目录 - 应为闪存驱动器):输出 2230 秒,不含 2075 秒。
机器 2:(~ 目录 - 应为外部驱动器):输出 2262 秒,不含 2080 秒。

关于如何改善 MacPro 的运行时间,有什么想法吗?

答案1

解决“为什么这段代码运行时间这么长”这个问题的正确方法是使用一个叫做分析器。

基本上,你通过分析器或附加分析器来运行程序,分析器会记录程序在各个函数上花费的时间。然后以某种形式将这些信息呈现给你,让你可以精确定位程序在执行过程中运行时间最长的部分。通常还可以从该报告中获得其他信息,例如程序的哪些部分被调用的次数最多,诸如此类的信息,这些信息也可以指出需要仔细审查的领域。

根据这些数据,通常很容易判断哪些部分需要优化,以使程序运行得更快,而无需使用被称为“过早优化”的猜谜游戏或依赖某些特定硬件的细节。

答案2

这是一个推测,但您的代码适用于磁盘和磁盘 I/O,我假设这是您的瓶颈 - 您提到它在具有 500GB 闪存的机器上运行速度比在具有 250GB 闪存的机器上运行速度更快 - 从逻辑上讲,这是有道理的,因为闪存本质上是较小(32/64GB)闪存芯片的 raid-0,而 raid-0 阵列中的更多芯片/磁盘将大大提高性能。我不知道存储的具体品牌/型号/固件/控制器,但我怀疑如果您进行磁盘 I/O 测试,您会发现两台机器的性能存在类似的差异。这样的性能测试可以最好的使用基准测试

相关内容