Laden...

Prozessortakte zählen

Erstellt von HeinzTomato vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.680 Views
HeinzTomato Themenstarter:in
345 Beiträge seit 2005
vor 18 Jahren
Prozessortakte zählen

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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....

49.485 Beiträge seit 2005
vor 18 Jahren

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

M
456 Beiträge seit 2004
vor 18 Jahren

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.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Er will doch nur die "Zeit" möglichst genau messen. Das mit den Prozessortakten war wohl eher eine Idee das umzusetzen...

M
456 Beiträge seit 2004
vor 18 Jahren

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.