#include #include #include #include #include #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) using namespace std; #define SIZE 500000000 int arr[SIZE]; void func(int *pval) { double ret = 0; timeval start, end; gettimeofday(&start, nullptr); while (*pval) { if (((*pval) == 256)) ret = ret + 1234; else ret = ret + 5678; pval++; } gettimeofday(&end, nullptr); double usec = (end.tv_sec - start.tv_sec) + (double)(end.tv_usec - start.tv_usec) / 1000000; cout << __func__ << " duration: " << usec << ", ret: " << ret << endl; } void func_likely(int *pval) { double ret = 0; timeval start, end; gettimeofday(&start, nullptr); while (*pval) { if (likely((*pval) == 256)) ret = ret + 1234; else ret = ret + 5678; pval++; } gettimeofday(&end, nullptr); double usec = (end.tv_sec - start.tv_sec) + (double)(end.tv_usec - start.tv_usec) / 1000000; cout << __func__ << " duration: " << usec << ", ret: " << ret << endl; } void func_unlikely(int *pval) { double ret = 0; timeval start, end; gettimeofday(&start, nullptr); while (*pval) { if (unlikely((*pval) == 256)) ret = ret + 1234; else ret = ret + 5678; pval++; } gettimeofday(&end, nullptr); double usec = (end.tv_sec - start.tv_sec) + (double)(end.tv_usec - start.tv_usec) / 1000000; cout << __func__ << " duration: " << usec << ", ret: " << ret << endl; } int main() { for (int i = 0; i < SIZE; i++) { if (i % 1000 == 0) *(arr + i) = 256; else *(arr + i) = 128; } arr[SIZE - 1] = 0; std::thread t1(func, arr); std::thread t2(func_likely, arr); std::thread t3(func_unlikely, arr); t1.join(); t2.join(); t3.join(); }