/// TDM-GCC 4.9.2
///----------------------------------------------------------------------------|
/// Стенд для замера пииисек: мой против хулигана.
/// 1 число - счетчик слов;
/// 2 число - кол-во тактов на один проход;
/// Каждая новая строка есть прогресс по меньшему кол-ву тактов!
///
/// my - самый выдающийся финиш с 442 тактами! (100'000'000 проходов)
/// ...
/// 10 минут спустя:
/// на миллиарде проходов(1'000'000'000)
/// CoderHuligan: 462 - looser...
/// my: 441 - WIN <<<---!!!
/// ...
/// CoderHuligan, не плачьте!
///----------------------------------------------------------------------------:
#include <stdio.h>
//#include <conio.h>
///----------------------------------------------------------------------------|
/// Мерилка тактов проца.
///----------------------------------------------------------------------------:
typedef unsigned long long ull;
inline ull rdtsc()
{ unsigned int lo, hi;
asm volatile ( "rdtsc\n" : "=a" (lo), "=d" (hi) );
return ((ull)hi << 32) | lo;
}
///----------------------------------------------------------------------------|
/// Для удобства.
///----------------------------------------------------------------------------:
#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[2] = {"WIN <<<--!!!", "looser..."};
int i1, i2;
(m > c) ? (i1 = 0, i2 = 1) : (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;
}