¿Hay alguna forma de ejecutar un programa C ++ más lento cambiando los parámetros del sistema operativo en Linux? De esta manera, me gustaría simular lo que sucederá si ese programa en particular se ejecuta en una máquina realmente más lenta.
En otras palabras, una máquina más rápida debería comportarse como una máquina más lenta para ese programa en particular.
nice
es un comando que reduce la prioridad de programación. Varían antiguos, relativamente toscos. Puede mirar las prioridades de programación, pero si la máquina no está ocupada haciendo otras cosas, su programa seguirá funcionando rápido. Por lo tanto, probablemente no ayudará lo suficiente.Respuestas:
nice
(y / orenice
). También puede hacerlo mediante programación utilizando lanice()
llamada al sistema. Esto no ralentizará la velocidad de ejecución per se, pero hará que el programador de Linux asigne menos (y posiblemente más cortos) marcos de tiempo de ejecución, se adelanta con más frecuencia, etc. Consulte Programación de procesos (Capítulo 10) de Comprensión del kernel de Linux para obtener más detalles sobre la programación. .cpufreq-set
comando.sched_yield()
, que cederá cuántica a otros procesos, en partes críticas de rendimiento de su programa (requiere cambio de código).malloc()
,free()
,clock_gettime()
etc., utilizando LD_PRELOAD , y hacer algunas cosas tontas como quemar unos pocos millones de ciclos de CPU conrep; hop;
, inserción de las barreras de memoria, etc. Esto ralentizará el programa de seguro. (Vea esta respuesta para ver un ejemplo de cómo hacer algunas de estas cosas).-O0
y habilitar aserciones (es decir-DDEBUG
).Espero eso ayude.
fuente
-ggdb3
) no ralentiza la ejecución del binario. Simplemente lo hace más grande.QEMU es un emulador de CPU para Linux. Debian tiene paquetes para eso (imagino que la mayoría de las distribuciones lo harán). Puede ejecutar un programa en un emulador y la mayoría de ellos deberían admitir ralentizar las cosas. Por ejemplo, Miroslav Novak tiene parches para ralentizar QEMU.
Alternativamente, puede realizar una compilación cruzada en otra CPU-linux (arm-none-gnueabi-linux, etc.) y luego hacer que QEMU traduzca ese código para ejecutarlo.
La buena sugerencia es simple y puede funcionar si la combina con otro proceso que consumirá cpu.
¿No dijo si necesita gráficos, archivos y / o E / S de red? ¿Sabe algo sobre la clase de error que está buscando? ¿Es una condición de carrera o el código simplemente funciona mal en el sitio de un cliente?
Editar: también puede usar señales como STOP y CONT para iniciar y detener su programa. Un depurador también puede hacer esto. El problema es que el código se ejecuta a toda velocidad y luego se detiene. La mayoría de las soluciones con el programador de Linux tendrán este problema.
Había una especie de analizador de hilos de Intel. Veo Notas de la versión de Vtune . Esto es Vtune, pero estaba bastante seguro de que hay otra herramienta para analizar carreras de hilos.Consulte: Intel Thread Checker , que puede verificar algunas condiciones de carrera de subprocesos. ¿Pero no sabemos si la aplicación es multiproceso?fuente
Utilizar
cpulimit
:Está en los repositorios de Ubuntu. Sólo
Aquí hay algunos ejemplos sobre cómo usarlo en un programa que ya se está ejecutando:
fuente
fuente
Si solo desea simular su programa para analizar su comportamiento en una máquina realmente lenta, puede intentar hacer que todo su programa se ejecute como
thread
otro programa principal .De esta manera, puede priorizar el mismo código con diferentes prioridades en pocos hilos a la vez y recopilar datos de su análisis. Lo he usado en el desarrollo de juegos para el análisis de procesamiento de cuadros.
fuente
Use dormir o espere dentro de su código. No es la forma más brillante de hacerlo, pero es aceptable en todo tipo de computadora con diferentes velocidades.
fuente
La forma más sencilla posible de hacerlo sería envolver su código ejecutable principal en un bucle while con un sueño al final.
Por ejemplo:
Como la gente mencionará, esta no es la forma más precisa, ya que su código lógico seguirá funcionando a velocidad normal pero con retrasos entre ejecuciones. Además, asume que su código lógico es algo que se ejecuta en un bucle.
Pero es simple y configurable.
fuente