Das typische Argument für die Entfernung von Assertions aus Produktionscode ist die Leistung. Das leuchtet mir nicht ein. Ja, es kann eine nützliche Optimierung sein, ein paar Assertions aus den leistungsrelevanten 5 % oder so Ihres Codes zu entfernen. Für die anderen 95 % haben sie jedoch wahrscheinlich keinen messbaren Effekt, und Assertions können nur die Wahrscheinlichkeit erhöhen, dass Ihr Code im Falle eines Fehlers schnell und einfach zu diagnostizieren ist.
Ich programmiere die meiste Zeit in D, das über eine enforce()
Funktion, die im Wesentlichen das tut, was assert()
mit der Ausnahme, dass es in Release-Builds bleibt. Normalerweise verwende ich enforce()
die meiste Zeit, und assert()
nur an einigen wenigen Orten, wo enforce()
wäre zu teuer.
Gibt es neben der Leistung noch einen anderen Grund, Asserts aus Release-Builds zu entfernen? Wenn nicht, warum machen Sprachen das Standardverhalten von Asserts nicht so, dass sie immer ausgeführt werden, auch in Release-Builds, und bieten eine zweite Funktion an, die ausführlicher und schwerer zu merken ist, etwas wie expensiveAssert()
die aus Release-Builds herausgenommen wird, und empfehlen Sie, sie nur in leistungskritischen Teilen Ihres Codes zu verwenden?