Ich habe meine eigene Implementierung für zeitkritische Codesegmente. Ich habe eine Weile nach zeitkritischem Code für die Verlangsamung gesucht und festgestellt, dass diese Implementierung etwa 2% des zeitkritischen Codes verbraucht, den ich optimiert habe:
#define UTILITY_UNUSED(exp) (void)(exp)
#define UTILITY_UNUSED2(e0, e1) UTILITY_UNUSED(e0); UTILITY_UNUSED(e1)
#define ASSERT_EQ(v1, v2) { UTILITY_UNUSED2(v1, v2); } (void)0
Der zeitkritische Code hat die ASSERT*
Definitionen für Debug-Zwecke verwendet, aber in der Version wurde er eindeutig herausgeschnitten, aber ... Scheint, dass dieser Code etwas schnelleren Code erzeugt in Visual Studio 2015 Update 3
:
#define UTILITY_UNUSED(exp) (void)(false ? (false ? ((void)(exp)) : (void)0) : (void)0)
#define UTILITY_UNUSED2(e0, e1) (void)(false ? (false ? ((void)(e0), (void)(e1)) : (void)0) : (void)0)
Der Grund ist im doppelten false ?
Ausdruck. Es produziert irgendwie einen etwas schnelleren Code in der Version mit maximaler Optimierung.
Ich weiß nicht, warum dies schneller ist (scheint ein Fehler bei der Compileroptimierung zu sein), aber es ist zumindest eine bessere Lösung für diesen Codefall.
Hinweis : Das Wichtigste dabei ist, dass ein zeitkritischer Code ohne die oben genannten Aussagen oder nicht verwendeten Makros in der Version langsamer wird . Mit anderen Worten, der doppelte false ?
Ausdruck hilft überraschenderweise, einen Code zu optimieren.