Dr. Friedrich
Просто индексы передавай разные по твоему массиву, не?
Vasily
Ну вот ща так и делаю
Vasily
Но
Vasily
Выглядит это кривовато
Dr. Friedrich
А где аллокации, от которых ты хочешь избавиться?
Hog
Просто индексы передавай разные по твоему массиву, не?
не - он хочет перетасовать байты в нужном порядке и "замапить" на int[]
Vasily
Просто мне по-любому массив переворачивать
Dr. Friedrich
А я бы все инты прочитал как есть, а потом на них цикол натравил IPAddress.HostToNetwork
Dr. Friedrich
То на то и выйдет!
Vasily
На чтении инта/лонга
Dr. Friedrich
Смотри чо
Dr. Friedrich
Два подряд идущих шорта в LE это одно
Dr. Friedrich
А два шорта в BE, которые потом перевернули в LE — это другое
Vasily
Вводную часть можно было и опустить, я в теме
Dr. Friedrich
Еще бы не забыть BitConverter.IsLittleEndian
IPAddress.HostToNetwork/NetworkToHost уже всё за тебя знают
Dr. Friedrich
Кое-на-каких системах они no-op, ясное дело.
Dr. Friedrich
В жаве у байтового буфера более удобный апи с этой точки зрения, кстати.
Vasily
Ну вот у меня с той стороны скальный сервак
Dr. Friedrich
Выглядит как кандидат в пайпы
На самом деле да. В каком они состоянии? Я знаю про превосходный апи, но какие у него есть реализации?
Vasily
Выглядит как кандидат в пайпы
Обошелся MemoryStream с нужной capacity
Dr. Friedrich
Обошелся MemoryStream с нужной capacity
Ну это уже алокейшен
Vasily
Из пайпов поюзал Pipelines.Sockets.Unofficial
Roman
Из пайпов поюзал Pipelines.Sockets.Unofficial
Вроде в 3 коре кестрел собирались на пайпы пересаживать
Dr. Friedrich
Вроде в 3 коре кестрел собирались на пайпы пересаживать
Интересно, что у них получилось, третий кор-то уже не за горами.
Vasily
Ну и сходу не нашел, как мне на пайпах наговнякать условия разделения сообщений
Dr. Friedrich
А мб и не пересадили - я не смотрел
Ну я тоже помню, что Дэвид собирался.
Vasily
Т.е. есть пайп, куда валится всякое из канала
Vasily
А дальше из него надо читать только готовые сообщения, т.е. длина+блоб
Roman
Ну и сходу не нашел, как мне на пайпах наговнякать условия разделения сообщений
https://devblogs.microsoft.com/dotnet/system-io-pipelines-high-performance-io-in-net/#user-content-tcp-server-with-systemiopipelines
Vasily
Ну у меня пайпами уже из канала читаются куски данных
Vasily
НО
Vasily
Пайпы не помогают их склеить
Roman
В PipeReader поидее всё это должно происходить
Roman
Ну склейка
Vasily
Предлагаешь своего написать?
Roman
Обёртку сделать поверх
Vasily
Ну я так и сделал
Roman
Ну я так и сделал
Там сниппет довольно вменяемый
Roman
Т.е. они скипают обработку буфера до тех пор, пока /n не встретят
Roman
и набивают буфер
Roman
без лишних аллокаций
Vasily
Ну у меня к сожалению, не /n
Vasily
А чуть сложнее логика
Roman
Ну всё равно как-то сообщения же разделяются
Vasily
Длина+блоб
Vasily
И это может идти сплошным потоком
Roman
Например, получили первый месседж, прочитали длину и вычитываем буфер на длину, которая в начале пришла.
Roman
Потом этот буфер отдаём на обработку
Roman
И начинаем читать новый меседж
Vasily
И как же нам вычитать буфер на нужную длину?
Vasily
С учетом, что может еще придти кусок от следующего сообщения
Vasily
tcp
Vasily
Но сообщения могут быть длинными
Roman
А ты просто читаешь первые сколько то байт, чтобы из первого сообщения длину запарсить.
Vasily
Ye lf
Roman
А потом собираешь из сегментов буфер свой
Vasily
Угу
Vasily
Только вопрос
Roman
Пока длина не наберётся нужная
Vasily
Вот есть набор сегментов
Roman
Как набрали, всё что дальше - считается новым сообщением
Vasily
Что делать, когда сегмент надо разбить?
Roman
там же есть в примере всё
Ayrat
я бы считывал фреймы в ArrayPool и набивал бы на стеке массив референсов на эти массивы, потом как встречу разделитель сообщения, склеивал бы массивы в месаджи, освобождал кусочки массивов и начинал заново
Vasily
Я просто смотрю на этот ебанутый ReadOnlySequence
Vasily
И нихуя не понимаю
Klei
Увидел сочетание кастомный стол, стало интересн. Тем более если работаешь стоя
Функционально это обычный стол. Но сделан сермяжно, из нехипстерского железа, высотой 125+ см и увесистой столешницей 85+*175+.
Vasily
Наверное, я старый
Roman
Я просто смотрю на этот ебанутый ReadOnlySequence
Ну дык тебе райтер в пайп последовательность из Memory<byte> пихает
Roman
Логично что он ридонли
Roman
Вернее мы у него берём этот Memory<byte>, пишем в него что то, а потом говорим сколько именно данных мы туда записали
Vasily
Допустим