Функции вывода
От: YourLastSong  
Дата: 16.07.11 16:44
Оценка:
Здравствуйте, уважаемые господа.

По некоторым причинам мне очень важна скорость вывода различных строк и символов на экран консоли, в связи с чем задумался об использовании какой-либо конкретной функции.

Разумеется, std::cout в этом случае, я думаю, лучше не использовать.

Проверил скорость выполнения printf ("%c", ch) и putchar (ch) — оказалось, что первый способ работает быстрее. Почему? Ведь putchar не должен разбирать формат строки.

Вместо printf для константных строк, я думаю, лучше будет использовать puts, да?

Что ещё можно использовать в данном случае?

Заранее благодарю за возможные ответы.
Re: Функции вывода
От: warhast Россия  
Дата: 16.07.11 17:26
Оценка:
YLS>Что ещё можно использовать в данном случае?
write(1, ...)
Re: Функции вывода
От: boot  
Дата: 16.07.11 17:42
Оценка: +1
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, уважаемые господа.


YLS>По некоторым причинам мне очень важна скорость вывода различных строк и символов на экран консоли, в связи с чем задумался об использовании какой-либо конкретной функции.


YLS>Разумеется, std::cout в этом случае, я думаю, лучше не использовать.


YLS>Проверил скорость выполнения printf ("%c", ch) и putchar (ch) — оказалось, что первый способ работает быстрее. Почему? Ведь putchar не должен разбирать формат строки.


YLS>Вместо printf для константных строк, я думаю, лучше будет использовать puts, да?


YLS>Что ещё можно использовать в данном случае?


YLS>Заранее благодарю за возможные ответы.


Если важна именно скорость вывода строк на консоль, тогда printf. Правда, читать эти строки врядли кто успеет. А если важна скорость работы программы, которая выдает эти строки, тогда нужно писать эти строки в очередь, а нить с приоритетом ниже базового пускай извлекает эти строки на консоль.
Жизнеспособность прямо пропорциональна простоте!
Re: Функции вывода
От: ДимДимыч Украина http://klug.org.ua
Дата: 16.07.11 18:11
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Что ещё можно использовать в данном случае?


Не забывайте, что вывод библиотечными функциями в stdout по-умолчанию буферизируется.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: Функции вывода
От: YourLastSong  
Дата: 16.07.11 18:45
Оценка:
Что-то у меня, видимо, не получается узнать скорость выполнения данных функций, выходит, что putchar работает быстрее write.

Может кто-нибудь проверить, как происходит на самом деле вообще?
Re: Функции вывода
От: uzhas Ниоткуда  
Дата: 16.07.11 19:05
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Проверил скорость выполнения printf ("%c", ch) и putchar (ch) — оказалось, что первый способ работает быстрее. поведайте нам ваши результаты, тесты и все такое

очень интересно узнать какую разницу вы нашли для одного символа
Re[2]: Функции вывода
От: YourLastSong  
Дата: 16.07.11 19:30
Оценка: 1 (1)
U>очень интересно узнать какую разницу вы нашли для одного символа

Я выводил их в цикле много раз.

Как проверить ещё — не знаю.
Re[3]: Функции вывода
От: warhast Россия  
Дата: 16.07.11 20:12
Оценка:
YLS>Как проверить ещё — не знаю.

А оно точно надо? Любое разумное количество текста замечательно пролезет и через cout, а просто чтобы что-то на экране помелькало/нарисовалось — тут уже пора смотреть в сторону WriteConsoleOutput/ncurses.
Re[4]: Функции вывода
От: YourLastSong  
Дата: 16.07.11 21:07
Оценка:
W>А оно точно надо? Любое разумное количество текста замечательно пролезет и через cout, а просто чтобы что-то на экране помелькало/нарисовалось — тут уже пора смотреть в сторону WriteConsoleOutput

А почему именно WriteConsoleOutput? Пользовался только неск. раз, может чего-то не понимаю.

Да, надо, пожалуй. Сможете сказать, что быстрее работает всё же?
Re[5]: Функции вывода
От: warhast Россия  
Дата: 16.07.11 22:29
Оценка:
YLS>А почему именно WriteConsoleOutput? Пользовался только неск. раз, может чего-то не понимаю.
WriteConsoleOutput — это если скоростной вывод текста понадобился чтобы что-то "рисовать" символами на экране консоли. Она именно для такого рисования и предназначена.

YLS>Да, надо, пожалуй. Сможете сказать, что быстрее работает всё же?

Все printf-ы, putch-и и им подобные рано или поздно вызывают WriteFile/WriteConsole. Разница разве что в том как часто они Enter/LeaveCriticalSection дергают (например, putch — на каждый вызов) или там перекодируют текст. Подробности — в исходниках CRT, которые ставятся со студией (сегодня впервые посмотрел как у них сделан write() — там не стесняются посимвольно перекодировать выводимый на консоль текст, а я-то до последнего надеялся что это просто примитивная обертка над WriteFile). Однако по сравнению с собственно отрисовкой выводимого текста разница в затратах на его обработку несущественна.

Получается следующее — если цель — что-то рисовать, то для этого есть специальные функции; если надо просто вывести текстовку — подойдет любой способ, который больше нравится, от потоков c++ до WriteFile, причем хоть собирать текст в буфер и скармливать WriteFile и будет быстрее всего, но разницей в скорости можно пренебречь; а вот если срочно надо прокачать через консоль мегабайты текста(на меньших объемах различия в скорости на глаз не определить) и узкое место — именно скорость его передачи, то вопрос прежний — "а оно точно надо?"
Re[6]: Функции вывода
От: YourLastSong  
Дата: 16.07.11 22:39
Оценка: :)
W>WriteConsoleOutput — это если скоростной вывод текста понадобился чтобы что-то "рисовать" символами на экране консоли. Она именно для такого рисования и предназначена.

Она ведь из .NET?

Я, наверное, говорю непр., но разве для использования WriteConsoleOutput и других функций .NET, у пользователя не должно что-то отдельное быть установлено?

Извиняюсь, просто раньше их практически не использовал.
Re: Функции вывода
От: Centaur Россия  
Дата: 17.07.11 03:45
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>По некоторым причинам мне очень важна скорость вывода различных строк и символов на экран консоли, в связи с чем задумался об использовании какой-либо конкретной функции.


При выводе на консоль самые тормоза заключаются в скроллинге консоли. Лучший способ ускорить длительную операцию, которая по ходу дела вываливает в консоль тонны диагностики — перенаправить эту самую диагностику в /dev/null.
Re[2]: Функции вывода
От: YourLastSong  
Дата: 17.07.11 07:40
Оценка:
C>При выводе на консоль самые тормоза заключаются в скроллинге консоли. Лучший способ ускорить длительную операцию, которая по ходу дела вываливает в консоль тонны диагностики — перенаправить эту самую диагностику в /dev/null

Не подскажете, как это сделать?
Re[7]: Функции вывода
От: wander  
Дата: 17.07.11 10:41
Оценка:
Здравствуйте, YourLastSong, Вы писали:

W>>WriteConsoleOutput — это если скоростной вывод текста понадобился чтобы что-то "рисовать" символами на экране консоли. Она именно для такого рисования и предназначена.


YLS>Она ведь из .NET?


YLS>Я, наверное, говорю непр., но разве для использования WriteConsoleOutput и других функций .NET, у пользователя не должно что-то отдельное быть установлено?


YLS>Извиняюсь, просто раньше их практически не использовал.


Это WinAPI функция.
Re[3]: Функции вывода
От: uzhas Ниоткуда  
Дата: 17.07.11 15:56
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Не подскажете, как это сделать?

my_prog.exe > output.txt
заметно шустрее работает, нежели при выводе текста в консоль
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.