fork download
  1. // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <string.h>
  6. #include <chrono>
  7.  
  8. typedef void TestTrimRight (char * s);
  9.  
  10. void TrimRight(char* s) {
  11. size_t len = strlen(s);
  12. char* iter = s + len - 1;
  13.  
  14. if (*iter != ' ') {
  15. // Если последний символ не пробел,
  16. // то и обрезать нечего
  17. return;
  18. }
  19.  
  20. while (*iter == ' ' /*&& iter != s*/) {
  21. // Идти от конца к началу,
  22. // пока не кончатся пробелы либо строка
  23. iter--;
  24. }
  25.  
  26. if (iter == s) {
  27. // Если строка пройдена
  28. // и полностью состоит из пробелов
  29. // то результатом будет пустая строка
  30. *iter = '\0';
  31. }
  32. else {
  33. // Если пройдены все пробелы
  34. // и поиск дошел до первого не пробела,
  35. // то заменить первый пробел на конец строки.
  36. *(iter + 1) = '\0';
  37. }
  38. }
  39.  
  40. void TrimRight2(char* s)
  41. {
  42. char* spc = 0, *p = s;
  43.  
  44. while (*p)
  45. if (*p == ' ')
  46. for (spc = p; *++p == ' '; );
  47. else
  48. ++p;
  49.  
  50. if (spc && p != s && p[-1] == ' ')* spc = 0;
  51.  
  52. //return s;
  53. }
  54.  
  55. void TrimRight3(char* s) {
  56. char* space = nullptr;
  57. char* p = s;
  58.  
  59. while (*p) {
  60. if (*p == ' ') {
  61. if (space == nullptr) {
  62. space = p;
  63. }
  64. p++;
  65. }
  66. else {
  67. space = nullptr;
  68. p++;
  69. }
  70. }
  71.  
  72. if (space != nullptr) {
  73. *space = '\0';
  74. }
  75. }
  76.  
  77. void TrimRight4 (char * s) {
  78. size_t len = strlen (s);
  79. char * it = s + len - 1;
  80.  
  81. while (it >= s && *it == ' ') {
  82. *(it--) = '\0';
  83. }
  84. }
  85.  
  86. void TrimRight5(char* s) {
  87. char* space = nullptr;
  88. bool spaceFlag = false;
  89. char* p = s;
  90.  
  91. while (*p) {
  92. if (*p == ' ') {
  93. space = p;
  94. spaceFlag = true;
  95. } else {
  96. spaceFlag = false;
  97. }
  98. p++;
  99. }
  100.  
  101. if (spaceFlag) {
  102. *space = '\0';
  103. }
  104. }
  105.  
  106. const int PROBES = 1000 / 2;
  107. const size_t LENGTH = 1000000;
  108. const int WINDOW = 75;
  109. char * LETTERS;
  110. const int LETTERS_LENGTH = 22;
  111. char * TEST_DATA;
  112. char * SOURCE_DATA;
  113.  
  114. void createLetters () {
  115. LETTERS = (char *) malloc (sizeof (char) * LETTERS_LENGTH);
  116. for (size_t j = 0; j < LETTERS_LENGTH; j++) {
  117. if (j % 7)
  118. LETTERS[j] = ' ';
  119. else
  120. LETTERS[j] = 'A' + j;
  121. }
  122. }
  123.  
  124. void createTestData () {
  125. TEST_DATA = (char *) malloc (sizeof (char) * LENGTH);
  126. }
  127.  
  128. void createSourceData () {
  129. SOURCE_DATA = (char *) malloc (sizeof (char) * LENGTH);
  130. }
  131.  
  132. char * fillSourceData (size_t len_chars, size_t len_string) {
  133. for (size_t i = 0; i < len_chars; i++) {
  134. SOURCE_DATA[i] = LETTERS[rand () % LETTERS_LENGTH];
  135. }
  136.  
  137. for (size_t i = len_chars; i < len_string; i++) {
  138. SOURCE_DATA[i] = ' ';
  139. }
  140.  
  141. SOURCE_DATA[len_string - 1] = '\0';
  142.  
  143. return SOURCE_DATA;
  144. }
  145.  
  146. char * fillTestData (int len) {
  147. memcpy (TEST_DATA, SOURCE_DATA, sizeof (char) * len);
  148. return TEST_DATA;
  149. }
  150.  
  151. double doTest (TestTrimRight * test, char * str) {
  152. auto start = std::chrono::high_resolution_clock::now();
  153. test (str);
  154. auto finish = std::chrono::high_resolution_clock::now();
  155. return (double)(finish - start).count ();
  156. }
  157.  
  158. double average (double t0, double t1) {
  159. return ((99.0 * t0 + t1) / 100.0);
  160. }
  161.  
  162. int getWindowedLength (int full_length) {
  163. return
  164. (full_length -
  165. full_length / 100 * (rand () % WINDOW) -
  166. full_length / 100 * (WINDOW >> 2));
  167. }
  168.  
  169. int main()
  170. {
  171. int i = 0;
  172. int c = 0;
  173. const int c_mod = PROBES / 100 * 10;
  174. int char_length = 0;
  175. int full_length = 0;
  176. double
  177. e0 = 0.0,
  178. e1 = 0.0,
  179. e2 = 0.0,
  180. e3 = 0.0,
  181. e4 = 0.0,
  182. second = 1000000;
  183.  
  184. createLetters ();
  185. createSourceData ();
  186. createTestData ();
  187.  
  188. while (i++ < PROBES) {
  189. full_length = LENGTH;
  190. char_length = getWindowedLength (full_length);
  191. fillSourceData (char_length, full_length);
  192. e0 = average (e0, doTest (&TrimRight, fillTestData (full_length)));
  193. e1 = average (e1, doTest (&TrimRight2, fillTestData (full_length)));
  194. e2 = average (e2, doTest (&TrimRight3, fillTestData (full_length)));
  195. e3 = average (e3, doTest (&TrimRight4, fillTestData (full_length)));
  196. e4 = average (e4, doTest (&TrimRight5, fillTestData (full_length)));
  197. c = (c + 1) % c_mod;
  198. if (c == 0) {
  199. printf ("Probe #%-4i: ", i);
  200. printf
  201. ("e0 == %5.2f, e1 == %5.2f, e2 == %5.2f, e3 == %5.2f, e4 == %5.2f Ms\n",
  202. e0/second, e1/second, e2/second, e3/second, e4/second);
  203. }
  204. }
  205.  
  206. std::cout << "Elapsed time TrimRight: " << e0/second << " Ms\n";
  207. std::cout << "Elapsed time TrimRight2: " << e1/second << " Ms\n";
  208. std::cout << "Elapsed time TrimRight3: " << e2/second << " Ms\n";
  209. std::cout << "Elapsed time TrimRight4: " << e3/second << " Ms\n";
  210. std::cout << "Elapsed time TrimRight5: " << e4/second << " Ms\n";
  211. }
  212.  
  213.  
Success #stdin #stdout 4.81s 5844KB
stdin
Standard input is empty
stdout
Probe #50  : e0 ==  0.11, e1 ==  0.45, e2 ==  0.70, e3 ==  0.15, e4 ==  0.29 Ms
Probe #100 : e0 ==  0.17, e1 ==  0.64, e2 ==  1.05, e3 ==  0.25, e4 ==  0.43 Ms
Probe #150 : e0 ==  0.21, e1 ==  0.77, e2 ==  1.28, e3 ==  0.30, e4 ==  0.53 Ms
Probe #200 : e0 ==  0.23, e1 ==  0.92, e2 ==  1.50, e3 ==  0.34, e4 ==  0.62 Ms
Probe #250 : e0 ==  0.24, e1 ==  0.95, e2 ==  1.56, e3 ==  0.35, e4 ==  0.63 Ms
Probe #300 : e0 ==  0.24, e1 ==  1.00, e2 ==  1.62, e3 ==  0.35, e4 ==  0.64 Ms
Probe #350 : e0 ==  0.26, e1 ==  1.03, e2 ==  1.67, e3 ==  0.38, e4 ==  0.69 Ms
Probe #400 : e0 ==  0.25, e1 ==  1.03, e2 ==  1.67, e3 ==  0.36, e4 ==  0.67 Ms
Probe #450 : e0 ==  0.25, e1 ==  1.02, e2 ==  1.67, e3 ==  0.37, e4 ==  0.67 Ms
Probe #500 : e0 ==  0.26, e1 ==  1.05, e2 ==  1.70, e3 ==  0.38, e4 ==  0.69 Ms
Elapsed time TrimRight:  0.256123 Ms
Elapsed time TrimRight2: 1.05279 Ms
Elapsed time TrimRight3: 1.70175 Ms
Elapsed time TrimRight4: 0.37646 Ms
Elapsed time TrimRight5: 0.694258 Ms