diff --git a/misc/likely.cpp b/misc/likely.cpp new file mode 100644 index 0000000..202e11b --- /dev/null +++ b/misc/likely.cpp @@ -0,0 +1,85 @@ +#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(); +} \ No newline at end of file