El código se ejecuta más lento con g ++ -std = c ++ 0x

Estaba tratando de probar la diferencia en el rendimiento de std::swap y vector::swap y compilé con y sin el -std=c++0x opción. He notado alrededor de ~200ms de diferencia, con el programa funcionando más rápido cuando no incluyo esta opción.

#include <iostream>
#include <string>
#include <vector>

int main()
{
    commentator.setReportStream (cout);

    size_t nbElts = 2048;
    vector<int> v, w;

    v.resize (nbElts);
    w.reserve (nbElts);

    for (int i = 0; i < nbElts; ++i) {
        w.push_back (i);
    }

    commentator.start ("std::swap", __FUNCTION__);
    for (int i = 0; i < 10000000; ++i) {
        std::swap (v, w);
    }
    commentator.stop (MSG_DONE);

    commentator.start ("vector::swap", __FUNCTION__);
    for (int i = 0; i < 10000000; ++i) {
        v.swap (w);
    }
    commentator.stop (MSG_DONE);
    return 0;
}

El objeto comentarista muestra el tiempo de ejecución. ¿Por qué es la diferencia en el tiempo de ejecución? gcc versión 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC)

Tiempo de ejecución sin -std=c++0x

std::swap...done (0.319952 s)
Completed activity: std::swap (r: 0.3214s, u: 0.32s, s: 0s) done

vector::swap...done (0.26396 s)
Completed activity: vector::swap (r: 0.2652s, u: 0.264s, s: 0s) done

con -std=c++0x

std::swap...done (0.548917 s)
Completed activity: std::swap (r: 0.5507s, u: 0.5489s, s: 0s) done

vector::swap...done (0.508922 s)
Completed activity: vector::swap (r: 0.5105s, u: 0.5089s, s: 0s) done

preguntado el 03 de mayo de 12 a las 18:05

200ms de que? Hace una pequeña diferencia si el programa tardó 210 ms en ejecutarse en total o si tardó 6 horas. Tampoco sabemos qué versión de su compilador está usando o con qué banderas está compilando. Así que realmente no podemos decir mucho más que "bueno, supongo que su compilador genera un código diferente cuando std=c++0x se especifica, ¿eh?" -

¿Cuántas veces ejecutaste esto? La diferencia parece lo suficientemente grande como para ser significativa, pero el promedio de 10 ejecuciones puede revelar una variación significativa en los tiempos. -

@NathanS. Lo he ejecutado suficientes veces en realidad, y estoy notando lo mismo:

@martani_net Si no estás compilando al menos -O2, entonces no tiene sentido medir el rendimiento. Es como pedirle a Usain Bolt que corra con pesas y sin zapatos. -

@Mysticial: o más exactamente, como cronometrar su carrera sin decirle que se supone que debe correr -

1 Respuestas

Bueno, no sabemos qué versión de G++ estás usando y no sabemos qué banderas especificas al compilar.

Pero si su código tarda medio segundo en hacer algunos millones de intercambios de punteros (intercambio de vectores en C++ 0x), entonces creo que es bastante seguro decir que está compilando sin optimizaciones habilitadas. Si está comparando código sin optimización, obtiene datos inútiles y está perdiendo el tiempo. Si le preocupa la velocidad de su código, dígale a su compilador que genere código rápido y luego medir las diferencias.

contestado el 03 de mayo de 12 a las 19:05

El compilador probablemente eliminaría todo el bucle con las opciones activadas. - Cachorrito

En realidad, el código es parte de una biblioteca en la que realmente no cambiaría las opciones con las que está compilado (-O0, por ejemplo). Lo que estoy buscando es ver si el intercambio hace copias o no, pero supongo que esta sería una pregunta separada: 0xFF

Bueno, eso es bastante fácil de responder, para esta muestra. En la primera parte de la prueba, intercambias ints. Deben copiarse, no hay atajos ni forma de realizar una operación de movimiento destructiva. Entonces, en esa parte, están claramente copiados. En la segunda parte, intercambias vectores. Vectores puede ser conmovido, pero ¿eso sucede? Bueno, mira los tiempos. Tardó medio segundo en intercambiar 10 millones de entradas. También toma alrededor de medio segundo intercambiar 10 millones de vectores. Eso no sería posible si el vector se copiara cada vez. Por lo tanto, concluyo que los vectores se mueven, no se copian. jalf

¡No veo claramente su comparación de 'intercambiar 10 millones de enteros' e 'intercambiar 10 millones de vectores'! ¡en ambos bucles, los vectores se intercambian! - 0xFF

Ah, sí, lo siento, leí mal tu código :) ¿Cuál es el valor de nbElts? - jalf

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.