AIX xlC Implementierung von STL deutlich langsamer als andere Plattformen?
-
23-08-2019 - |
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
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.