Frage

Etwas, das 1 Sekunde dauert auf Linux laufen dauert 45 Sekunden auf AIX laufen. Ich habe gegraben nicht direkt in diesen Code, sondern als Test packte eine kleine Anwendung, die von einer anderen SO Frage sehr wenig tut:

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;
}

Ich habe einen alten Compiler (7.0.0.10) und ich kann nicht glauben, wie viel langsamer der Code ausgeführt wird gegenüber dem gleichen Code auf g ++ 4.2.

Hat jemand dieses vorher gesehen? Es würde einige Arbeit, den Compiler zu aktualisieren. Der Beispielcode ist etwa 20-mal langsamer (Echtzeit) auf einem System mit nahezu keine Last.

Update Reqested Box Spezifikationen:

    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

Ausgabe auf AIX:

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

Ausgabe auf Linux:

 0.00s real     0.01s user     0.00s system
War es hilfreich?

Lösung

Ich vermute, dass eine suboptimale Speicherzuordnungsstrategie. Was passiert, wenn Sie fügen

vec.reserve(10000);

vor der for-Schleife?

Andere Tipps

Entweder gibt es etwas falsch mit Ihrem Setup, oder Sie haben nicht den echten Code geschrieben. Die folowing führt fast sofort auf einem sehr alten 900Mhz Pentium Laptop mit wenig Speicher:

#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;
}

Bitte führen Sie diesen Code durch beide Compiler und berichten über die Zahlen es gibt.

Ein paar Vorschläge, das Problem zu verengen:

  • Verwenden Sie Zeit auf dem Programm und sehen Sie die System- / Benutzer mal, nicht verstrichene Zeit. Das gibt Ihnen eine bessere Anzeige.
  • legte eine system("date") vor jedem der drei Anfängen push_back Aussagen vor dem for-Schleife, vor dem Löschen und vor der Rückkehr. Dies wird zeigen, welche Operation das Problem verursacht.
  • Sagen Sie uns welche Hardware Sie laufen auch auf. Sie können eine 286-Klasse pSeries.

Dann mit den harten Daten an uns zurück und wir können noch mehr helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top