///----------------------------------------------------------------------------|
/// Стенд для замера пииисек: мой против хулигана.
/// (уже нет: смотрим, какие пилы лучше пилят.)
/// 1 число - счетчик слов;
/// 2 число - кол-во тактов на один проход;
/// Каждая новая строка есть прогресс по меньшему кол-ву тактов!
///
/// Результаты==============================:
/// Hooligan my
/// GCC4.9 x 472 460
/// "-O2 " 157 166 стабильно
/// "-Ofast" 174 161 стабильно
/// GCC8.2 x 472 488
/// "-O2 " 77 99 стабильно
/// "-Ofast" 73 85 стабильно
/// VS2010 "-O2 " 188 165 стабильно
/// VS2019 "-O2 " 183 134 стабильно
///----------------------------------------------------------------------------:
#include <stdio.h>
//#include <conio.h>
///----------------------------------------------------------------------------|
/// Мерилка тактов проца.
///----------------------------------------------------------------------------:
typedef unsigned long long ull;
inline ull rdtsc()
{
#ifdef __BORLANDC__
#endif
#ifdef _MSC_VER
unsigned clock = 0;
__asm rdtsc;
__asm mov[clock], eax;
return clock;
#endif
#ifdef __GNUC__
unsigned int lo, hi;
asm volatile ("rdtsc\n" : "=a" (lo), "=d" (hi));
return ((ull)hi << 32) | lo;
#endif
}
///----------------------------------------------------------------------------|
/// Для удобства.
///----------------------------------------------------------------------------:
#define START_PERFOMANCE ull t1 = rdtsc(); static ull ss_ = 0xffffffff;\
bool b = false
#define END_PERFOMANCE ull v = rdtsc(); v -= t1;\
if(ss_ > v){ b = true; ss_ = v;}
///----------------------------------------------------------------------------|
/// Хулиган.
///----------------------------------------------------------------------------:
ull CoderHuligan(char* s)
{ int nw = 0;
char *p=s;
START_PERFOMANCE;//=============================//
--p; //
OUT: //
++p; //
if(!*p) //
goto K; //
if(*p == ' ' || *p == ',' || *p == '\n') //
goto OUT; //
nw++; //
goto IN; //
IN: //
if(!*p) //
goto K; //
if(*p == ' ' || *p == ',' || *p == '\n') //
goto OUT; //
++p; //
goto IN; //
K: //
END_PERFOMANCE;//===============================//
if(b)
{ printf ("CoderHuligan: %d ", nw);
printf ("%10u \n", (unsigned)ss_);
b = false;
}
return ss_;
}
///----------------------------------------------------------------------------|
/// my.
///----------------------------------------------------------------------------:
ull my(char* s)
{ int nw = 0;
char *p = s;
START_PERFOMANCE;//=================================================//
while (*p) //
{ while ( *p == ' ' || *p == ',' || *p == '\n') p++; //
if(*p++ == 0) break; //
nw++; //
while ( *p != ' ' && *p != ',' && *p != '\n' && *p) p++; //
}; //
END_PERFOMANCE;//===================================================//
if(b)
{ printf ("my: %d ", nw);
printf ("%10u \n", (unsigned)ss_);
b = false;
}
return ss_;
}
///----------------------------------------------------------------------------|
/// Наш кролик.
///----------------------------------------------------------------------------:
char s[]="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed";
///----------------------------------------------------------------------------|
/// Start.
///----------------------------------------------------------------------------:
int main()
{ ull m,c;
//-------------------------------|
// Quiet, testing! |
//-------------------------------:
for(int i = 0; i < 10000000; ++i)
{ c = CoderHuligan(s);
m = my (s);
}
//-------------------------------|
// Banners is redy... |
//-------------------------------:
const char* str[] = {"WIN <<<--!!!", "looser...", "friendship won!"};
int i1, i2;
(m > c) ? (i1 = 0, i2 = 1) :
((m == c)?(i1 = 2, i2 = 2) : (i1 = 1, i2 = 0));
//-------------------------------|
// Finish result. |
//-------------------------------:
printf ("\nFinish the race-------------------:\n");
printf ("CoderHuligan: %u - ", (unsigned)c);
printf ("%s\n", str[i1]);
printf ("my: %u - ", (unsigned)m);
printf ("%s\n", str[i2]);
//-------------------------------|
// Show efficiency. |
//-------------------------------:
double ef = 100.0/double(c) * double(m) - 100.0;
printf ("\nProfitable CoderHuligan: %2.2f%%\n\n", ef);
//_getch();
return 0;
}