시간이 중요한 코드 세그먼트에 대한 자체 구현이 있습니다. 나는 느리게하기 위해 시간이 중요한 코드를 잠시 연구 해 왔으며이 구현은 내가 최적화 한 시간에 중요한 코드에서 약 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 ?
표현식은 놀랍게도 코드를 최적화하는 데 도움이됩니다.