Performance STL的AIX xlC实现明显比其他平台慢?
在Linux上运行需要1秒的东西在AIX上运行需要45秒。我没有直接深入研究该代码,但作为一个测试,我从另一个SO问题抓取了一个小应用程序,它做的很少:Performance STL的AIX xlC实现明显比其他平台慢?,performance,stl,aix,Performance,Stl,Aix,在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_ba
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;
}
Linux上的输出:
0.00s real 0.01s user 0.00s system
缩小问题范围的几点建议:
- 在程序中使用时间,查看系统/用户时间,而不是运行时间。这将给你一个更好的指示
- 将
放在三个初始push_-back语句之前、for循环之前、erase之前和return之前。这将显示导致问题的操作系统(“日期”)
- 告诉我们您正在运行的硬件。您可能有286类pSeries
然后返回硬数据给我们,我们可以提供更多帮助。一些缩小问题范围的建议:
- 在程序中使用时间,查看系统/用户时间,而不是运行时间。这将给你一个更好的指示
- 将
放在三个初始push_-back语句之前、for循环之前、erase之前和return之前。这将显示导致问题的操作系统(“日期”)
- 告诉我们您正在运行的硬件。您可能有286类pSeries
然后返回硬数据给我们,我们可以提供更多帮助。我怀疑内存分配策略不理想。如果你加上
vec.reserve(10000);
在for循环之前?我怀疑内存分配策略不理想。如果你加上
vec.reserve(10000);
在for循环之前?要么您的设置有严重错误,要么您没有发布真正的代码。在一台非常旧的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;
}
#包括
#包括
#包括
使用名称空间std;;
int main(int argc,字符**argv){
时间\u t now 1=时间(0);
std::vec;
向量推回(6);
向量推回(-17);
向量推回(12);
对于(int i=0;i您的设置可能存在严重错误,或者您没有发布真正的代码。以下内容几乎可以在内存很少的非常旧的900Mhz奔腾笔记本电脑上立即执行:
#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;
}
#包括
#包括
#包括
使用名称空间std;;
int main(int argc,字符**argv){
时间\u t now 1=时间(0);
std::vec;
向量推回(6);
向量推回(-17);
向量推回(12);
对于(int i=0;i您是如何计时的?您可能会看到加载这两个编译器生成的可执行文件所用的时间有所不同。请尝试我发布的代码并引用它生成的数字。您是如何计时的?您可能会看到加载这两个编译器生成的可执行文件所用的时间有所不同。示例请尝试我发布的代码,并引用它生成的数据。我同意他需要以某种方式区分代码的各个部分,但调用system()将远远超过执行提问者代码所需的时间,我认为这不是一个好主意。他应该增加循环的大小,并使用time()增加时间或者类似。这取决于需要多长时间。对于他的原始代码,需要45秒,因此system()不会淹没它。此外,即使示例代码只需要10秒,sleep也会给出速度变慢的指示。system(sleep)是检查速度最快的,但是是的,如果没有结论,请使用C time()或者是一个亚秒级的变体。抱歉陷入了一个问题…我在循环中的代码中丢失了一个0,硬件非常昂贵…Linux盒子是el cheapo…我同意他需要以某种方式区分代码的各个部分,但是对system()的调用将远远超过执行提问者代码所花费的时间,我认为这不是一个好主意。他应该使用time()或类似的方法增加循环的大小和时间。这取决于所花费的时间。对于他的原始代码,它是45秒,所以system()是不会淹没它。此外,即使示例代码只需要10秒,sleep也会指示它在哪里变慢。系统(sleep)是最快的检查方法,但是是的,如果没有结论,请使用C time()或者是一个亚秒级的变体。很抱歉陷入了一个问题中…我在循环中的代码中缺少了一个0,硬件非常昂贵…Linux box是el cheapo…你是说一次添加一个会使它以一种奇怪的方式分配吗?我是说这可能是一个原因。你只能通过尝试才能发现。所以stl实现在gcc中,哪一个可能更新的版本有更好的内部分配策略?这是一个试图优化代码或升级编译器的论点吗?两者都有?这是一个使用更好的STL实现的论点。尝试使STLPort与编译器一起工作。你是说一次添加一个会使它以一种奇怪的方式分配吗?我是说它是这样的这可能是一个原因。您只能通过尝试才能找到答案。因此,gcc中可能较新的stl实现具有更好的内部分配策略?这是尝试优化代码或升级编译器的参数吗?两者都是?这是使用更好的stl实现的参数。请尝试使stl端口与您的编译器一起工作。很抱歉,错过了0当从循环中的内存执行时,它应该仍然几乎是即时的。请尝试此代码(使用额外的零修改)-如果在循环中从内存执行时,其中任何函数错过了0,则它将确定哪些函数速度慢。它应该仍然几乎是即时的。尝试此代码(使用额外的零修改)-如果其中任何一项功能失效,它将查明哪些功能运行缓慢