Ich habe eine Implementierung einer Klasse X, die zwei Zeiger auf zwei Informationen hat. Ich habe eine neue Implementierung geschrieben, Klasse Y, die nur einen Zeiger auf eine Struktur hat, die die zwei Teile der Information zusammen als benachbarte Elemente enthält. Die Methoden von X und Y müssen normalerweise nur eine der Informationen bearbeiten, stellen aber eine get() -Methode bereit, die einen Zeiger auf das zweite Stück zurückgibt (in diesem Fall gibt die Klasse X ihren Zeiger auf dieses Stück zurück und die Klasse Y gibt die Adresse zurück) des zweiten Mitglieds der Struktur). Bei normaler Verwendung werden Aufrufe an die Methoden von X und Y durch Aufrufe von get() unterbrochen und an dem zurückgegebenen zweiten Teil ausgeführt.C++, Möglichkeiten zur Verbesserung der Cache-Lokalität?
Ich erwarte, dass in realen Situationen sollte eine Leistungsverbesserung sein, jetzt, da die beiden Teile der Informationen in der Klasse Y-Implementierung nebeneinander sind (weil sie benachbarte Mitglieder einer Struktur sind), aber ich Ich sehe keinen Unterschied in den Benchmarks, die ich geschrieben habe (dazwischenliegende Aufrufe an die Methoden von X und Y mit der Arbeit an ihren zweiten Stücken in großen Schleifen). Ich vermute, das liegt daran, dass bei beiden Tests alles in den Cache passt. Ich möchte das noch nicht in meiner echten App ausprobieren, da sich die Semantik von X und Y auf andere subtile Arten unterscheidet, die nicht mit dieser Optimierung in Verbindung stehen, und die Verwendung der Anwendung zu portieren ist etwas Arbeit, und diese Benchmarks sollen dazu beitragen, dies zu rechtfertigen Arbeit an erster Stelle.
Was ist der beste Weg, den Unterschied in der Leistung aufgrund der besseren Cache-Lokalität zu beobachten? Wenn ich eine Menge Dummy-Arbeit an einem Array mache, das der Größe des Caches zwischen den Aufrufen entspricht, ist das ausreichend? Oder möchte ich an einem Array arbeiten, das etwas kleiner ist als die Cachegröße, so dass die Arbeit an meinen Instanzen meiner Klasse dazu führt, dass Dinge in den Cache hinein und aus ihm herausfallen? Ich bin mir nicht sicher, wie man etwas programmiert, das gegen Compiler-Optimierungen und verschiedene Cache-Größen robust ist.
"Warum" ist nicht wirklich das Problem hier - die Frage ist ziemlich klar, Cache-Lokalität Benchmark. Ich denke nicht, dass "Warum" der Diskussion wirklich etwas hinzufügt, und es ist am besten anzunehmen, dass Joseph weiß, was er tut. – Justicle
Das "Warum" ist immer wichtig, zumindest IMHO. "Ich erwarte, dass es in realen Situationen eine Leistungsverbesserung geben sollte", was mir sagt, dass Joseph versucht, die Dinge zu beschleunigen. "Ich will das in meiner echten App noch nicht ausprobieren", was noch stärker darauf hindeutet, dass sein Endziel eine bessere Leistung ist und er versucht, über verbesserte Lokalität zu gehen - deshalb empfahl ich andere Kurse, um die Leistung zu verbessern. Allerdings, @ Joseph, wenn ich hier in die falsche Richtung ging, bitte ignorieren. ;-) [Und in diesem Fall ist cachegrind das, was Sie wollen] –
Ich schreibe eine Smart-Pointer-Klasse, die im Grunde algorithmuslos ist. Ich habe es mit g-prof bis zu dem Punkt optimiert, wo Dinge wie ob eine Verzweigung existiert (ein if) oder eine falsche Ganzzahl-Zuweisung kann bestimmen, ob meine Klasse die alte Implementierung schlägt. Dies ist einer der wenigen Fälle, in denen Mikrooptimierungen definitiv zutreffen;) –