Tôi có cách triển khai của riêng mình cho các phân đoạn mã quan trọng về thời gian. Tôi đã nghiên cứu một đoạn mã quan trọng về thời gian để làm chậm và nhận thấy việc triển khai này tiêu tốn khoảng 2% so với thời gian mã quan trọng mà tôi đã được tối ưu hóa:
#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
Mã quan trọng về thời gian đã sử dụng các ASSERT*
định nghĩa cho mục đích gỡ lỗi, nhưng trong bản phát hành rõ ràng nó đã bị loại bỏ, nhưng ... Có vẻ như mã này tạo ra mã nhanh hơn một chút trong 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)
Lý do là trong false ?
biểu thức kép . Bằng cách nào đó, nó tạo ra mã nhanh hơn một chút khi được phát hành với tối ưu hóa tối đa.
Tôi không biết tại sao điều này nhanh hơn (có vẻ như một lỗi trong tối ưu hóa trình biên dịch), nhưng ít nhất nó là một giải pháp tốt hơn cho trường hợp mã đó.
Lưu ý : Điều quan trọng nhất ở đây là một đoạn mã quan trọng về thời gian sẽ bị chậm lại mà không có các xác nhận ở trên hoặc các macro không sử dụng được phát hành. Nói cách khác, false ?
biểu thức kép giúp tối ưu hóa mã một cách đáng ngạc nhiên.