Hallo allerseits.
Ich möchte, um eine halbwegs "wissenschaftliche" Aussage über die Geschwindigkeit unterschiedlicher Algorithmen machen zu können gerne erfahren, wieviele Prozessortakte ein bestimmter Algorithmus dauert, weil die reine Zeit ja Prozessorabhängig ist.
Ein "Tick" in c# hat ja nix mit dem Takt zu tun, sondern nur 100ns.
Gibt es eine Möglichkeit, das in C# zu messen?
Wenn nicht, gibt es eine Gegenüberstellung, in denen jede einzelne (standard)-Befehl (for, i++, funktionsaufruf....) in Bezug auf seine Laufzeit verzeichnet ist, oder ist das durch Optimierung beim Compilieren nicht möglich?
Mein Haus, mein Viertel, mein Blog
Nutze doch einen Freeware-Profiler. Gibts so einige für .NET. Da musst du auch nix machen, nur ausführen und darauf achten, dass die der JIT keinen Streich spielt (nur die 2. Messung zählt, sonst mißt du den JIT mit).
Ansonsten gibt es kleine Frameworks, die bringen die Messfunktionen mit nach denen du suchst, musst sie nur noch an die richtige Stelle basteln. Da gibts was auf CodeProject, ist aber grad tot....
Hallo HeinzTomato,
hm, aber Prozessortakte sind auch und gerade prozessorabhängig und damit eine ebenso schlechte Maßzahl. Du willst ja unterschiedliche Algorithmen vergleichen. Wenn du das machen willst, müsstest du auch bei den Prozessortakten immer denselben Prozessor nehmen. Dann kannst du aber auch die Zeit als Maßzahl nehmen.
Die von dir gewünschte Gegenüberstellung gibt es höchstens für Assembler, aber nicht für Hochsprachen und schon gar nicht für Sprachen mit JIT. Und selbst bei Assembler werden solche Aussagen bei der heutige Pipeline-Länge zunehmend unbrauchbarer. Die Zeiten, wo man sagen konnte eine Addition dauert einen Takt, sind vorbei.
herbivore
Es gibt einen Assemblerbefehl mit dem man die "Prozessorschläge" messen kann. Er heißt rdtsc. Nach dem Aufruf steht dann im Register EAX::EDX der aktuelle Time-Stamp der CPU. Er wird häufig benutzt um die Geschwindigkeit eines Prozessors zu ermitteln.
Schau mal hier:
http://www.devmaster.net/forums/lofiversion/index.php?t369.html
Du müsstest das ganze aber in C und Assembler schreiben und dann via Interop einbinden.
Aber wie gesagt: ein einzelner Prozessortakt muss nicht unbedingt einer Assemblerinstruktion entsprechen (vorallem auf unterschiedlichen Prozessoren).
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
Er will doch nur die "Zeit" möglichst genau messen. Das mit den Prozessortakten war wohl eher eine Idee das umzusetzen...
Ja, und? Auch mit rdtsc kann man Zeit messen. Dazu noch hoch genau. Alternativ kannst du natürlich auch QueryPerformanceCounter verwenden 😉
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.