Existe-t-il un moyen d'exécuter un programme C ++ plus lentement en modifiant les paramètres du système d'exploitation sous Linux? De cette façon, je voudrais simuler ce qui se passera si ce programme particulier s'exécute sur une machine vraiment plus lente.
En d'autres termes, une machine plus rapide devrait se comporter comme une machine plus lente pour ce programme particulier.
nice
est une commande qui abaisse la priorité de planification. Varie ancienne, relativement brute. Vous pouvez examiner les priorités de planification, mais si la machine n'est pas occupée à faire autre chose, votre programme fonctionnera toujours rapidement. Donc, cela n'aidera probablement pas suffisamment.Réponses:
nice
(et / ourenice
). Vous pouvez également le faire par programme à l'aide d'nice()
un appel système. Cela ne ralentira pas la vitesse d'exécution en soi, mais obligera le programmateur Linux à allouer moins (et peut-être plus court) les délais d'exécution, à préempter plus souvent, etc. Voir Planification des processus (chapitre 10) de Comprendre le noyau Linux pour plus de détails sur la programmation .cpufreq-set
commande.sched_yield()
, ce qui donnera un quantum à d'autres processus, dans les parties critiques de performance de votre programme (nécessite un changement de code).malloc()
,free()
,clock_gettime()
etc. , en utilisant LD_PRELOAD , et faire des choses stupides comme brûler quelques millions de cycles CPU avecrep; hop;
, insérer des barrières de mémoire , etc. Cela va ralentir le programme sûr. (Voir cette réponse pour un exemple de la façon de faire certaines de ces choses).-O0
et activer les assertions (ie-DDEBUG
).J'espère que ça aide.
la source
-ggdb3
) ne pas ralentir l'exécution du binaire. Cela ne fait que l'agrandir.QEMU est un émulateur de processeur pour Linux. Debian a des paquets pour cela (j'imagine que la plupart des distributions le seront). Vous pouvez exécuter un programme dans un émulateur et la plupart d'entre eux devraient prendre en charge le ralentissement des choses. Par exemple, Miroslav Novak a des correctifs pour ralentir QEMU.
Alternativement, vous pouvez croiser la compilation vers un autre CPU-linux (arm-none-gnueabi-linux, etc.) puis demander à QEMU de traduire ce code pour qu'il s'exécute.
La bonne suggestion est simple et peut fonctionner si vous la combinez avec un autre processus qui consommera du processeur.
Vous n'avez pas dit si vous aviez besoin de graphiques, de fichiers et / ou d'E / S réseau? Savez-vous quelque chose sur la classe d'erreur que vous recherchez? Est-ce une condition de concurrence, ou le code fonctionne-t-il simplement mal sur le site d'un client?
Edit: Vous pouvez également utiliser des signaux comme STOP et CONT pour démarrer et arrêter votre programme. Un débogueur peut également le faire. Le problème est que le code s'exécute à pleine vitesse , puis s'arrête. La plupart des solutions avec le planificateur Linux auront ce problème.
Il y avait une sorte d'analyseur de thread d'Intel Afair. Je vois les notes de publication de Vtune . C'est Vtune, mais j'étais à peu près sûr qu'il existe un autre outil pour analyser les courses de threads.Voir: Intel Thread Checker , qui peut vérifier certaines conditions de course de threads. Mais nous ne savons pas si l'application est multithread?la source
Utilisez
cpulimit
:C'est dans les dépôts Ubuntu. Juste
Voici quelques exemples sur la façon de l'utiliser sur un programme déjà en cours d'exécution:
la source
la source
Si vous souhaitez simplement simuler votre programme pour analyser son comportement sur une machine très lente, vous pouvez essayer de faire exécuter votre programme entier comme un
thread
autre programme principal. .De cette manière, vous pouvez prioriser le même code avec des priorités différentes dans quelques threads à la fois et collecter les données de votre analyse. Je l'ai utilisé dans le développement de jeux pour l'analyse du traitement des images.
la source
Utilisez veille ou attendez à l'intérieur de votre code. Ce n'est pas la manière la plus brillante de faire mais acceptable sur tous les types d'ordinateurs avec des vitesses différentes.
la source
La façon la plus simple de le faire serait d'envelopper votre code exécutable principal dans une boucle while avec un sommeil à la fin.
Par exemple:
Comme les gens le mentionneront, ce n'est pas le moyen le plus précis, car votre code logique fonctionnera toujours à vitesse normale mais avec des retards entre les exécutions. En outre, cela suppose que votre code logique est quelque chose qui s'exécute dans une boucle.
Mais c'est à la fois simple et configurable.
la source