powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / будет ли быстрее печать текста БЕЗ переменных?
24 сообщений из 24, страница 1 из 1
будет ли быстрее печать текста БЕЗ переменных?
    #40105973
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// если текст распихать по переменным:
string a = 'много текста';
string b = 'много текста';
string c = 'много текста';

// а потом
cout << a << b << c << endl;

// будет ли это медленнее, чем когда сразу:
cout << 'много текста' << 'много текста' << 'много текста' << endl;

// или же он всё равно память выделит и туда его положит?
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105981
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет быстрее на пару наносекунд. Константа это адрес в памяти где значение, переменная это адрес в памяти где переменная, в ней адрес где значение.

Учитывая тормознутость cout ускорения не увидишь и не измеришь.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105982
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод "тормозит" вовсе не в этом месте.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105985
Dima T
Будет быстрее на пару наносекунд. Константа это адрес в памяти где значение, переменная это адрес в памяти где переменная, в ней адрес где значение.

Учитывая тормознутость cout ускорения не увидишь и не измеришь.

а если не cout, а STDOUT, например?
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105988
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Консольный вывод тормозит именно в консоли. То есть там, где ты не сможешь повлиять.
...
Однако, можешь направить вывод в свой поток "в память", и свой вьювер, вместо консоли.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105989
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
а если не cout, а STDOUT, например?

Это почти одно и то же с точки зрения быстродействия.
Если под винду - пишите в файл, будет быстрее, намного.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105993
Aklin, под линух
как файл может быть быстрее памяти?
может в сокет вы имеете ввиду?
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105996
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бабушкин зайчик
Aklin, под линух
как файл может быть быстрее памяти?
может в сокет вы имеете ввиду?

Консоль - медленная, в сотый раз повторяю.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40105998
ъъъъъ, ну технически строка вообще по сети уходит
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106001
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бабушкин зайчик,

по какой ещё "сети"?

Да, std::cout можно куда хочешь направить, но как по твоему стартовому сообщению понять, что именно ты делаешь и что тебе нужно?
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106027
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
printf() быстрее cout готовит данные для вывода, а куда выводишь это вторично.

PS Ты бы задачу описал целиком, а то выглядит примерно так: "Как быстрее из Москвы в Питер на велике с педалями фирмы А или Б, или на машине?"
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106042
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик

Код: sql
1.
cout << a << b << c << endl;



Кажется С++ должен это собрать в такую колбасу. Лево-ассоциативность типа.

Код: plaintext
1.
cout.operator<<(a).operator<<(.....)



Поэтому конкатенации вроде здесь не должно быть. Хотя было-бы интересно. Но сложно доказывать
что не сломается логика.

Переменные вроде как агрессивный компиллятор убирает. Поэтому они по сути остаются синтаксическим
сахарком для девелопера.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106047
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// если текст распихать по переменным:
string a = 'много текста';
string b = 'много текста';
string c = 'много текста';

// а потом
cout << a << b << c << endl;

// будет ли это медленнее, чем когда сразу:
cout << 'много текста' << 'много текста' << 'много текста' << endl;

// или же он всё равно память выделит и туда его положит?

в кафешке гораздо быстрее забрать то что надо на поднос и сесть кушать, чем заказать через поднос официанта сидя на месте)
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106052
mayton, вот как раз это меня и интересовало - как там под капотом
вывод идёт через <<
т.е. там ostream какой-то
ну а вопрос простой: сразу в << кидать, или переменные собирать, а потом заслать их всех через конкатенацию (через << их складывать - это я лишку дал)
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40106055
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endl при вызове сбрасывает буфер вывода

весь вопрос в выделении a,b,c при каждом выполнении "программы" либо отдачи в вывод готового набора
Я гарантирую что Второе быстрее...
PS
Это похоже на спортивное программирование. Проверяется спортом...)
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40107166
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
endl при вызове сбрасывает буфер вывода
точно так же "сбрасывает" как и всё остальное
а при перенаправлении в файл буферизуется и нефига не сбрасывается без лишних танцев с бубнами сбрасывается "случайно"
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40108923
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
абсолютно всё равно
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109001
MasterZiv
абсолютно всё равно

почему, какой механизм?
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109752
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик, вариант без переменных:
Код: plaintext
1.
cout << "много текста" << "много текста" << "много текста" << endl;

Самый быстрый.

Вариант с переменными типа const char*:
Код: plaintext
1.
2.
3.
4.
const char* a = "много текста";
const char* b = "много текста";
const char* c = "много текста";
cout << a << b << c << endl;

Будет работать с такой же скоростью (в этом варианте будет 3 вызова функции strlen, но в предыдущем варианте они скорее всего тоже будут).

Вариант с переменными типа std::string:
Код: plaintext
1.
2.
3.
4.
string a = "много текста";
string b = "много текста";
string c = "много текста";
cout << a << b << c << endl;

Будет работать помедленнее, потому что конструктор std::string динамически выделяет блок памяти в heap-е и копирует туда строковый литерал, потом деструктор std::string освобождает блок памяти.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109758
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седовконструктор std::string динамически выделяет блок памяти в heap-е и копирует
туда строковый литерал, потом деструктор std::string освобождает блок памяти.

Во-первых, там есть short string optimization.
Во-вторых, компилятор эти переменные может довести до constexp и вообще ничего
не оставить на время выполнения.
В-третьих, С++ это вообще не про скорость.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109764
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Во-первых, там есть short string optimization.
Глянул реализацию std::string в Visual Studio 2017. Действительно, если длина строки <= 15, то используется буфер фиксированного размера. Но я бы не стал полагаться на это. Не факт, что все строки будут такие короткие.

Dimitry Sibiryakov
Во-вторых, компилятор эти переменные может довести до constexp и вообще ничего
не оставить на время выполнения.
Visual Studio 2017 в конфигурации Release x86 не оптимизирует в «пустоту», а вызывает std::string::assign:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  string a = "много текста";
00561028  push        0Ch
0056102A  push        offset string "\xec\xed\xee\xe3\xee \xf2\xe5\xea\xf1\xf2\xe0" (05631B0h)
0056102F  lea         ecx,[a]
00561032  mov         dword ptr [ebp-48h],0
00561039  mov         dword ptr [ebp-44h],0Fh
00561040  mov         byte ptr [a],0
00561044  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign (05612D0h)
00561049  mov         dword ptr [ebp-4],0

Компилятор кстати вызов функции strlen оптимизировал в константу:
Код: sql
1.
00561028  push        0Ch

0Ch = 12 = strlen("много текста") (кодировка code page 1251)
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109844
Пётр Седов
Вариант с переменными типа std::string:
Код: plaintext
1.
2.
3.
4.
string a = "много текста";
string b = "много текста";
string c = "много текста";
cout << a << b << c << endl;


Будет работать помедленнее, потому что конструктор std::string динамически выделяет блок памяти в heap-е и копирует туда строковый литерал, потом деструктор std::string освобождает блок памяти.

вот самый быстрый вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// Зарезервируйте свое конечное пространство раньше, затем используйте метод append с буфером.
Например, предположим, что ваша конечная длина строки должна составлять 1 миллион символов:
std::string s;
s.reserve(1000000);
while (whatever)        {s.append(buf, len);}


Я сделал обширные тесты по этой проблеме и пришел к выводу, 
что наиболее эффективное решение (GCC 4.7  4.8 на Linux x86/x64/ARM)
во всех случаях использования - это прежде всего .reserve() строку результата
с достаточным пространством для хранения всех конкатенированных строк,
а затем только .append() их (или используйте operator +=(), что не имеет значения).

// В двух словах:
const string space = " ";
string result;
result.reserve(5 + space.size() + 5);
result += "hello";
result += space;
result += "world";

В зависимости от конкретного варианта использования (число, типы и размеры конкатенированных строк),
иногда этот метод является наиболее эффективным, а в других случаях он сравним с другими методами,
но он НИКОГДА НЕ бывает хуже.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40109922
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик, а, так вы ищите самый быстрый способ для конкатенации строк? Да, если есть возможность сделать осмысленный reserve, то это быстрее всего.

std::cout (который у вас упомянут в первом сообщении) -- он для вывода текста на консоль, а не для конкатенации строк. Для конкатенации строк можно использовать класс std::ostringstream:
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <sstream>
...
ostringstream stream;
stream << "hello" << " " << "world";
string s = stream.str();
assert(s == "hello world");

Но этот способ не самый быстрый, потому что reserve не сделать, и метод str копирует данные.
...
Рейтинг: 0 / 0
будет ли быстрее печать текста БЕЗ переменных?
    #40110026
ну после конкатенации можно его хоть в консоль, хоть в STDOUT
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / будет ли быстрее печать текста БЕЗ переменных?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]