Schauen Sie in den Optimierungshandbüchern für Ihre CPU nach. Das ist der einzige Ort, an dem Sie Antworten finden werden.
Bringen Sie Ihren Compiler dazu, die generierte Assembly auszugeben. Laden Sie die Handbücher für Ihre CPU herunter. Schlagen Sie die vom Compiler verwendeten Anweisungen im Handbuch nach, und Sie wissen, wie sie funktionieren.
Dies setzt natürlich voraus, dass Sie bereits die Grundlagen der Funktionsweise einer pipelinegesteuerten, superskalaren Out-of-Order-CPU kennen, wissen, was Verzweigungsvorhersage, Befehls- und Datencache und alles andere bedeutet. Machen Sie Ihre Hausaufgaben.
Leistung ist ein lächerlich kompliziertes Thema. Je nach Kontext kann Fließkomma-Code genauso schnell sein wie (oder schneller als) Integer-Code, oder er kann viermal langsamer sein. Normalerweise haben Verzweigungen so gut wie keinen Nachteil, aber in besonderen Fällen können sie lähmend wirken. Manchmal ist die Neuberechnung von Daten effizienter als deren Zwischenspeicherung, manchmal nicht.
Verstehen Sie Ihre Programmiersprache. Verstehen Sie Ihren Compiler. Verstehen Sie Ihre CPU. Und dann prüfen Sie genau, was der Compiler tut in Ihrem Fall , durch Profilierung/Zeitmessung und gegebenenfalls durch Prüfung der einzelnen Anweisungen. (und beim Timing Ihres Codes sollten Sie sich aller Vorbehalte und Probleme bewusst sein, die Ihre Benchmarks ungültig machen können: Vergewissern Sie sich, dass Optimierungen aktiviert sind, aber auch, dass der Code, den Sie zu messen versuchen, nicht wegoptimiert ist. Berücksichtigen Sie den Cache (wenn sich die Daten bereits im CPU-Cache befinden, läuft es viel schneller. Wenn die Daten erst aus dem physischen Speicher gelesen werden müssen, dauert es länger. Beides kann Ihre Messungen verfälschen, wenn Sie nicht vorsichtig sind. Denken Sie daran, was Sie genau messen wollen)
Warum sollten Sie bei Ihren konkreten Beispielen ++i
schneller sein als i += 1
? Sie tun genau das Gleiche ? Manchmal kann es einen Unterschied machen, ob man eine Konstante oder eine Variable hinzufügt, aber in diesem Fall fügt man in beiden Fällen die Konstante hinzu.
Und im Allgemeinen benötigen Anweisungen unabhängig von ihren Operanden eine feste, konstante Zeit. Die Addition von eins zu etwas dauert genauso lange wie die Addition von -2000 oder 1772051912. Das Gleiche gilt für die Multiplikation oder Division.
Aber wenn Sie Wert auf Leistung legen, müssen Sie verstehen. wie der gesamte Technologiestapel funktioniert, und nicht nur auf ein paar einfache Faustregeln wie "Ganzzahl ist schneller als Gleitkomma, und ++
ist schneller als +=
"(Abgesehen von allem anderen sind solche einfachen Faustregeln fast nie wahr, zumindest nicht in cada Fall)