2012-05-09 11 views
11

Tengo un programa de combinación de merchandising multiproceso en C, y un programa para pruebas comparativas con 0, 1, 2 o 4 hilos. También escribí un programa en Python para hacer múltiples pruebas y agregar los resultados.El programa C es más rápido que el subproceso de Python

Lo extraño es que cuando ejecuto Python, las pruebas siempre se ejecutan en aproximadamente la mitad del tiempo en comparación con cuando las ejecuto directamente en el shell.

Por ejemplo, cuando ejecuto el programa de pruebas por sí mismo con 4 millones de números enteros para ordenar (los dos últimos argumentos son la semilla y el módulo de números enteros que generan):

$ ./mergetest 4000000 4194819 140810581084 
0 threads: 1.483485s wall; 1.476092s user; 0.004001s sys 
1 threads: 1.489206s wall; 1.488093s user; 0.000000s sys 
2 threads: 0.854119s wall; 1.608100s user; 0.008000s sys 
4 threads: 0.673286s wall; 2.224139s user; 0.024002s sys 

Utilizando el script en Python:

$ ./mergedata.py 1 4000000 
Average runtime for 1 runs with 4000000 items each: 
0 threads: 0.677512s wall; 0.664041s user; 0.016001s sys 
1 threads: 0.709118s wall; 0.704044s user; 0.004001s sys 
2 threads: 0.414058s wall; 0.752047s user; 0.028001s sys 
4 threads: 0.373708s wall; 1.24008s user; 0.024002s sys 

Esto sucede sin importar cuántos estoy ordenando, o cuántas veces lo ejecuto. El programa python llama al probador con el módulo de subproceso, luego analiza y agrega la salida. ¿Alguna idea de por qué esto sucedería? ¿Python de alguna manera está optimizando la ejecución? o hay algo que lo ralentiza cuando lo ejecuto directamente que no conozco?

Código: https://gist.github.com/2650009

+10

¿Puede mostrarnos el código de Python? – NPE

+3

... y el código C también. O al menos proporcionar un puntero al código en github o similar. –

+7

¿Se debe a que la ejecución desde el shell hace que el programa pase una cantidad desproporcionada de tiempo imprimiendo en la consola? Intenta redirigir 'stdout' a'/dev/null' y ver si eso cambia la situación. –

Respuesta

2

Resulta que estaba pasando sys.maxint al subproceso como el módulo para generar números aleatorios. C estaba truncando el entero de 64 bits e interpretándolo como firmado, es decir, -1 en complemento a dos, por lo que cada número aleatorio estaba siendo modificado por eso y se convertía en 0. Entonces, ordenar los mismos valores parece tomar aproximadamente la mitad mucho tiempo como datos aleatorios.

0

envolver esto en un script de shell, probablemente, tendrá el mismo efecto. si es así, son las operaciones de la consola

+0

El envoltorio en un script bash no tuvo ningún efecto, aún el doble de lento que en python. ¿Qué operaciones de consola estarían afectando tanto al rendimiento? – scry

+0

El almacenamiento en búfer de la salida. Creo que vas a necesitar publicar el script de Python para que todos puedan resolverlo. –

Cuestiones relacionadas