У мене є власна реалізація для критично важливих для часу сегментів коду. Я досліджував деякий час критичний для часу код для уповільнення і виявив, що ця реалізація споживає близько 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 ?
вираженні. Це якимось чином виробляє трохи швидший код у випуску з максимальною оптимізацією.
Я не знаю, чому це швидше (здається, помилка в оптимізації компілятора), але це принаймні краще рішення для цього випадку коду.
Примітка : Найголовніше тут, що критично важливий для часу код сповільнюється без вищезазначених тверджень або невикористаних макросів у випуску. Іншими словами, подвійний false ?
вираз напрочуд допомагає оптимізувати код.