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.  
  53. //return s;
  54. }
  55.  
  56. void TrimRight3(char* s) {
  57.  
  58. char* space = nullptr;
  59. char* p = s;
  60.  
  61. while (*p) {
  62. if (*p == ' ') {
  63. if (space == nullptr) {
  64. space = p;
  65. }
  66. p++;
  67. }
  68. else {
  69. space = nullptr;
  70. p++;
  71. }
  72. }
  73.  
  74. if (space != nullptr) {
  75. *space = '\0';
  76. }
  77.  
  78. }
  79.  
  80. void TrimRight4 (char * s) {
  81. size_t len = strlen (s);
  82. char * it = s + len - 1;
  83.  
  84. while (it >= s && *it == ' ') {
  85. *(it--) = '\0';
  86. }
  87. }
  88.  
  89. void TrimRight5(char* s) {
  90.  
  91. char* space = nullptr;
  92. bool spaceFlag = false;
  93. char* p = s;
  94.  
  95. while (*p) {
  96. if (*p == ' ') {
  97. space = p;
  98. spaceFlag = true;
  99. } else {
  100. spaceFlag = false;
  101. }
  102. p++;
  103. }
  104.  
  105. if (spaceFlag) {
  106. *space = '\0';
  107. }
  108. }
  109.  
  110. std::chrono::duration<double> testTrimRight (char * str) {
  111. auto start = std::chrono::high_resolution_clock::now();
  112. TrimRight(str);
  113. auto finish = std::chrono::high_resolution_clock::now();
  114. delete str;
  115. return (finish - start);
  116. }
  117.  
  118. std::chrono::duration<double> testTrimRight2 (char * str) {
  119. auto start = std::chrono::high_resolution_clock::now();
  120. TrimRight2(str);
  121. auto finish = std::chrono::high_resolution_clock::now();
  122. delete str;
  123. return (finish - start);
  124. }
  125.  
  126. std::chrono::duration<double> testTrimRight3 (char * str) {
  127. auto start = std::chrono::high_resolution_clock::now();
  128. TrimRight3(str);
  129. auto finish = std::chrono::high_resolution_clock::now();
  130. delete str;
  131. return (finish - start);
  132. }
  133.  
  134. std::chrono::duration<double> testTrimRight4 (char * str) {
  135. auto start = std::chrono::high_resolution_clock::now();
  136. TrimRight4(str);
  137. auto finish = std::chrono::high_resolution_clock::now();
  138. delete str;
  139. return (finish - start);
  140. }
  141.  
  142. std::chrono::duration<double> testTrimRight5 (char * str) {
  143. auto start = std::chrono::high_resolution_clock::now();
  144. TrimRight5(str);
  145. auto finish = std::chrono::high_resolution_clock::now();
  146. delete str;
  147. return (finish - start);
  148. }
  149.  
  150. char * createString (size_t len_chars, size_t len_spaces) {
  151. char * str = (char *) malloc (sizeof (char) * len_spaces);
  152. memset (str, ' ', len_spaces);
  153. str[len_spaces - 1] = '\0';
  154. for (size_t i = 0; i < len_chars; i++) {
  155. str[i] = 'A' + rand() % ('Z' - 'A');
  156. }
  157. return str;
  158. }
  159.  
  160. char * copyString (char * src, int len) {
  161. char * dest = (char *) malloc (sizeof (char) * len);
  162. memcpy (dest, src, sizeof (char) * len);
  163. return dest;
  164. }
  165.  
  166. int main()
  167. {
  168. const size_t len_chars = 1000;
  169. const size_t len_spaces = 10000000;
  170. const int PROBES = 100;
  171. int i = 0;
  172. char * data;
  173. std::chrono::duration<double> e0 = std::chrono::seconds { 0 };
  174. std::chrono::duration<double> e1 = std::chrono::seconds { 0 };
  175. std::chrono::duration<double> e2 = std::chrono::seconds { 0 };
  176. std::chrono::duration<double> e3 = std::chrono::seconds { 0 };
  177. std::chrono::duration<double> e4 = std::chrono::seconds { 0 };
  178.  
  179. while (i++ < PROBES) {
  180. data = createString (len_chars, len_spaces);
  181. e0 = (e0 + testTrimRight (copyString (data, len_spaces))) / 2.0;
  182. e1 = (e1 + testTrimRight2 (copyString (data, len_spaces))) / 2.0;
  183. e2 = (e2 + testTrimRight3 (copyString (data, len_spaces))) / 2.0;
  184. e3 = (e3 + testTrimRight4 (copyString (data, len_spaces))) / 2.0;
  185. e4 = (e4 + testTrimRight5 (copyString (data, len_spaces))) / 2.0;
  186. delete data;
  187. }
  188. std::cout << "Elapsed time testTrimRight: " << e0.count() << " s\n";
  189. std::cout << "Elapsed time testTrimRight2: " << e1.count() << " s\n";
  190. std::cout << "Elapsed time testTrimRight3: " << e2.count() << " s\n";
  191. std::cout << "Elapsed time testTrimRight4: " << e3.count() << " s\n";
  192. std::cout << "Elapsed time testTrimRight5: " << e4.count() << " s\n";
  193. }
  194.  
Success #stdin #stdout 4.45s 22628KB
stdin
Standard input is empty
stdout
Elapsed time testTrimRight: 0.00418435 s
Elapsed time testTrimRight2: 0.00286383 s
Elapsed time testTrimRight3: 0.0104946 s
Elapsed time testTrimRight4: 0.00604734 s
Elapsed time testTrimRight5: 0.00591097 s