Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / будет ли быстрее печать текста БЕЗ переменных? / 24 сообщений из 24, страница 1 из 1
21.10.2021, 18:16
    #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
21.10.2021, 18:34
    #40105981
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
будет ли быстрее печать текста БЕЗ переменных?
Будет быстрее на пару наносекунд. Константа это адрес в памяти где значение, переменная это адрес в памяти где переменная, в ней адрес где значение.

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

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

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

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

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

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

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

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

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



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

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



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

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

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

почему, какой механизм?
...
Рейтинг: 0 / 0
06.11.2021, 23:44
    #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
07.11.2021, 01:24
    #40109758
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
будет ли быстрее печать текста БЕЗ переменных?
Пётр Седовконструктор std::string динамически выделяет блок памяти в heap-е и копирует
туда строковый литерал, потом деструктор std::string освобождает блок памяти.

Во-первых, там есть short string optimization.
Во-вторых, компилятор эти переменные может довести до constexp и вообще ничего
не оставить на время выполнения.
В-третьих, С++ это вообще не про скорость.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.11.2021, 04:14
    #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
07.11.2021, 19:30
    #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
08.11.2021, 04:11
    #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
08.11.2021, 16:29
    #40110026
будет ли быстрее печать текста БЕЗ переменных?
ну после конкатенации можно его хоть в консоль, хоть в STDOUT
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / будет ли быстрее печать текста БЕЗ переменных? / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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