Existe alguma maneira de executar um programa C ++ mais lento alterando os parâmetros do sistema operacional no Linux? Desta forma, gostaria de simular o que acontecerá se aquele programa específico rodar em uma máquina realmente mais lenta.
Em outras palavras, uma máquina mais rápida deve se comportar como uma máquina mais lenta para aquele programa específico.
nice
é um comando que reduz a prioridade de agendamento. Variar antigo, relativamente bruto. Você pode olhar as prioridades de agendamento, mas se a máquina não estiver ocupada fazendo outras coisas, seu programa ainda funcionará rápido. Portanto, provavelmente não ajudará o suficiente.Respostas:
nice
(e / ourenice
). Você também pode fazer isso programaticamente usando anice()
chamada do sistema. Isso não diminuirá a velocidade de execução em si, mas fará com que o agendador do Linux aloque menos (e possivelmente mais curtos) quadros de tempo de execução, antecipe com mais frequência, etc. Consulte Agendamento de processos (Capítulo 10) de Entendendo o kernel do Linux para obter mais detalhes sobre agendamento .cpufreq-set
comando.sched_yield()
, o que renderá quantum para outros processos, em partes críticas de desempenho de seu programa (requer mudança de código).malloc()
,free()
,clock_gettime()
etc. usando LD_PRELOAD , e fazer algumas coisas tolas como queimar alguns milhões de ciclos de CPU comrep; hop;
, inserir barreiras de memória etc. Isto irá desacelerar o programa, com certeza. (Veja esta resposta para um exemplo de como fazer algumas dessas coisas).-O0
e habilite asserções (ou seja-DDEBUG
).Espero que ajude.
fonte
-ggdb3
) não retarda a execução do binário. Apenas o torna maior.QEMU é um emulador de CPU para Linux. O Debian tem pacotes para isso (imagino que a maioria das distros terá). Você pode executar um programa em um emulador e a maioria deles deve suportar a lentidão das coisas. Por exemplo, Miroslav Novak tem patches para desacelerar o QEMU.
Alternativamente, você pode fazer a compilação cruzada para outra CPU-linux (arm-none-gnueabi-linux, etc) e então fazer com que o QEMU traduza esse código para ser executado.
A boa sugestão é simples e pode funcionar se você combiná-la com outro processo que consuma cpu.
Você não disse se precisa de E / S de gráficos, arquivos e / ou rede? Você sabe algo sobre a classe de erro que está procurando? É uma condição de corrida ou o código apenas tem um desempenho ruim no site do cliente?
Editar: Você também pode usar sinais como STOP e CONT para iniciar e parar seu programa. Um depurador também pode fazer isso. O problema é que o código roda a toda velocidade e depois é interrompido. A maioria das soluções com o agendador do Linux terá esse problema.
Havia algum tipo de analisador de thread do afair da Intel. Eu vejo as notas de lançamento do Vtune . Este é o Vtune, mas eu tinha certeza de que existe outra ferramenta para analisar as corridas de thread.Consulte: Intel Thread Checker , que pode verificar algumas condições de corrida de thread. Mas não sabemos se o aplicativo é multi-threaded?fonte
Use
cpulimit
:Está nos repositórios do Ubuntu. Somente
Aqui estão alguns exemplos de como usá-lo em um programa já em execução:
fonte
fonte
Se você deseja apenas simular seu programa para analisar seu comportamento em uma máquina muito lenta, pode tentar fazer com que todo o programa seja executado como um
thread
outro programa principal .Desta forma, você pode priorizar o mesmo código com prioridades diferentes em alguns threads de uma vez e coletar dados de sua análise. Eu usei isso no desenvolvimento de jogos para análise de processamento de quadros.
fonte
Use sleep ou espere dentro de seu código. Não é a maneira mais brilhante de fazer, mas é aceitável em todos os tipos de computador com velocidades diferentes.
fonte
A maneira mais simples possível de fazer isso seria envolver seu código executável principal em um loop while com um sleep no final.
Por exemplo:
Como as pessoas irão mencionar, esta não é a maneira mais precisa, já que seu código lógico ainda rodará na velocidade normal, mas com atrasos entre as execuções. Além disso, ele assume que seu código lógico é algo executado em um loop.
Mas é simples e configurável.
fonte