aplicación AIX xlC de STL significativamente más lento que otras plataformas?
-
23-08-2019 - |
Pregunta
Algo que tarda 1 segundo para correr en Linux tarda 45 segundos en AIX. No he excavado directamente en el código, sino como una prueba agarró una pequeña aplicación que hace muy poco desde otro SO pregunta:
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;
}
Tengo un viejo compilador (7.0.0.10) y no puedo creer lo mucho más lento es el código se ejecuta contra el mismo código en g ++ 4.2.
¿Alguien ha visto esto antes? Haría falta algo de trabajo para actualizar el compilador. El código de ejemplo es aproximadamente 20 veces más lentas (tiempo real) en un sistema con casi sin carga.
Actualizar reqested caja Especificaciones:
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
Salida en AIX:
real 0m0.52s
user 0m0.51s
sys 0m0.00s
Salida en Linux:
0.00s real 0.01s user 0.00s system
Solución
Sospecho una estrategia de asignación de memoria subóptima. ¿Qué ocurre si se agrega
vec.reserve(10000);
antes de que el bucle de?
Otros consejos
O hay algo seriamente mal con su configuración, o no ha publicado el código real. El folowing ejecuta casi instantáneamente en un muy viejo portátil Pentium 900Mhz con poca memoria:
#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, ejecute el código a través de ambos compiladores y reportar los números que salidas.
Un par de sugerencias para localizar el problema:
- Uso de tiempo en su programa y observe el sistema / usuario veces, no el tiempo transcurrido. Eso le dará una indicación mejor.
- poner un
system("date")
antes de cada una de las tres declaraciones push_back iniciales, antes de que el bucle for, antes de que el borrado y antes de la devolución. Esto le mostrará qué operación está causando el problema. - Díganos qué hardware se está ejecutando en también. Es posible que tenga un pSeries 286 de clase.
A continuación, volver a nosotros con los datos duros y podemos ayudar un poco más.