2011-01-15 5 views
0

J'ai un code assembleur 8086 qui va appeler des interruptions pour lire et écrire des fichiers. J'utilise TASM pour lier et construire mon projet. Quelles sont les options qui s'offrent à moi pour calculer le temps d'exécution? Je ne pense pas que compter les cycles d'horloge fonctionnera si j'attends les temps de lecture du disque dur.8086 Assemblage: Détermination de l'heure d'exécution du code?

EDIT: Pour les recommandations du logiciel, je dois vous dire que je suis sous Windows 7.

+0

Est-ce que vous écrivez des programmes DOS pour fonctionner sur Win7 ??? – Gabe

+0

J'écris un algorithme dans Assembly pour montrer son potentiel de vitesse. La plate-forme, Windows 7, se trouve être ce que mon ordinateur fonctionne. C'est plus comme un programme de preuve de concept. –

Répondre

1

Cela dépend de la précision que vous voulez obtenir et du nombre de problèmes que vous voulez résoudre.

Vous dites que vous appelez des interruptions pour lire et écrire des fichiers. Je suppose que vous faites les anciennes fonctions d'interruption INT 21H. INT 21H La fonction 2Ch renvoie l'heure, précise à environ 5/100 secondes. Voir http://spike.scu.edu.au/~barry/interrupts.html#ah2c pour plus d'informations.

Si vous pouvez appeler les fonctions de l'API Windows, vous pouvez appeler le QueryPerformanceCounter pour obtenir le nombre de ticks au début du code que vous voulez chronométrer. Appelez la fonction à nouveau après, soustrayez le début de la fin, puis divisez le résultat par la valeur de retour de QueryPerformanceFrequency, et vous l'avez.

Bien sûr, cela nécessite de faire de l'arithmétique 64 bits.

Vous pouvez appeler la fonction API GetSystemTime en lui transmettant une structure SYSTEMTIME remplie. Ou vous pouvez appeler timeGetTime, ce qui renvoie le nombre de millisecondes écoulées depuis le démarrage de l'ordinateur. Vous devez être prudent avec celui-ci, car il va rouler après 49 jours.

Il y a probablement d'autres façons d'y aller aussi. Mais le plus simple, si vous appelez les fonctions INT 21H, est d'utiliser simplement la fonction 2CH.

2

Vous pouvez utiliser profileurs comme oprofile ou VTune ou tout simplement appeler gettimeofday avant et après votre fonction.

J'utilise généralement le profileur de performance Intel VTune avec calltree. Il peut montrer combien de temps a été passé sur votre code et le temps total de la fonction.

+0

+1 Ou vous pouvez appeler l'interruption de la minuterie, enregistrer la valeur renvoyée, lire/écrire dans le fichier, puis rappeler cette interruption et soustraire la valeur. Naa, votre solution est meilleure;) – BlackBear

0

L'instruction RDTSC vous donnera des informations de synchronisation très précises, mais elle tombera un peu sur les OS et les processeurs modernes. Jetez un oeil à la page Wikipedia pour plus d'informations (ou Google pour RDTSC): http://en.wikipedia.org/wiki/Time_Stamp_Counter Si vous le pouvez, en utilisant l'API Win pour QueryPerformanceCounter/QueryPerformanceFrequency serait un pari plus sûr (mais aussi plus frais généraux - peut-être trop pour votre cas car il vous semblez avoir besoin d'un timing très précis?).

Vérifiez également AMD CodeAnalyst comme c'est gratuit, contrairement à VTune.

Questions connexes