Ich führte einen Test durch, bei dem die Geschwindigkeitsdifferenz zwischen den beiden folgenden Accessor-Funktionen gemessen wurde, und der Zeitunterschied war größer als ich erwartet hatte. Ich hatte einfach das Gefühl, dass die Kurzschreibweise etwas schneller sein könnte, also wollte ich es testen.Warum funktionieren Kurzschreibzugriffe schneller als ihre regulären Gegenstücke?
Ich habe die gesamten benötigten Sekunden gemessen, um die Get-Funktion für jede Klasse aufzurufen, für 1 Milliarde Iterationen.
using System;
using System.Diagnostics;
class SimpleGet {
int value;
public int Get() {
return value;
}
}
class ShorthandGet {
int value;
public int Get() => value;
}
class Program {
static void Main() {
const int Iterations = 1000000000;
Stopwatch sw = new Stopwatch();
sw.Start();
{
int n; SimpleGet sg = new SimpleGet();
for (int i = 0; i < Iterations; i++) {
n = sg.Get();
}
}
sw.Stop();
Console.WriteLine("SimpleGet: " + sw.Elapsed.TotalSeconds);
sw.Reset();
sw.Start();
{
int n; ShorthandGet shg = new ShorthandGet();
for (int i = 0; i < Iterations; i++) {
n = shg.Get();
}
}
sw.Stop();
Console.WriteLine("ShorthandGet: " + sw.Elapsed.TotalSeconds);
Console.ReadLine();
}
}
Die Ergebnisse:
// 1 billion iterations
SimpleGet: 11.8484244
ShorthandGet: 4.3218568
Der Geschwindigkeitsunterschied sehr groß ist. Der einzige Unterschied, den ich sehen konnte, ist, dass die reguläre Funktion Klammern hat und daher beim Funktionsaufruf einen neuen Bereich erstellt. Da es keine neuen Variablen innerhalb des Scopes gibt, sollte theoretisch nicht "außer Acht gelassen" werden. Kann jemand erklären, warum die reguläre Funktion nicht auf dem gleichen Niveau wie das andere optimiert wird?
bearbeiten
ich das gleiche Szenario mit Eigenschaften getestet: Value { get { return value; } }
und Value => value;
und die Zeitdifferenzen wir sind sehr nahe an den jeweiligen Differenzen Funktion der Zeit. Ich nehme an, die Ursache ist dieselbe.
Haben Sie diesen Benchmark auf einem optimierten Build ausgeführt (d. H. Release not Debug) ohne den Debugger angeschlossen? –
Ja, ich sehe die gleichen Ergebnisse wie im Debug-Modus. Wenn Sie jedoch zu Release wechseln, werden beide Schleifen auf etwa 2,3 Sekunden gesetzt. – Jonesopolis
Sie haben Recht, es war Ignoranz meinerseits. Ich habe versucht, Build ohne Debugger zu erstellen, sie waren ungefähr gleich. – Dave