Внедрение STL в AIX xlC значительно медленнее, чем на других платформах?
-
23-08-2019 - |
Вопрос
То, что для запуска в 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 раз медленнее (в режиме реального времени) в системе, которая почти не загружена.
Обновить Запрошенные спецификации коробки:
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
Решение
Я подозреваю неоптимальную стратегию распределения памяти.Что произойдет, если вы добавите
vec.reserve(10000);
перед циклом for?
Другие советы
Либо с вашей настройкой что-то серьезно не так, либо вы не опубликовали реальный код.Следующее выполняется почти мгновенно на очень старом ноутбуке Pentium с частотой 900 МГц и небольшим объемом памяти:
#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;
}
Пожалуйста, запустите этот код через оба компилятора и сообщите числа, которые он выводит.
Пара предложений, чтобы сузить круг проблем:
- Используйте time в своей программе и смотрите на системное / пользовательское время, не прошедшее время.Это даст вам лучшее представление.
- поставьте
system("date")
перед каждым из трех начальных операторов push_back, перед циклом for, перед стиранием и перед возвратом.Это покажет, какая операция вызывает проблему. - Расскажите нам, на каком оборудовании вы также работаете.У вас может быть pSeries класса 286.
Затем свяжитесь с нами с достоверными данными, и мы сможем помочь вам еще немного.