fork(1) 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. std::chrono::duration<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. delete str;
  93. return (finish - start);
  94. }
  95.  
  96. std::chrono::duration<double> testTrimRight2 (char * str) {
  97. auto start = std::chrono::high_resolution_clock::now();
  98. TrimRight2(str);
  99. auto finish = std::chrono::high_resolution_clock::now();
  100. delete str;
  101. return (finish - start);
  102. }
  103.  
  104. std::chrono::duration<double> testTrimRight3 (char * str) {
  105. auto start = std::chrono::high_resolution_clock::now();
  106. TrimRight3(str);
  107. auto finish = std::chrono::high_resolution_clock::now();
  108. delete str;
  109. return (finish - start);
  110. }
  111.  
  112. std::chrono::duration<double> testTrimRight4 (char * str) {
  113. auto start = std::chrono::high_resolution_clock::now();
  114. TrimRight4 (str);
  115. auto finish = std::chrono::high_resolution_clock::now();
  116. delete str;
  117. return (finish - start);
  118. }
  119.  
  120. char * LETTERS;
  121.  
  122. void createLetters () {
  123. LETTERS = (char *) malloc (sizeof (char) * 50);
  124. for (size_t j = 0; j < 22; j++) {
  125. if (j % 3)
  126. LETTERS[j] = 'A' + j;
  127. else
  128. LETTERS[j] = ' ';
  129. }
  130. }
  131.  
  132. char * createString (size_t len_chars, size_t len_spaces) {
  133. char * str = (char *) malloc (sizeof (char) * len_spaces);
  134. memset (str, ' ', len_spaces);
  135. str[len_spaces - 1] = '\0';
  136. for (size_t i = 0; i < len_chars; i++) {
  137. str[i] = LETTERS[rand () % 22];
  138. }
  139. return str;
  140. }
  141.  
  142. char * copyString (char * src, int len) {
  143. char * dest = (char *) malloc (sizeof (char) * len);
  144. memcpy (dest, src, sizeof (char) * len);
  145. return dest;
  146. }
  147.  
  148. int main()
  149. {
  150. const size_t len_chars = 1000000;
  151. const size_t len_spaces = 10000000;
  152. const int PROBES = 100;
  153. int i = 0;
  154. char * data;
  155. std::chrono::duration<double> e0 = std::chrono::seconds { 0 };
  156. std::chrono::duration<double> e1 = std::chrono::seconds { 0 };
  157. std::chrono::duration<double> e2 = std::chrono::seconds { 0 };
  158. std::chrono::duration<double> e3 = std::chrono::seconds { 0 };
  159.  
  160. createLetters ();
  161.  
  162. while (i++ < PROBES) {
  163. data = createString (len_chars, len_spaces);
  164. e0 = (e0 + testTrimRight (copyString (data, len_spaces))) / 2.0;
  165. e1 = (e1 + testTrimRight2 (copyString (data, len_spaces))) / 2.0;
  166. e2 = (e2 + testTrimRight3 (copyString (data, len_spaces))) / 2.0;
  167. e3 = (e3 + testTrimRight4 (copyString (data, len_spaces))) / 2.0;
  168. delete data;
  169. }
  170. std::cout << "Elapsed time testTrimRight: " << e0.count() << " s\n";
  171. std::cout << "Elapsed time testTrimRight2: " << e1.count() << " s\n";
  172. std::cout << "Elapsed time testTrimRight3: " << e2.count() << " s\n";
  173. std::cout << "Elapsed time testTrimRight4: " << e3.count() << " s\n";
  174. }
  175.  
  176.  
Success #stdin #stdout 4.98s 22676KB
stdin
Standard input is empty
stdout
Elapsed time testTrimRight: 0.00415174 s
Elapsed time testTrimRight2: 0.00567979 s
Elapsed time testTrimRight3: 0.0109818 s
Elapsed time testTrimRight4: 0.00593889 s