// 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';
}
}
void TrimRight5(char* s) {
char* space = nullptr;
bool spaceFlag = false;
char* p = s;
while (*p) {
if (*p == ' ') {
space = p;
spaceFlag = true;
} else {
spaceFlag = false;
}
p++;
}
if (spaceFlag) {
*space = '\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);
}
std::chrono::duration<double> testTrimRight5 (char * str) {
auto start = std::chrono::high_resolution_clock::now();
TrimRight5(str);
auto finish = std::chrono::high_resolution_clock::now();
delete str;
return (finish - start);
}
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] = 'A' + rand() % ('Z' - 'A');
}
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 = 1000;
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 };
std::chrono::duration<double> e4 = std::chrono::seconds { 0 };
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;
e4 = (e4 + testTrimRight5 (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";
std::cout << "Elapsed time testTrimRight5: " << e4.count() << " s\n";
}