- // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы. 
- // 
-   
- #include <iostream> 
- #include <string.h> 
- #include <chrono> 
-   
- void TrimRight(char* s) { 
-   
-    size_t len = strlen(s); 
-   
-    char* iter = s + len - 1; 
-   
-    if (*iter != ' ') { 
-       // Если последний символ не пробел,  
-       // то и обрезать нечего 
-       return; 
-    } 
-   
-    while (*iter == ' ' /*&& iter != s*/) { 
-       // Идти от конца к началу,  
-       // пока не кончатся пробелы либо строка 
-       iter--; 
-    } 
-   
-    if (iter == s) { 
-       // Если строка пройдена 
-       // и полностью состоит из пробелов 
-       // то результатом будет пустая строка 
-       *iter = '\0'; 
-    } 
-    else { 
-       // Если пройдены все пробелы  
-       // и поиск дошел до первого не пробела, 
-       // то заменить первый пробел на конец строки. 
-       *(iter + 1) = '\0'; 
-    } 
-   
- } 
-   
- void TrimRight2(char* s) 
- { 
-    char *spc = 0, *p = s; 
-   
-    while (*p) 
-       if (*p == ' ') 
-          for (spc = p; *(++p) == ' ';); 
-       else 
-          ++p; 
-   
-    if (spc && p != s && p[-1] == ' ') *spc = 0; 
-    //return s; 
- } 
-   
- void TrimRight3(char* s) { 
-   
-    char* space = nullptr; 
-    char* p = s; 
-   
-    while (*p) { 
-       if (*p == ' ') { 
-          if (space == nullptr) { 
-             space = p; 
-          } 
-          p++; 
-       } 
-       else { 
-          space == nullptr; 
-          p++; 
-       } 
-    } 
-   
-    if (space != nullptr) { 
-       *space = '\0'; 
-    } 
-   
- } 
-   
- void TrimRight4 (char * s) { 
-    size_t len = strlen (s); 
-    char * it = s + len - 1; 
-   
-    while (it >= s && *it == ' ') { 
-      *(it--) = '\0'; 
-    } 
- } 
-   
- std::chrono::duration<double> testTrimRight (char * str) { 
-    auto start = std::chrono::high_resolution_clock::now(); 
-    TrimRight(str); 
-    auto finish = std::chrono::high_resolution_clock::now(); 
-    delete str; 
-    return (finish - start); 
- } 
-   
- std::chrono::duration<double> testTrimRight2 (char * str) { 
-    auto start = std::chrono::high_resolution_clock::now(); 
-    TrimRight2(str); 
-    auto finish = std::chrono::high_resolution_clock::now(); 
-    delete str; 
-    return (finish - start); 
- } 
-   
- std::chrono::duration<double> testTrimRight3 (char * str) { 
-    auto start = std::chrono::high_resolution_clock::now(); 
-    TrimRight3(str); 
-    auto finish = std::chrono::high_resolution_clock::now(); 
-    delete str; 
-    return (finish - start); 
- } 
-   
- std::chrono::duration<double> testTrimRight4 (char * str) { 
-    auto start = std::chrono::high_resolution_clock::now(); 
-    TrimRight4 (str); 
-    auto finish = std::chrono::high_resolution_clock::now(); 
-    delete str; 
-    return (finish - start); 
- } 
-   
- char * LETTERS; 
-   
- void createLetters () { 
-    LETTERS = (char *) malloc (sizeof (char) * 50); 
-    for (size_t j = 0; j < 22; j++) { 
-       if (j % 3) 
-          LETTERS[j] = 'A' + j; 
-       else 
-          LETTERS[j] = ' '; 
-    } 
- } 
-   
- char * createString (size_t len_chars, size_t len_spaces) { 
-    char * str = (char *) malloc (sizeof (char) * len_spaces); 
-    memset (str, ' ', len_spaces); 
-    str[len_spaces - 1] = '\0'; 
-    for (size_t i = 0; i < len_chars; i++) { 
-       str[i] = LETTERS[rand () % 22]; 
-    } 
-    return str; 
- } 
-   
- char * copyString (char * src, int len) { 
-    char * dest = (char *) malloc (sizeof (char) * len); 
-    memcpy (dest, src, sizeof (char) * len); 
-    return dest; 
- } 
-   
- int main() 
- { 
-    const size_t len_chars  = 1000000; 
-    const size_t len_spaces = 10000000; 
-    const int PROBES = 100; 
-    int i = 0; 
-    char * data; 
-    std::chrono::duration<double> e0 = std::chrono::seconds { 0 }; 
-    std::chrono::duration<double> e1 = std::chrono::seconds { 0 }; 
-    std::chrono::duration<double> e2 = std::chrono::seconds { 0 }; 
-    std::chrono::duration<double> e3 = std::chrono::seconds { 0 }; 
-   
-    createLetters (); 
-   
-    while (i++ < PROBES) { 
-       data = createString (len_chars, len_spaces); 
-       e0 = (e0 + testTrimRight (copyString (data, len_spaces))) / 2.0; 
-       e1 = (e1 + testTrimRight2 (copyString (data, len_spaces))) / 2.0; 
-       e2 = (e2 + testTrimRight3 (copyString (data, len_spaces))) / 2.0; 
-       e3 = (e3 + testTrimRight4 (copyString (data, len_spaces))) / 2.0; 
-       delete data; 
-    } 
-    std::cout << "Elapsed time testTrimRight: " << e0.count() << " s\n"; 
-    std::cout << "Elapsed time testTrimRight2: " << e1.count() << " s\n"; 
-    std::cout << "Elapsed time testTrimRight3: " << e2.count() << " s\n"; 
-    std::cout << "Elapsed time testTrimRight4: " << e3.count() << " s\n"; 
- } 
-   
-