2015-07-30 5 views
7

Ich erwäge Kotlin für ein Simulationsframework und bemerkte, dass der Compiler statische checkParameterIsNotNull Aufrufe für jede Methode verwebt, auf die von Java zugegriffen werden kann. Dies prüft, ob der Methodenparameter nicht null ist, indem bei jedem Ausführen dieser Methode auf den Aufruf-Stack zugegriffen wird (und Dumping?). Nun, da in einem typischen Simulationsframework die Anzahl der Runs in Millionenhöhe liegt, frage ich mich, wie sich solch ein Feature auf die Performance auswirkt.Kotlin verwendet Runtime-Assertions zur Nullprüfung - Performance-Overhead?

Gibt es eine Option, um es auszuschalten?

Antwort

17

Zuerst wird auf den Aufruf-Stack nicht zugegriffen und jedes Mal, wenn die Methode ausgeführt wird, ausgegeben. Während der normalen Ausführung wird nur eine einzige Nullprüfung durchgeführt, die keinen merklichen Overhead aufweist. Auf den Aufruf-Stack wird nur zugegriffen, wenn der Parameter null ist und eine Ausnahme ausgelöst werden muss.

Die Assertions werden nicht für private Methoden generiert (weil sie nicht aus Java-Code aufgerufen werden können, und der Kotlin-Compiler stellt sicher, dass der Kotlin-Code, der die Methode aufruft, keine Nullwerte übergibt). Daher ist der beste Weg, den Overhead vollständig zu vermeiden, indem Sie die innere Schleife Ihres Simulationscodes mit privaten Methoden schreiben.

Sie können die Assertionsgenerierung mithilfe der Optionen -Xno-param-assertions und -Xno-call-assertions für den Befehlszeilencompiler deaktivieren. Beachten Sie, dass diese Optionen nicht unterstützt werden und in Zukunft möglicherweise entfernt werden.