implementação AIX xlC de STL significativamente mais lento do que outras plataformas?
-
23-08-2019 - |
Pergunta
Algo que leva 1 segundo para rodar em Linux leva 45 segundos para ser executado no AIX. Eu não cavaram diretamente para esse código, mas como um teste agarrou um pequeno aplicativo que faz muito pouco de outra questão 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;
}
Eu tenho um compilador antigo (7.0.0.10) e eu não posso acreditar o quanto mais lento o código é executado contra o mesmo código no g ++ 4.2.
Alguém viu isso antes? Seria preciso algum trabalho para atualizar o compilador. O código de exemplo é cerca de 20 vezes mais lenta (tempo real) em um sistema com quase nenhuma carga.
Atualização reqested Box Especificações:
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
Saída em AIX:
real 0m0.52s
user 0m0.51s
sys 0m0.00s
Saída em Linux:
0.00s real 0.01s user 0.00s system
Solução
Eu suspeito que uma estratégia de alocação de memória abaixo do ideal. O que acontece se você adicionar
vec.reserve(10000);
antes do loop for?
Outras dicas
Ou há algo muito errado com sua configuração, ou não colocaram o código real. Os executa folowing quase instantaneamente em um velho laptop 900Mhz Pentium com pouca memória:
#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;
}
Por favor executar este código através de ambos os compiladores e relatar os números que saídas.
Um par de sugestões para reduzir o problema:
- Use o tempo em seu programa e olhar para os tempos do sistema / utilizador, não o tempo decorrido. Isso lhe dará uma indicação melhor.
- colocar um
system("date")
antes de cada uma das três declarações push_back iniciais, antes do loop for, antes do apagar e antes do retorno. Isto irá mostrar que a operação está causando o problema. - Diga-nos o hardware que está em execução no bem. Você pode ter um pSeries 286 de classe.
Em seguida, voltar para nós com os dados do disco e nós podemos ajudar um pouco mais.