fork download
  1. // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <string.h>
  6. #include <chrono>
  7.  
  8. void TrimRight(char* s) {
  9.  
  10. size_t len = strlen(s);
  11.  
  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.  
  41. void TrimRight2(char* s)
  42. {
  43. char *spc = 0, *p = s;
  44.  
  45. while (*p)
  46. if (*p == ' ')
  47. for (spc = p; *(++p) == ' ';);
  48. else
  49. ++p;
  50.  
  51. if (spc && p != s && p[-1] == ' ') *spc = 0;
  52. //return s;
  53. }
  54.  
  55. void TrimRight3(char* s) {
  56.  
  57. char* space = nullptr;
  58. char* p = s;
  59.  
  60. while (*p) {
  61. if (*p == ' ') {
  62. if (space == nullptr) {
  63. space = p;
  64. }
  65. p++;
  66. }
  67. else {
  68. space == nullptr;
  69. p++;
  70. }
  71. }
  72.  
  73. if (space != nullptr) {
  74. *space = '\0';
  75. }
  76.  
  77. }
  78.  
  79. void TrimRight4 (char * s) {
  80. size_t len = strlen (s);
  81. char * it = s + len - 1;
  82.  
  83. while (it >= s && *it == ' ') {
  84. *(it--) = '\0';
  85. }
  86. }
  87.  
  88. double testTrimRight (char * str) {
  89. auto start = std::chrono::high_resolution_clock::now();
  90. TrimRight(str);
  91. auto finish = std::chrono::high_resolution_clock::now();
  92. return (double)(finish - start).count ();
  93. }
  94.  
  95. double testTrimRight2 (char * str) {
  96. auto start = std::chrono::high_resolution_clock::now();
  97. TrimRight2(str);
  98. auto finish = std::chrono::high_resolution_clock::now();
  99. return (double)(finish - start).count ();
  100. }
  101.  
  102. double testTrimRight3 (char * str) {
  103. auto start = std::chrono::high_resolution_clock::now();
  104. TrimRight3(str);
  105. auto finish = std::chrono::high_resolution_clock::now();
  106. return (double)(finish - start).count ();
  107. }
  108.  
  109. double testTrimRight4 (char * str) {
  110. auto start = std::chrono::high_resolution_clock::now();
  111. TrimRight4 (str);
  112. auto finish = std::chrono::high_resolution_clock::now();
  113. return (double)(finish - start).count ();
  114. }
  115.  
  116. const size_t LENGTH = 1000000;
  117. char * LETTERS;
  118. char * testData;
  119. char * sourceData;
  120.  
  121. void createLetters () {
  122. LETTERS = (char *) malloc (sizeof (char) * 22);
  123. for (size_t j = 0; j < 22; j++) {
  124. if (j % 7)
  125. LETTERS[j] = 'A' + j;
  126. else
  127. LETTERS[j] = ' ';
  128. }
  129. }
  130.  
  131. void createTestData () {
  132. testData = (char *) malloc (sizeof (char) * LENGTH);
  133. }
  134.  
  135. void createSourceData () {
  136. sourceData = (char *) malloc (sizeof (char) * LENGTH);
  137. }
  138.  
  139. char * fillSourceData (size_t len_chars, size_t len_string) {
  140. for (size_t i = 0; i < len_chars; i++) {
  141. sourceData[i] = LETTERS[rand () % 22];
  142. }
  143.  
  144. for (size_t i = len_chars; i < len_string; i++) {
  145. sourceData[i] = ' ';
  146. }
  147.  
  148. sourceData[len_string - 1] = '\0';
  149.  
  150. return sourceData;
  151. }
  152.  
  153. char * fillTestData (int len) {
  154. memcpy (testData, sourceData, sizeof (char) * len);
  155. return testData;
  156. }
  157.  
  158. double average (double t0, double t1) {
  159. return ((9.0 * t0 + t1) / 10.0);
  160. }
  161.  
  162. int main()
  163. {
  164. const int PROBES = 1000 / 3;
  165. int i = 0, char_length = 0, full_length = 0;
  166. double e0 = 0.0, e1 = 0.0, e2 = 0.0, e3 = 0.0, second = 1000000;
  167.  
  168. createLetters ();
  169. createSourceData ();
  170. createTestData ();
  171.  
  172. while (i++ < PROBES) {
  173. full_length = LENGTH /*- LENGTH / 100 * (rand () % 66)*/;
  174. char_length = full_length - full_length / 100 * (rand () % 66);
  175. fillSourceData (char_length, full_length);
  176. e0 = average (e0, testTrimRight (fillTestData (full_length)));
  177. e1 = average (e1, testTrimRight2 (fillTestData (full_length)));
  178. e2 = average (e2, testTrimRight3 (fillTestData (full_length)));
  179. e3 = average (e3, testTrimRight4 (fillTestData (full_length)));
  180. }
  181.  
  182. std::cout << "Elapsed time testTrimRight: " << e0/second << " Ms\n";
  183. std::cout << "Elapsed time testTrimRight2: " << e1/second << " Ms\n";
  184. std::cout << "Elapsed time testTrimRight3: " << e2/second << " Ms\n";
  185. std::cout << "Elapsed time testTrimRight4: " << e3/second << " Ms\n";
  186. }
  187.  
  188.  
Success #stdin #stdout 3.65s 5680KB
stdin
Standard input is empty
stdout
Elapsed time testTrimRight:  0.137263 Ms
Elapsed time testTrimRight2: 1.31583 Ms
Elapsed time testTrimRight3: 1.74256 Ms
Elapsed time testTrimRight4: 0.18958 Ms