fork(2) 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. std::chrono::duration<double> testTrimRight (char * str) {
  90. auto start = std::chrono::high_resolution_clock::now();
  91. TrimRight(str);
  92. auto finish = std::chrono::high_resolution_clock::now();
  93. delete str;
  94. return (finish - start);
  95. }
  96.  
  97. std::chrono::duration<double> testTrimRight2 (char * str) {
  98. auto start = std::chrono::high_resolution_clock::now();
  99. TrimRight2(str);
  100. auto finish = std::chrono::high_resolution_clock::now();
  101. delete str;
  102. return (finish - start);
  103. }
  104.  
  105. std::chrono::duration<double> testTrimRight3 (char * str) {
  106. auto start = std::chrono::high_resolution_clock::now();
  107. TrimRight3(str);
  108. auto finish = std::chrono::high_resolution_clock::now();
  109. delete str;
  110. return (finish - start);
  111. }
  112.  
  113. std::chrono::duration<double> testTrimRight4 (char * str) {
  114. auto start = std::chrono::high_resolution_clock::now();
  115. TrimRight4(str);
  116. auto finish = std::chrono::high_resolution_clock::now();
  117. delete str;
  118. return (finish - start);
  119. }
  120.  
  121. char * createString (size_t len_chars, size_t len_spaces) {
  122. char * str = (char *) malloc (sizeof (char) * len_spaces);
  123. memset (str, ' ', len_spaces);
  124. str[len_spaces - 1] = '\0';
  125. for (size_t i = 0; i < len_chars; i++) {
  126. str[i] = 'A' + rand() % ('Z' - 'A');
  127. }
  128. return str;
  129. }
  130.  
  131. char * copyString (char * src, int len) {
  132. char * dest = (char *) malloc (sizeof (char) * len);
  133. memcpy (dest, src, sizeof (char) * len);
  134. return dest;
  135. }
  136.  
  137. int main()
  138. {
  139. const size_t len_chars = 1000;
  140. const size_t len_spaces = 10000000;
  141. const int PROBES = 100;
  142. int i = 0;
  143. char * data;
  144. std::chrono::duration<double> e0 = std::chrono::seconds { 0 };
  145. std::chrono::duration<double> e1 = std::chrono::seconds { 0 };
  146. std::chrono::duration<double> e2 = std::chrono::seconds { 0 };
  147. std::chrono::duration<double> e3 = std::chrono::seconds { 0 };
  148.  
  149. while (i++ < PROBES) {
  150. data = createString (len_chars, len_spaces);
  151. e0 = (e0 + testTrimRight (copyString (data, len_spaces))) / 2.0;
  152. e1 = (e1 + testTrimRight2 (copyString (data, len_spaces))) / 2.0;
  153. e2 = (e2 + testTrimRight3 (copyString (data, len_spaces))) / 2.0;
  154. e3 = (e3 + testTrimRight4 (copyString (data, len_spaces))) / 2.0;
  155. delete data;
  156. }
  157. std::cout << "Elapsed time testTrimRight: " << e0.count() << " s\n";
  158. std::cout << "Elapsed time testTrimRight2: " << e1.count() << " s\n";
  159. std::cout << "Elapsed time testTrimRight3: " << e2.count() << " s\n";
  160. std::cout << "Elapsed time testTrimRight4: " << e3.count() << " s\n";
  161. }
  162.  
Success #stdin #stdout 3.3s 22624KB
stdin
Standard input is empty
stdout
Elapsed time testTrimRight: 0.00430621 s
Elapsed time testTrimRight2: 0.00294984 s
Elapsed time testTrimRight3: 0.00896891 s
Elapsed time testTrimRight4: 0.00846298 s