fork(2) download
  1. /// TDM-GCC 4.9.2
  2. ///----------------------------------------------------------------------------|
  3. /// Стенд для замера пииисек: мой против хулигана.
  4. /// 1 число - счетчик слов;
  5. /// 2 число - кол-во тактов на один проход;
  6. /// Каждая новая строка есть прогресс по меньшему кол-ву тактов!
  7. ///
  8. /// my - самый выдающийся финиш с 442 тактами! (100'000'000 проходов)
  9. /// ...
  10. /// 10 минут спустя:
  11. /// на миллиарде проходов(1'000'000'000)
  12. /// CoderHuligan: 462 - looser...
  13. /// my: 441 - WIN <<<---!!!
  14. /// ...
  15. /// CoderHuligan, не плачьте!
  16. ///----------------------------------------------------------------------------:
  17. #include <stdio.h>
  18. //#include <conio.h>
  19.  
  20. ///----------------------------------------------------------------------------|
  21. /// Мерилка тактов проца.
  22. ///----------------------------------------------------------------------------:
  23. typedef unsigned long long ull;
  24. inline ull rdtsc()
  25. { unsigned int lo, hi;
  26. asm volatile ( "rdtsc\n" : "=a" (lo), "=d" (hi) );
  27. return ((ull)hi << 32) | lo;
  28. }
  29.  
  30. ///----------------------------------------------------------------------------|
  31. /// Для удобства.
  32. ///----------------------------------------------------------------------------:
  33. #define START_PERFOMANCE ull t1 = rdtsc(); static ull ss_ = 0xffffffff;\
  34.   bool b = false
  35. #define END_PERFOMANCE ull v = rdtsc(); v -= t1;\
  36.   if(ss_ > v){ b = true; ss_ = v;}
  37.  
  38. ///----------------------------------------------------------------------------|
  39. /// Хулиган.
  40. ///----------------------------------------------------------------------------:
  41. ull CoderHuligan(char* s)
  42. { int nw = 0;
  43. char *p=s;
  44.  
  45. START_PERFOMANCE;
  46. --p;
  47. OUT:
  48. ++p;
  49. if(!*p)
  50. goto K;
  51. if(*p == ' ' || *p == ',' || *p == '\n')
  52. goto OUT;
  53. nw++;
  54. goto IN;
  55. IN:
  56. if(!*p)
  57. goto K;
  58. if(*p == ' ' || *p == ',' || *p == '\n')
  59. goto OUT;
  60. ++p;
  61. goto IN;
  62. K:
  63. END_PERFOMANCE;
  64.  
  65. if(b)
  66. { printf ("CoderHuligan: %d ", nw);
  67. printf ("%10u \n", (unsigned)ss_);
  68. b = false;
  69. }
  70.  
  71. return ss_;
  72. }
  73.  
  74. ///----------------------------------------------------------------------------|
  75. /// my.
  76. ///----------------------------------------------------------------------------:
  77. ull my(char* s)
  78. { int nw = 0;
  79. char *p = s;
  80.  
  81. START_PERFOMANCE;
  82. while (*p)
  83. { while ( *p == ' ' || *p == ',' || *p == '\n') p++;
  84. if(*p++ == 0) break;
  85. nw++;
  86. while ( *p != ' ' && *p != ',' && *p != '\n' && *p) p++;
  87. };
  88. END_PERFOMANCE;
  89.  
  90. if(b)
  91. { printf ("my: %d ", nw);
  92. printf ("%10u \n", (unsigned)ss_);
  93. b = false;
  94. }
  95.  
  96. return ss_;
  97. }
  98.  
  99. ///----------------------------------------------------------------------------|
  100. /// Наш кролик.
  101. ///----------------------------------------------------------------------------:
  102. char s[]="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed";
  103.  
  104. ///----------------------------------------------------------------------------|
  105. /// Start.
  106. ///----------------------------------------------------------------------------:
  107. int main()
  108. {
  109. ull m,c;
  110.  
  111. //-------------------------------|
  112. // Quiet, testing! |
  113. //-------------------------------:
  114. for(int i = 0; i < 10000000; ++i)
  115. { c = CoderHuligan(s);
  116. m = my (s);
  117. }
  118.  
  119. //-------------------------------|
  120. // Banners is redy... |
  121. //-------------------------------:
  122. const char* str[2] = {"WIN <<<--!!!", "looser..."};
  123. int i1, i2;
  124. (m > c) ? (i1 = 0, i2 = 1) : (i1 = 1, i2 = 0);
  125.  
  126. //-------------------------------|
  127. // Finish result. |
  128. //-------------------------------:
  129. printf ("\nFinish the race-------------------:\n");
  130. printf ("CoderHuligan: %u - ", (unsigned)c);
  131. printf ("%s\n", str[i1]);
  132. printf ("my: %u - ", (unsigned)m);
  133. printf ("%s\n", str[i2]);
  134.  
  135. //-------------------------------|
  136. // Show efficiency. |
  137. //-------------------------------:
  138. double ef = 100.0/double(c) * double(m) - 100.0;
  139. printf ("\nProfitable CoderHuligan: %2.2f%%\n\n", ef);
  140.  
  141. //_getch();
  142. return 0;
  143. }
  144.  
Success #stdin #stdout 1.2s 15232KB
stdin
Standard input is empty
stdout
CoderHuligan: 9        590 
my:           9        694 
CoderHuligan: 9        375 
my:           9        197 
CoderHuligan: 9        220 
my:           9        196 
my:           9        164 
CoderHuligan: 9        197 
my:           9        158 
CoderHuligan: 9        191 
my:           9        155 
my:           9        149 
my:           9        146 
CoderHuligan: 9        188 
CoderHuligan: 9        185 
my:           9        143 
my:           9        137 
CoderHuligan: 9        182 
CoderHuligan: 9        179 
CoderHuligan: 9        176 
my:           9        134 
CoderHuligan: 9        173 
my:           9        111 

Finish the race-------------------:
CoderHuligan: 173 - looser...
my:           111 - WIN <<<--!!!

Profitable CoderHuligan: -35.84%