2011-01-15 5 views
0

Ich habe einige 8086 Assembler-Code, der Interrupts zum Lesen und Schreiben von Dateien aufrufen wird. Ich verwende TASM, um mein Projekt zu verknüpfen und zu erstellen. Welche Optionen stehen mir zur Verfügung, um zu bestimmen, wie lange die Ausführung dauert? Ich glaube nicht, dass das Zählen der Taktzyklen funktioniert, wenn ich auf die Lesezeiten der Festplatte warte.8086 Assembly: Ermitteln der Ausführungszeit des Codes?

EDIT: Für Software-Empfehlungen, sollte ich Ihnen sagen, dass ich Windows renne 7.

+0

Schreiben Sie DOS-Programme auf Win7 laufen ??? – Gabe

+0

Ich schreibe einen Algorithmus in Assembly, um sein Geschwindigkeitspotential zu zeigen. Die Plattform, Windows 7, ist zufällig genau das, was auf meinem Computer läuft. Es ist mehr wie ein Proof-of-Concept-Programm. –

Antwort

1

Es hängt davon ab, wie genau Sie erhalten möchten und wie viele Probleme Sie haben möchten.

Sie sagen, dass Sie Interrupts zum Lesen und Schreiben von Dateien aufrufen. Ich nehme an, Sie machen die alten INT 21H Interrupt-Funktionen. INT 21H Funktion 2Ch gibt die Uhrzeit mit einer Genauigkeit von ca. 5/100 Sekunden zurück. Siehe http://spike.scu.edu.au/~barry/interrupts.html#ah2c für weitere Informationen.

Wenn Sie Windows-API-Funktionen aufrufen können, können Sie QueryPerformanceCounter aufrufen, um die Tick-Zählung am Anfang des Codes, den Sie möchten, zu erhalten. Rufen Sie die Funktion danach erneut auf, subtrahieren Sie den Anfang vom Ende, und teilen Sie das Ergebnis durch den Rückgabewert von QueryPerformanceFrequency, und Sie haben es.

Natürlich erfordert dies 64-Bit-Arithmetik.

Sie können die API-Funktion GetSystemTime aufrufen, indem Sie eine SYSTEMTIME Struktur übergeben, die ausgefüllt wird. Oder Sie rufen timeGetTime auf, die die Anzahl der Millisekunden zurückgibt, seit der Computer gestartet wurde. Sie müssen vorsichtig mit diesem sein, weil es nach 49 Tagen überrollen wird.

Es gibt wahrscheinlich auch andere Wege zu gehen. Aber am einfachsten, wenn Sie INT 21H-Funktionen aufrufen, verwenden Sie einfach die Funktion 2CH.

2

Sie könnten Profilometer wie oprofile oder VTune oder rufen Sie einfach an gettimeofday vor und nach der Funktion verwenden.

Ich verwende normalerweise Intel VTune Leistungsprofiler mit CallTree. Es kann angezeigt werden, wie viel Zeit für den Code und die Gesamtzeit der Funktion aufgewendet wurde.

+0

+1 Oder Sie können den Timer-Interrupt aufrufen, den zurückgegebenen Wert speichern, in Datei lesen/schreiben, dann diesen Interrupt erneut aufrufen und Wert subtrahieren .. Naa, deine Lösung ist besser;) – BlackBear

0

Die RDTSC-Anweisung liefert Ihnen sehr genaue Timing-Informationen, fällt aber bei modernen Betriebssystemen und CPUs ein wenig aus. Sehen Sie sich die Wikipedia-Seite für weitere Informationen an (oder Google für RDTSC): http://en.wikipedia.org/wiki/Time_Stamp_Counter Wenn Sie können, wäre die Verwendung der Win-API für QueryPerformanceCounter/QueryPerformanceFrequency eine sicherere Wette (aber auch mehr Overhead - möglicherweise zu viel für Ihren Fall klingt wie Sie brauchen möglicherweise sehr feinkörniges Timing?).

Überprüfen Sie auch AMD CodeAnalyst, wie es frei ist, im Gegensatz zu VTune.