cpp_playground/misc/likely.cpp

85 lines
2.0 KiB
C++
Raw Normal View History

#include <iostream>
#include <thread>
#include <chrono>
#include <sys/time.h>
#include <limits.h>
#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();
}