コードのタイム クリティカルなセグメントを独自に実装しています。私はスローダウンのためにタイムクリティカルなコードをしばらく研究してきましたが、この実装は最適化されたタイムクリティカルなコードから約2%を消費することがわかりました:
#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
タイムクリティカルなコードはASSERT*
デバッグ目的で定義を使用しましたが、リリースでは明らかに削除されていますが...これは で少し高速なコードを生成するようです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)
その理由は二重false ?
表現にあります。どういうわけか、最大限に最適化されたリリースで少し高速なコードを生成します。
なぜこれが高速なのかはわかりませんが (コンパイラーの最適化のバグのようです)、少なくともそのコードの場合のより良い解決策です。
注: ここで最も重要なことは、上記のアサーションやリリースで未使用のマクロがないと、タイム クリティカルなコードの速度が低下することです。つまり、doublefalse ?
式は驚くほどコードの最適化に役立ちます。