2009-05-21 12 views
1

Linuxでの実行に1秒かかる何かは、AIXでの実行に45秒かかります。私は、そのコードに直接掘っていないが、テストは別のSO質問からはほとんどない小さなアプリケーションつかんだよう:STLのAIX xlC実装は他のプラットフォームよりも大幅に遅いですか?

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倍(リアルタイム)です。

更新Reqestedボックス仕様:

 
    Number Of Processors: 8 
    Processor Clock Speed: 3504 MHz 
    CPU Type: 64-bit 
    Kernel Type: 64-bit 
    Memory Size: 63232 MB 
    Good Memory Size: 63232 MB 
    Platform Firmware level: EM340_041 
    Firmware Version: IBM,EM340_041 
    Console Login: enable 
    Auto Restart: true 
    Full Core: true 

AIX上の出力:

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

Linux上での出力:

0.00s real  0.01s user  0.00s system 
+0

どのようにタイミングをしていますか? 2つのコンパイラによって生成された実行可能ファイルをロードするのにかかる時間に違いが見られるかもしれません。 –

+0

私が投稿したコードを試して、それが作り出す数字を引用してください。 –

答えて

0

私は、最適ではないメモリ割り当て戦略が考えられます。追加するとどうなりますか?

vec.reserve(10000); 

forループの前にはどうなりますか?

+0

あなたは一度に1つ追加するとそれは奇妙な方法で割り当てますか? – ojblass

+0

私はそれが理由かもしれないと言っています。あなたは試してみることができます。 – zvrba

+0

はトリックをしました...今は猛烈なスピードで走っています... – ojblass

0

問題を絞り込むために提案のカップル:

  • プログラムで時間を使用し、ではなく、経過時間を確認してください。それはあなたに良い指示を与えるでしょう。
  • 最初の3つのpush_back文の前、forループの前、消去前、および復帰前にそれぞれsystem("date")を置きます。これは、問題の原因となっている操作を示します。
  • 実行中のハードウェアを教えてください。 286クラスのpSeriesがあるかもしれません。

ハード・データで私たちに連絡してください。もう少しお手伝いできます。

+0

はAM – ojblass

+0

で行います。私は彼が何とか彼のコードのさまざまな部分を区別する必要があることに同意しますが、system()への呼び出しは、質問者のコードを実行するのにかかる時間をはるかに上回りますアイディア。彼は、時間()またはそれに類するものを使用して、ループと時間のサイズを増やすべきです。 –

+0

それはどれくらいかかりますか?彼の元のコードでは45秒だったので、system()はそれを変えません。さらに、サンプルコードが10秒しかかからない場合でも、スリープはどこが遅くなっているかの表示を行います。システム(スリープ)が最も速くチェックされますが、そうでないことが判明した場合は、C time()またはサブ秒変種の1つを使用します。 – paxdiablo

1

セットアップに深刻な問題があるか、実際のコードを投稿していないかのいずれかです。 folowingは、少ないメモリで非常に古いの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

ループ内のメモリから実行すると、0が見つかりませんでした。 – ojblass

+0

それはまだほとんど瞬間であるはずです。このコードを試してください(余分なゼロで修正されています) - いずれかの関数が遅い場合、どの関数が遅いかを特定します –