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

Finish the race-------------------:
CoderHuligan: 176 - looser...
my:           108 - WIN <<<--!!!

Profitable CoderHuligan: -38.64%