Null-Zeiger-Testleistung

8

Was ist die Leistung beim Testen, ob eine Variable vom Referenztyp in C # ein Nullzeiger ist (wie if (x == null) ...) im Vergleich zum Testen, ob eine Ganzzahl kleiner als Null oder gerade ist? ein Bool ist falsch?

Gibt es andere Probleme bezüglich solcher Null-Zeiger-Tests , z. wird garbadge produziert ?

Ich mache hundert dieser Tests für jeden Frame eines Spiels und ich frage mich, ob diese Probleme verursachen oder effizienter umgesetzt werden könnten?

    
ares_games 11.01.2013, 12:52
quelle

6 Antworten

10

Nullitätstests entsprechen wahrscheinlich einfachen "gleich 0" -Tests. Sie sind sehr, sehr billig - nur Hunderte pro Frame sollten völlig unbedeutend sein, es sei denn, Sie haben eine Framerate in Millionenhöhe:)

Sie sollten Ihre App so profilieren, dass sie herausfinden kann, wo die Zeit tatsächlich verbracht wird - es ist viel produktiver als nur zu erraten. Idealerweise sollten Sie auch versuchen, einige Benchmarks zu schreiben, damit Sie nicht nur die aktuelle Leistung messen können, sondern auch feststellen können, ob sie aufgrund einer bestimmten Änderung signifikant schlechter wird.

    
Jon Skeet 11.01.2013, 12:55
quelle
3

Das Testen eines Wertes für null ist keine komplizierte Operation, die eine Typüberprüfung oder etwas ähnliches benötigt, und es ist keine Speicherzuordnung erforderlich.

Das Zerlegen der Anweisung if (x == null) ergibt:

%Vor%

i.e. Der Test wird als einfacher ganzzahliger Vergleich des Zeigerwerts implementiert.

    
Guffa 11.01.2013 13:01
quelle
2

Bei intensiven Prüfungen, wie Sie können , kann es zu Leistungseinbußen kommen, die jedoch nur durch Ihre eigenen Standards gegen Ihre spezielle App messbar sind.

Je nachdem, was der Testpunkt ist, gibt es möglicherweise andere Möglichkeiten, wie Sie schlauer darüber sein könnten, was & amp; wenn du nachschaust. Aber ohne mehr über Ihre Anwendung zu wissen, wäre es zu schwierig, eine Antwort darauf zu finden.

    
James 11.01.2013 12:56
quelle
2

Wahrscheinlich subjektiv - aber ein Null-Check ist gleichbedeutend mit einer Prüfung auf Null und genauso schnell. Ich denke also, du solltest dir darüber keine Sorgen machen.

Ebenso - wenn Sie keine Leistungsprobleme haben, warum sollten Sie damit spielen?

Wenn Sie Leistungsprobleme haben, ist es wahrscheinlich auch, dass Sie Leistung aus komplexen Code-Zweigen erzielen können, anstatt ein paar Null-Checks zu eliminieren.

Für Conditional-Code könnte eine mögliche Leistungsverbesserung (obwohl es ernsthaft benchmarked werden müsste) sein, Delegaten für die verschiedenen Zweige der Logik zu verwenden, die als Ergebnis einer oder mehrerer Zustandsänderungen gesetzt sind - aber ich Wäre es eine Überraschung, wenn eine solche Lösung die Performance im allgemeinen Fall verbessert - insbesondere für Ihr Szenario "ist null"? Also, damit meine ich so etwas:

%Vor%

Wenn zum Beispiel [condition] eine lokale Variable _obj (in Ihrem Fall _obj == null ) enthält - können Sie dies durch etwas ersetzen (aber seien Sie sehr vorsichtig bei Threading-Problemen):

%Vor%

Und jetzt in jedem Code, wo Sie zuvor [condition] für die Verzweigung überprüft haben, tun Sie jetzt einfach:

%Vor%

Diese Art von Sache erhält die meisten Verbesserungen, wenn die [condition] komplex ist und, was entscheidend ist, nachweislich viel Prozessorzeit durch Profiling beansprucht hat . Die Verwendung von Delegaten führt ebenfalls zu einem leichten Overhead über die bedingte Verzweigung, aber wenn dieser Aufwand geringer ist als die Ausführung von [condition] , kann dies einen Unterschied ausmachen, insbesondere wenn diese Prüfungen sehr häufig ausgeführt werden.

Es gibt auch andere Variationen davon, am häufigsten Funktionsnachschlagetabellen, die von einem Wert abgeleitet sind, anstatt einen Codezweig zu wählen, der auf einer Gleichheitsprüfung basiert (wie große Switch / Case-Anweisungen implementiert werden können). co_de% kodiert durch die Enum / Wert überprüft - was mehrere Prüfungen des Wertes vermeidet.

Letztlich ist jedoch ohne die Sorgfaltspflicht des Profiling (vorher und nachher natürlich) die Durchführung solcher Optimierungen grundsätzlich sinnlos.

    
Andras Zoltan 11.01.2013 13:04
quelle
1

Keine Probleme (Leistung oder sonstwie) mit if (x == null) .

    
Henrik 11.01.2013 12:55
quelle
1

Dies sollte absolut kein Problem sein - alle Tests, die Sie erwähnen, werden normalerweise einen einzigen Taktzyklus benötigen. Wenn es einen Leistungseinfluss durch bedingte Verzweigungen gibt, wird dies üblicherweise durch ein nicht vorhersagbares oder zumindest schwer vorhersagbares Verzweigungsverhalten verursacht, das den Verzweigungsprädiktor beeinträchtigt und einen Abbruch des spekulativ ausgeführten Zweiges erfordert.

    
Daniel Brückner 11.01.2013 12:58
quelle