implementação AIX xlC de STL significativamente mais lento do que outras plataformas?

StackOverflow https://stackoverflow.com/questions/891554

  •  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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top