C# почему Console.WriteLine медленный?
От: Разраб  
Дата: 20.07.23 06:29
Оценка:
Замерял вывод 1млн интов.
питон(!) быстрее печатает.
кресты вообще в несколько раз быстрее через cout << x << endl чем релизный код на .net8

PS clang++-11 не понимает числовые литералы с разделителем типа 1000_000. Легкий шок.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: C# почему Console.WriteLine медленный?
От: Maniacal Россия  
Дата: 20.07.23 06:48
Оценка: 7 (3)
Здравствуйте, Разраб, Вы писали:

Р>Замерял вывод 1млн интов.

Р>питон(!) быстрее печатает.
Р>кресты вообще в несколько раз быстрее через cout << x << endl чем релизный код на .net8

Р>PS clang++-11 не понимает числовые литералы с разделителем типа 1000_000. Легкий шок.


Тут много ответов и решений этого вопроса:
https://stackoverflow.com/questions/5272177/console-writeline-slow
Re: C# почему Console.WriteLine медленный?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 20.07.23 08:09
Оценка: +1
Здравствуйте, Разраб, Вы писали:

Р>Замерял вывод 1млн интов.

А для чего это нужно?
Мне сложно представить полезную задачу с таким огромным выводом в консоль. Всё с чем доводилось сталкиваться печатало справку, прогресс работы, логи...
И прямо чтобы это стало камнем преткновения — не натыкался.
Re[2]: C# почему Console.WriteLine медленный?
От: Разраб  
Дата: 20.07.23 08:12
Оценка: 1 (1)
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, Разраб, Вы писали:


Р>>Замерял вывод 1млн интов.

МР>А для чего это нужно?
МР>Мне сложно представить полезную задачу с таким огромным выводом в консоль. Всё с чем доводилось сталкиваться печатало справку, прогресс работы, логи...
МР>И прямо чтобы это стало камнем преткновения — не натыкался.

Консольные утилиты в линуксе
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: C# почему Console.WriteLine медленный?
От: pagid_ Россия  
Дата: 20.07.23 08:59
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Замерял вывод 1млн интов.

Р>питон(!) быстрее печатает.
Р>кресты вообще в несколько раз быстрее через cout << x << endl чем релизный код на .net8

Перенаправлять вывод в файл пробовал, сравнивал результат?
Re[3]: C# почему Console.WriteLine медленный?
От: karbofos42 Россия  
Дата: 20.07.23 18:08
Оценка: +1 -1 :)))
Здравствуйте, Разраб, Вы писали:

Р>Консольные утилиты в линуксе


Читаешь быстрее, чем C# выводит в консоль?
Или печатаешь всё подряд для солидности, т.к. в линуксах так все делают?
Re: C# почему Console.WriteLine медленный?
От: CreatorCray  
Дата: 21.07.23 00:16
Оценка: 1 (1) +1
Здравствуйте, Разраб, Вы писали:

Р>Замерял вывод 1млн интов.

Р>питон(!) быстрее печатает.
Р>кресты вообще в несколько раз быстрее через cout << x << endl чем релизный код на .net8

Думается что дело в буферизации вывода внутри С/С++ рантайма vs вывод каждой строки отдельно.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: C# почему Console.WriteLine медленный?
От: Разраб  
Дата: 21.07.23 01:45
Оценка:
Здравствуйте, pagid_, Вы писали:

_>Здравствуйте, Разраб, Вы писали:


Р>>Замерял вывод 1млн интов.

Р>>питон(!) быстрее печатает.
Р>>кресты вообще в несколько раз быстрее через cout << x << endl чем релизный код на .net8

_>Перенаправлять вывод в файл пробовал, сравнивал результат?


запускал по ssh (.net8 publish release)
console на экран 31 сек, в файл 11
streamwriter на экран 5 сек, в файл 0.5
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.07.23 07:34
Оценка:
Здравствуйте, Разраб, Вы писали:

_>>Перенаправлять вывод в файл пробовал, сравнивал результат?


Р>запускал по ssh (.net8 publish release)

Р>console на экран 31 сек, в файл 11
Р>streamwriter на экран 5 сек, в файл 0.5
Наверное рендеринг шрифтов, несколько более долгая операция чем просто посылка байтов в буффер
и солнце б утром не вставало, когда бы не было меня
Re[4]: C# почему Console.WriteLine медленный?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 21.07.23 08:27
Оценка: 4 (3)
Здравствуйте, Serginio1, Вы писали:

S> Наверное рендеринг шрифтов, несколько более долгая операция чем просто посылка байтов в буффер

Вообще, как-то несколько лет назад всплывало обсуждение, что команда Windows признала, что их реализация консоли очень медленная (и кстати, я после этого начал замечать, что если программа выводит очень много в консоль, то стоит свернуть окно консоли и скорость работы может возрасти кратно!)
Они тогда объяснили тем, что консолью никто особо не планировал пользоваться в режиме массового вывода (как в том же Linux) и потому задачи оптимизации никогда не ставилось.
А несколько лет назад это стало уже критичным (там всякие пошли Core Server, облака, ... ) и за задачу взялись.
Но, как я понял, совместимость всё же пришлось оставить и некоторые софтины переключаются туда https://learn.microsoft.com/en-us/windows/console/legacymode

Впрочем, не исключаю, что и для новой консоли разница между выводом на экран и записью в файл может быть заметной.
Отредактировано 21.07.2023 8:42 Михаил Романов . Предыдущая версия .
Re[5]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.07.23 08:45
Оценка:
Здравствуйте, Михаил Романов, Вы писали:


S>> Наверное рендеринг шрифтов, несколько более долгая операция чем просто посылка байтов в буффер

МР>Вообще, как-то несколько лет назад всплывало обсуждение, что команда Windows признала, что их реализация консоли очень медленная (и кстати, я после этого начал замечать что если программа выводит очень много в консоль, то стоит свернуть окно консоли и скорость работы может возрасти кратно!)
Ну это понятно. Если окно не видно, то нафиг его и рендерить. Там же не только вывод строки, но и смещение экрана.
Тут можно посмотреть вывод не одного сообщения, а буфер например 10 кб и по времени если в буфере есть данные, но какое то время не было сообщений
и солнце б утром не вставало, когда бы не было меня
Re[5]: C# почему Console.WriteLine медленный?
От: CreatorCray  
Дата: 21.07.23 09:32
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Но, как я понял, совместимость всё же пришлось оставить и некоторые софтины переключаются туда https://learn.microsoft.com/en-us/windows/console/legacymode

Я переключил system-wide на старую ибо глюки "новой" консоли в FAR мне не понравились категорически.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[6]: C# почему Console.WriteLine медленный?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 21.07.23 10:45
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Я переключил system-wide на старую ибо глюки "новой" консоли в FAR мне не понравились категорически.

А что именно за проблемы?
Я просто пользуюсь FAR и консоль включена новая (по крайне мере галочка "использовать legacy" не стоит), но никаких особо заметных проблем не вылезло.
Re: C# почему Console.WriteLine медленный?
От: syrompe  
Дата: 21.07.23 13:49
Оценка:
Быстрый консольный ввод на .NET
Re[7]: C# почему Console.WriteLine медленный?
От: CreatorCray  
Дата: 21.07.23 17:27
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

CC>>Я переключил system-wide на старую ибо глюки "новой" консоли в FAR мне не понравились категорически.

МР>А что именно за проблемы?
Я уже точно не помню, год назад было. Выключать обратно неохота, ибо это через ребут
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: C# почему Console.WriteLine медленный?
От: Ilya81  
Дата: 24.07.23 04:38
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Думается что дело в буферизации вывода внутри С/С++ рантайма vs вывод каждой строки отдельно.


Похоже на фирменный стиль mircosoft, в WPF они тоже решили отправлять в видеопамять каждый widget при каждом изменении по отдельности, т. е. каждый раз устанавливая блокировку заново. Причём всё так и оставляют навсегда, покуда их очередное творение совсем не вымрет.
Re[4]: C# почему Console.WriteLine медленный?
От: peiv Россия  
Дата: 24.07.23 10:27
Оценка:
K>Читаешь быстрее, чем C# выводит в консоль?
K>Или печатаешь всё подряд для солидности, т.к. в линуксах так все делают?


Передаешь другой консольной утилите на вход.
Re[5]: C# почему Console.WriteLine медленный?
От: pagid_ Россия  
Дата: 24.07.23 10:55
Оценка:
Здравствуйте, peiv, Вы писали:

P>

P>Передаешь другой консольной утилите на вход.
Но жалуешься при этом на именно на скорость вывода на экран
Re[6]: C# почему Console.WriteLine медленный?
От: Разраб  
Дата: 24.07.23 12:56
Оценка:
Здравствуйте, pagid_, Вы писали:

_>Здравствуйте, peiv, Вы писали:


P>>

P>>Передаешь другой консольной утилите на вход.
_>Но жалуешься при этом на именно на скорость вывода на экран

Причем тут экран? вот результаты тестов 8 корки:
console на экран 31 сек, в файл > 11
streamwriter на экран 5 сек, в файл > 0.5

консоль в 20(!) раз медленнее стрима даже в пайплайне
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: C# почему Console.WriteLine медленный?
От: vsb Казахстан  
Дата: 24.07.23 14:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>> Наверное рендеринг шрифтов, несколько более долгая операция чем просто посылка байтов в буффер

МР>>Вообще, как-то несколько лет назад всплывало обсуждение, что команда Windows признала, что их реализация консоли очень медленная (и кстати, я после этого начал замечать что если программа выводит очень много в консоль, то стоит свернуть окно консоли и скорость работы может возрасти кратно!)
S> Ну это понятно. Если окно не видно, то нафиг его и рендерить. Там же не только вывод строки, но и смещение экрана.
S> Тут можно посмотреть вывод не одного сообщения, а буфер например 10 кб и по времени если в буфере есть данные, но какое то время не было сообщений

Просто надо делать адекватную архитектуру.

Буфер это одно. К отрисовке он вообще не должен никакого отношения иметь. Программа просто пишет в кольцевой буфер что хочет. Скорость ограничена только скоростью оперативной памяти.

Отрисовка консоли это другое. 60 раз в секунду (или какая там частота экрана у юзера) — брать видимую часть из буфера и отрисовывать её.

В итоге накладных расходов будет около нуля, а юзер получит идеальную скорость отрисовки.
Re[7]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.23 15:07
Оценка:
Здравствуйте, vsb, Вы писали:

S>>>> Наверное рендеринг шрифтов, несколько более долгая операция чем просто посылка байтов в буффер

МР>>>Вообще, как-то несколько лет назад всплывало обсуждение, что команда Windows признала, что их реализация консоли очень медленная (и кстати, я после этого начал замечать что если программа выводит очень много в консоль, то стоит свернуть окно консоли и скорость работы может возрасти кратно!)
S>> Ну это понятно. Если окно не видно, то нафиг его и рендерить. Там же не только вывод строки, но и смещение экрана.
S>> Тут можно посмотреть вывод не одного сообщения, а буфер например 10 кб и по времени если в буфере есть данные, но какое то время не было сообщений

vsb>Просто надо делать адекватную архитектуру.


vsb>Буфер это одно. К отрисовке он вообще не должен никакого отношения иметь. Программа просто пишет в кольцевой буфер что хочет. Скорость ограничена только скоростью оперативной памяти.


vsb>Отрисовка консоли это другое. 60 раз в секунду (или какая там частота экрана у юзера) — брать видимую часть из буфера и отрисовывать её.


vsb>В итоге накладных расходов будет около нуля, а юзер получит идеальную скорость отрисовки.

Ну самому то несложно сделать буферизацию. Но консоль то нужна, для того что бы оперативно читать, если скорость отрисовки выше скорости чтения, то зачем вообще выводить на консоль?
и солнце б утром не вставало, когда бы не было меня
Re[8]: C# почему Console.WriteLine медленный?
От: vsb Казахстан  
Дата: 24.07.23 15:14
Оценка:
Здравствуйте, Serginio1, Вы писали:

vsb>>В итоге накладных расходов будет около нуля, а юзер получит идеальную скорость отрисовки.

S> Ну самому то несложно сделать буферизацию.

Я про то, как она должна быть сделана в системе, чтобы не нужно было сворачивать cmd.exe для ускорения работы программы (про этот эффект я сам в курсе).

S> Но консоль то нужна, для того что бы оперативно читать, если скорость отрисовки выше скорости чтения, то зачем вообще выводить на консоль?


Хотят и выводят, законом не запрещено. 99.(9)% логов никто никогда не прочитает. Но их всё равно выводят, хранят и индексируют.
Re[9]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.23 15:28
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Хотят и выводят, законом не запрещено. 99.(9)% логов никто никогда не прочитает. Но их всё равно выводят, хранят и индексируют.

Выводят, но не на экран! А только для дальнейшего поиска ошибок, предупреждений итд.
Выводить на экран миллион сообщений, и жаловаться, что медленно это ...
То есть использовать консоль для отладки в современных средствах разработки это какой то атавизм на заре программирования. Помню в том, же турбо-паскале уже консолями не пользовались
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.07.2023 15:31 Serginio1 . Предыдущая версия .
Re[10]: C# почему Console.WriteLine медленный?
От: vsb Казахстан  
Дата: 24.07.23 15:37
Оценка:
Здравствуйте, Serginio1, Вы писали:

vsb>>Хотят и выводят, законом не запрещено. 99.(9)% логов никто никогда не прочитает. Но их всё равно выводят, хранят и индексируют.

S> Выводят, но не на экран! А только для дальнейшего поиска ошибок, предупреждений итд.

В современных приложениях логи выводятся в stdout. При правильном деплое — да, конечно это всё перенаправляется в файлы и тд. Но если ты в процессе разработки просто запускаешь приложение, то логи выводятся на экран.

S> Выводить на экран миллион сообщений, и жаловаться, что медленно это ...


Это норма. Человек рассчитывает на оптимальную реализацию фундаментальных API.

S> То есть использовать консоль для отладки в современных средствах разработки это какой то атавизм на заре программирования. Помню в том, же турбо-паскале уже консолями не пользовались


Нет, это не атавизм, это норма.
Re[11]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.23 18:12
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>>>Хотят и выводят, законом не запрещено. 99.(9)% логов никто никогда не прочитает. Но их всё равно выводят, хранят и индексируют.

S>> Выводят, но не на экран! А только для дальнейшего поиска ошибок, предупреждений итд.

vsb>В современных приложениях логи выводятся в stdout. При правильном деплое — да, конечно это всё перенаправляется в файлы и тд. Но если ты в процессе разработки просто запускаешь приложение, то логи выводятся на экран.

Ну да, что бы посмотреть результат! Который занимает максимум 10 строчек.

S>> Выводить на экран миллион сообщений, и жаловаться, что медленно это ...


vsb>Это норма. Человек рассчитывает на оптимальную реализацию фундаментальных API.

Это не норма. Это идиотизм! Нахрена миллион строк?

S>> То есть использовать консоль для отладки в современных средствах разработки это какой то атавизм на заре программирования. Помню в том, же турбо-паскале уже консолями не пользовались


vsb>Нет, это не атавизм, это норма.

Для кого? Я не пользуюсь для отладки консолью с миллионами строк!
Не нужно. Это идиотизм!
Опять, же даже для вывода в лог выводят не все сообщения, а по филтрам. И фильтров таких большое количество (информация, предупреждения, ошибки итд)
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.07.2023 18:27 Serginio1 . Предыдущая версия .
Re[11]: C# почему Console.WriteLine медленный?
От: CreatorCray  
Дата: 24.07.23 18:45
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>Это норма. Человек рассчитывает на оптимальную реализацию фундаментальных API.

Фундаментальный API как раз работает как надо — каждый вывод гарантирует что ты эту строку увидишь даже если твоя аппа упадёт мордой об стол сразу после.
Это с кэшированными постоянная проблема с необходимостью вручную делать flush чтоб добиться таких же гарантий.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[12]: C# почему Console.WriteLine медленный?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.23 19:50
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, vsb, Вы писали:


vsb>>Это норма. Человек рассчитывает на оптимальную реализацию фундаментальных API.

CC>Фундаментальный API как раз работает как надо — каждый вывод гарантирует что ты эту строку увидишь даже если твоя аппа упадёт мордой об стол сразу после.
CC>Это с кэшированными постоянная проблема с необходимостью вручную делать flush чтоб добиться таких же гарантий.
Ну как я раньше писал, нужно надеяться не на кэш, а на задержку между сообщениями.
Но консоль то как раз и интересна тем, что за выводом экрана можно визуально следить.
и солнце б утром не вставало, когда бы не было меня
Re[7]: C# почему Console.WriteLine медленный?
От: pagid_ Россия  
Дата: 24.07.23 20:48
Оценка: +1 :)
Здравствуйте, Разраб, Вы писали:

Р>консоль в 20(!) раз медленнее стрима даже в пайплайне

Ну просто считай что вне unix/linux мира передавать такие объемы информации через перенаправление вывода моветон. И никто и никогда не парился по поводу скорости. Да и мало ли на каких отдельных операциях Net медленнее Си/С++ в десяток раз, не новость это.
Отредактировано 25.07.2023 6:42 pagid_ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.