【问题标题】:AIX xlC implementation of STL significantly slower than other platforms?AIX xlC 执行STL 明显比其他平台慢?
【发布时间】:2010-10-27 20:28:53
【问题描述】:

在 Linux 上运行需要 1 秒的东西在 AIX 上运行需要 45 秒。我没有直接深入研究该代码,但作为一个测试抓住了一个小应用程序,它从另一个 SO 问题中做的很少:

int main ( int argc, char **argv)
{
int i = 0;
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);

for (i=0;i<100000;i++)
   vec.push_back(i);

vec.erase(vec.begin() + 1);
return 0;
}

我有一个旧编译器 (7.0.0.10),我无法相信代码运行速度与 g++ 4.2 上的相同代码相比要慢多少。

有人见过这个吗?升级编译器需要一些工作。示例代码在几乎没有负载的系统上慢了大约 20 倍(实时)。

更新要求的盒子规格:

处理器数量:8 处理器时钟速度:3504 MHz CPU 类型:64 位 内核类型:64位 内存大小:63232 MB 良好的内存大小:63232 MB 平台固件级别:EM340_041 固件版本:IBM,EM340_041 控制台登录:启用 自动重启:真 全核心:真

AIX 上的输出:

real    0m0.52s
user    0m0.51s
sys     0m0.00s

Linux 上的输出:

 0.00s real     0.01s user     0.00s system

【问题讨论】:

  • 你的计时怎么样?您可能会看到加载由两个编译器生成的可执行文件所需的时间不同。
  • 请尝试我发布的代码并引用它产生的数字。

标签: performance stl aix


【解决方案1】:

您的设置存在严重问题,或者您没有发布真实代码。在一台非常旧的 900Mhz Pentium 笔记本电脑上几乎可以立即执行以下操作:

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;;

int main ( int argc, char **argv) {

    time_t now1 = time(0);
    std::vector<int> vec;
    vec.push_back(6);
    vec.push_back(-17);
    vec.push_back(12);
    for ( int i = 0; i<10000; i++) {
      vec.push_back(i);
    }

    time_t now2 = time(0);
    vec.erase(vec.begin() + 1);

    time_t now3 = time(0);
    cout << (now2 - now1) << " " << (now3 - now2)  << endl;
}

请通过两个编译器运行此代码并报告它输出的数字。

【讨论】:

  • 抱歉,在循环中从内存中执行时错过了 0。
  • 它应该仍然几乎是即时的。试试这段代码(用额外的零修改) - 它会查明哪些函数很慢,如果它们中的任何一个 ar
【解决方案2】:

我怀疑内存分配策略不是很理想。如果添加会发生什么

vec.reserve(10000);

在for循环之前?

【讨论】:

  • 你是说一次添加一个会导致分配方式很奇怪?
  • 我说这可能是一个原因。只有尝试才能发现。
  • 那么 gcc 中可能较新的 stl 实现有更好的内部分配策略?
  • 这是试图优化代码或提高编译器的理由吗?两者都有?
  • 这是使用更好的 STL 实现的论据。尝试使 STLPort 与您的编译器一起工作。
【解决方案3】:

一些缩小问题范围的建议:

  • 在您的程序上使用时间并查看系统/用户时间,不是已用时间。这将为您提供更好的指示。
  • 在三个初始 push_back 语句中的每一个之前、for 循环之前、擦除之前和返回之前放置一个 system("date")。这将显示导致问题的操作。
  • 告诉我们您正在运行什么硬件。你可能有一个 286 类的 pSeries。

然后将硬数据返回给我们,我们可以提供更多帮助。

【讨论】:

  • 我同意他需要以某种方式区分代码的各个部分,但是对 system() 的调用将远远超过执行提问者代码所需的时间,我认为这不是好主意。他应该使用 time() 或类似方法来增加循环的大小和时间。
  • 这取决于它需要多长时间。对于他的原始代码,它是 45 秒,因此 system() 不会淹没它。此外,即使示例代码只需要 10 秒,sleep 也会指示它在哪里变慢。 System(sleep) 是检查速度最快的方法,但可以,如果不能确定,请使用 C time() 或亚秒变体之一。
  • 抱歉陷入了一个问题……我在循环中的代码中遗漏了一个 0,而且硬件非常昂贵……Linux 机器太便宜了……
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2013-03-11
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多