Wo krieg ich mikrosekunden her?
-
Ich brauche in meinem Programm etwas zur Zeitmessung, und zwar im bereich von Mikrosekunden. Da ich mit Linux arbeite, geht das in C mit der Function gettimeofday() ziemlich gut. Das ist mir aber zu langsam, deshalb brauch ich das in Assembler. Kann ich jetzt mit Assembler auf den Speicher zugreifen, wo die C-Funktion die Mikrosekunden herholt? Und wo steht das dann?
Danke
James
-
Original erstellt von <James>:
Ich brauche in meinem Programm etwas zur Zeitmessung, und zwar im bereich von Mikrosekunden.Wozu Mikrosekunden, wenn Du Nanosekunden kriegst? Benzium oder größeren Prozessor besorgen und rdtsc benutzen rult.
-
*lol* Volkard
Ansonsten: Zeitzaehler sollte an addr 46C bis 46F sein (1/100-Sekunden bei 46C)
und an Port 40h bis 42h haengt auch noch der Systemzeitgeber. Welcher Port da nun was zaehlt, weiss ich jetzt aber auch nicht.
-
hi
frag sich nur ob man unter linux da so ohne weiteres drauf zugreifen kann.
gruss termite
-
rdtsc rult dadsächlich und mim benzium 2 gehts subba!
Und ich denke auch dass das die leichteste Variante ist. Nur mit den Nanosekunden gehts nicht so, meiner machts nur auf drei Nanosekunden genau.
Jetzt hab ich mal ein Programm geschriebn, nur leider funzt des net so genau. Das hab ich mit dem Inline-Assembler von gcc gemacht und in der Variable dtrate steht drinnen wie viele takte er warten soll, nur des macht er net. Kann sein, dass da irgendwas mit 64bit-Zahlen nicht so hinhaut, wies soll. Hab nämlich kein Assemblerbuch für 386er, sondern nur für 8086 und deshalb hab ich ein bisschen geraten.asm(" rdtsc
movl %%eax,%%ebx
movl %%edx,%%ecx
addl %0,%%ebx
adcl $0x0000,%%ecx
wartstart:
rdtsc
subl %%ebx, %%eax
sbbl %%ecx,%%edx
jae ende
jmp wartstart
ende:"
:
: "g"(dtrate)
: "%eax","%ebx","%ecx","%edx");Danke James
-
Jetzt hab ich mal ein Programm geschriebn, nur leider funzt des net so genau. Das hab ich mit dem Inline-Assembler von gcc gemacht
Hmm. Du benutzt den gcc.
Klingt nach
inline int64 rtdsc()
{
//assemblerkram
}
und ner Warteschleife in C.
void warte(int64 wievieleTakte)
{
int64 ende=rtdsc()+wievieleTakte;
while(rtdsc()<ende)
;
}
die inline int64 rtdsc() müßte ja nach dem Optimierer auf einen Assemblerbefehl zusammengefallen sein.
Falls Du zufällig so ne Funktion rtdsc bauen magst, dann gibt mir den Code.
-
Eigentlich will ich das ja, aber ich denke, dass das in C zu langsam ist und deswegen will ich das in Assembler, denn da kommt noch was hinzu! Das ist jetzt erst mal der entscheidende Teil von meinem Programm. Ich muss z.B. noch einen Port auslesen und dann vergleichen und in C wird das dann alles zu langsam.
James
-
Original erstellt von <James>:
und in C wird das dann alles zu langsam.Vermutlich gar nicht mal. Dafür ist ja der Optimierer da. Um den zu schlagen, mußte schon recht gut in assembler sein.
-
Wenn du Ports auslesen willst, sind Geschwindigkeitsmessungen unter einer Mikrosekunde Quatsch, da Portzugriffe (out,in)
bei ISA 2 Mikrosekunden und bei PCI 0.5 Mikrosekunden dauern.
Ausserdem müssen bei sehr genauen Zeitmessungen alle Interrupts gesperrt werden, da diese die Zeitmessung über Gebühr beeinträchtigen. Unter Windows kann man das ohnehin auf Grund der
automatischen Ressourcenverteilung vergessen. Unter DOS geht das bis zu einem bestimmten Punkt. Man muss noch dazu sagen, das Befehle nicht einfach sequenziell abgearbeitet werden, sodass die effektive Geschwindigkeit nicht immer gleich ist. Das ist davon abhängig, was gerade in der Fetch-Queue steht, d.h.,wenn gleiche Programmfragmente in unterschiedlichen Speicherbereichen stehen, werden sie nicht überall gleich schnell abgearbeitet.Manitu