До 262144 итераций разница во времени минимальна, но на 1000000 итераций она уже составляет 38%!
А то что в таблице результатов все что меньше 1000000 выигрывает BadStruct как-то объясняется или мы просто считаем, что это равный результат, отличающийся не более чем на погрешность измерений?
Спасибо. Вот этот ответ, на самом деле, для меня много прояснил. В целом получается если я знаю, где у меня hot path, который над оптимизировать, я уже сразу могу расставлять точки и смотреть трассировки.
Я просто не понимаю как интерпретировать результаты семлпирования. По сути просто посмотреть на те функции, которые дольше всех выполняются, и прикинуть, должны ли они выполняться быстрее? А дальше уже инструментированием разбираться конкретнее, на что и в каких пропорциях тратится время?
А есть какой-то гайд по профилированию приложений (или это он и был)? Опишу кейс. У меня приложение - пример использования библиотеки, которую я делаю. Оно запускается, делает бизнес логику, завершается. На все около 1 секунды на моем железе. Там внутри установка подключения к серверу, формирование пакетов, шифрование, отправка, получение, дешифрование, парсинг пакетов, пакеты разные, отправляются и принимаются параллельно, основная логика в одном потоке, но есть еще парочка дополнительных. Как выбирать чем, что и как профилировать? Раньше, на прошлой работе, использовал tracy для гуи приложения. Мне в целом хватало просто пройтись по записанным функциям и посмотреть, что сколько занимает, потом добавить детализации и посмотреть где именно тратится время. Тут часто ошибался, с тем, что менял одновременно и код, и добавлял точки для сбора трейсов, получалось, что время увеличивалось, хотя ожидал, что оно уменьшится. Для меня это все еще самый очевидный подход, но он кажется трудоемким и сложно повторяемым.
а я правильно понял, что генератор тут это i / 0x8a010_fmt ? А свои генераторы можно/легко писать? Если мне надо сконкатенировать со строкой например вектор моих типов каких-то?
А какие проблемы если для них всех оно выглядит как TCP? Просто не шлет повторы и не ждет ACK. Сами ACK кстати можно отправлять, чтобы еще меньше палиться.
Главная проблема тормозов в классическом подходе «устойчивых» протоколов - они обертывают VPN-данные в TCP-соединение и мимикрируют под HTTPS. Выглядит это в итоге как обычный веб-трафик, но TCP добавляет проблем со своим обязательным подтверждением доставки пакетов. При таком подходе, при потере одного пакета встаёт вся очередь пакетов, что приводит к классическому head-of-line blocking, жутко замедляя соединение.
А если уж VPN под что-то мимикрирует. То можно и под TCP мимикрировать? То есть сделать протокол, который в заголовках выглядит как TCP, но ведет себя как UDP?
Да, будет косвенный вызов через vtable. Да, это наносекунды.
Но в приведенном примере еще и аллокация ведь, а это точно больше чем вызов через vtable. Но вообще мысль то правильная. Избегать мономорфизации если оно прям сильно не нужно.
И более того - дома резервнй канал через LTE они тоже доступны, даже в режимах ограничений! А вот на даче в соседнем регионе такой же микротик с LTE (есть версия, что провайдеры дают поблажки стационарным точккам которые относятся к модемам по IMEI и не мигрируют между БС) и там уже все печально.
Как сейчас принято говорить, то что у вас что-то работает, это не ваши заслуги, а их недоработки.
Так понятно, что забугор будут блочить. А по РФ то они должны работать, их ведь и компании всякие используют. Или когда белые списки включают, то и все остальные протоколы блочат?
Для ТСПУ это выглядит как обычный обмен данными между двумя серверами, который фильтруется гораздо слабее, чем прямой «заход» юзера на иностранный хостинг
А можно тогда у себя на роутере использовать что-то древнее, а не то что не блокируют? Например l2tp? А уже с моста пусть выходит vless.
Дело в том, что S — это результат математической операции, и использовать его «как есть» в качестве ключа небезопасно.
S мы можем получить, только если как-то утекли приватные ключи или как-то взломали сам алгоритм. А если у нас уже есть S, то мы точно так же можем применить KDF и получить нужные сессионные ключи. Тогда какая разница?
не сказано, что это погрешность. По графику не видно, а в таблице видно, что
BadStructстабильно выигрывает до 1000000.А то что в таблице результатов все что меньше
1000000выигрываетBadStructкак-то объясняется или мы просто считаем, что это равный результат, отличающийся не более чем на погрешность измерений?Спасибо. Вот этот ответ, на самом деле, для меня много прояснил.
В целом получается если я знаю, где у меня hot path, который над оптимизировать, я уже сразу могу расставлять точки и смотреть трассировки.
Я просто не понимаю как интерпретировать результаты семлпирования. По сути просто посмотреть на те функции, которые дольше всех выполняются, и прикинуть, должны ли они выполняться быстрее?
А дальше уже инструментированием разбираться конкретнее, на что и в каких пропорциях тратится время?
https://github.com/VerySleepy/verysleepy - что-то для windows. Для linux есть perf, который делает то же самое?
А есть какой-то гайд по профилированию приложений (или это он и был)?
Опишу кейс. У меня приложение - пример использования библиотеки, которую я делаю. Оно запускается, делает бизнес логику, завершается. На все около 1 секунды на моем железе. Там внутри установка подключения к серверу, формирование пакетов, шифрование, отправка, получение, дешифрование, парсинг пакетов, пакеты разные, отправляются и принимаются параллельно, основная логика в одном потоке, но есть еще парочка дополнительных. Как выбирать чем, что и как профилировать?
Раньше, на прошлой работе, использовал tracy для гуи приложения. Мне в целом хватало просто пройтись по записанным функциям и посмотреть, что сколько занимает, потом добавить детализации и посмотреть где именно тратится время. Тут часто ошибался, с тем, что менял одновременно и код, и добавлял точки для сбора трейсов, получалось, что время увеличивалось, хотя ожидал, что оно уменьшится.
Для меня это все еще самый очевидный подход, но он кажется трудоемким и сложно повторяемым.
ну а вообще со встройкой есть смысл пробовать, Может дальше пойдут такие вычисления, что нет смысла даже пытаться?
А если у меня встройка AMD на ноутбуке, есть смысл пробовать что-то по этому циклу?
Ну в таких условиях удаленка изначально не применима, а значит нечего и отменять.
а я правильно понял, что генератор тут это i / 0x8a010_fmt ? А свои генераторы можно/легко писать? Если мне надо сконкатенировать со строкой например вектор моих типов каких-то?
А какие проблемы если для них всех оно выглядит как TCP?
Просто не шлет повторы и не ждет ACK. Сами ACK кстати можно отправлять, чтобы еще меньше палиться.
У меня вопрос.
А если уж VPN под что-то мимикрирует. То можно и под TCP мимикрировать? То есть сделать протокол, который в заголовках выглядит как TCP, но ведет себя как UDP?
Но в приведенном примере еще и аллокация ведь, а это точно больше чем вызов через vtable.
Но вообще мысль то правильная.
Избегать мономорфизации если оно прям сильно не нужно.
Но они же не в белых списках.
Как сейчас принято говорить, то что у вас что-то работает, это не ваши заслуги, а их недоработки.
Так понятно, что забугор будут блочить. А по РФ то они должны работать, их ведь и компании всякие используют. Или когда белые списки включают, то и все остальные протоколы блочат?
А можно тогда у себя на роутере использовать что-то древнее, а не то что не блокируют? Например l2tp? А уже с моста пусть выходит vless.
Вообще звучит здорово. Я бы даже сказал благородно.
А как перетянуть аудиторию из сегодняшних соцсетей?
Я сюда как раз пришел, потому что искал про perf в интернетах
а разве клавиатура должна появится не в драйверах? Или это только для теста прерываний?
Таки почему 17, а не 23?
Я вот этот момент никогда понять не мог
S мы можем получить, только если как-то утекли приватные ключи или как-то взломали сам алгоритм. А если у нас уже есть S, то мы точно так же можем применить KDF и получить нужные сессионные ключи. Тогда какая разница?