2012-01-26 16 views
5

Estoy portando código C++ de Linux a Windows. Durante este proceso, descubrí que la siguiente línea se ~ 10 veces más lento en Windows (en exactamente el mismo hardware):Asignación de memoria de Windows vs. Linux/std :: lista, rendimiento del constructor

list<char*>* item = new list<char*>[160000]; 

En Windows se tarda ~ 10 ms, mientras que en Linux se necesita ~ 1 ms. Tenga en cuenta que este es el tiempo promedio. Ejecutar esta fila 100 veces lleva ~ 1 segundo en Windows.

Esto ocurre tanto en win32 como en x64, ambas versiones están compiladas en Release, y la velocidad se mide a través de QueryPerformanceCounter (Windows) y gettimeofday (Linux).

El compilador de Linux es gcc. El compilador de Windows es VS2010.

¿Alguna idea de por qué podría suceder esto?

+3

Veo un aumento de flamewar ... de todos modos, probablemente debería hacer cosas en un ciclo más o menos, estos números probablemente no signifiquen tanto como 10 ms es fácilmente perturbado por otras cosas que suceden. medir en la cantidad de unos pocos segundos al menos. Pero incluso entonces, supongo que la forma predeterminada de asignar memoria en Windows es más lenta. Solo juega un poco y haz que se parezca más a un patrón que usarías en tu programa. – PlasmaHH

+10

@EdHeal: arreglamos la máquina del tiempo. ahora puedes viajar a 1998 y vivir felizmente allí. –

+0

@ssg no estoy seguro. Por mi parte, hice mi mejor esfuerzo para tener un temporizador de resolución de 5ms en Qt y no hay forma de hacerlo en Windows. – UmNyobe

Respuesta

10

Podría ser más un problema de implementación de la biblioteca. Esperaría una asignación única en la mayoría de los casos, con el constructor predeterminado para list sin asignar nada. Entonces, lo que está tratando de medir es el costo del constructor predeterminado list (que se ejecuta 160000).

Digo "tratando de medir", porque cualquier medida que sea pequeña es que mide la fluctuación de reloj y la resolución más de lo que están midiendo el código veces de ejecución. Debe poner esto en un bucle, para ejecutarlo con la frecuencia suficiente para obtener un tiempo de ejecución de un par de segundos. Y cuando hace esto, debe tomar precauciones para asegurarse de que el compilador no optimiza nada.

Y en Linux, quiere medir usando clock(), al menos; la pared tiempo de reloj que obtienes desde gettimeofday depende mucho de qué más ocurra al mismo tiempo . (No use clock() en Windows, sin embargo. La implementación de Windows está rota.)

+1

Acepto, esto es medir el costo del constructor de 'std :: list', no la asignación de memoria. Además, sería trivial medir los dos por separado, utilizando la asignación seguida de * placement-'new [] '*. –

+0

Resultó ser cierto, la lista <> ctor es donde pasó la mayor parte del tiempo. –

2

Creo que esta instrucción lleva menos tiempo en ambos sistemas operativos (independientemente de cualquier cosa). En este caso, toma tan poco tiempo que puede estar midiendo la resolución de sus temporizadores.

Cuestiones relacionadas