[хочу всё знать] Бинарные протоколы для мобильных клиентов

psm-home

Сейчас модно для общения клиентов с сервером использовать HTTP протокол с JSON (иногда XML) в качестве полезной нагрузки.
Насколько для мобильных клиентов имеет смысл использовать вместо JSON/XML что-нибудь более компактное и быстро разбираемое?
Например protobuf/thrift/msgpack из нового, или, прости господи, asn1.
Кто-нибудь сравнивал количественно, стоит оно того?
JSON обычно используют schemaless, а вышеупомянутые бинарные аналоги все используют схему. Для протокола обмена с мобильным клиентом наличие схемы скорее хорошо или скорее плохо?

kokoc88

protobuf
Использую для всего, но под .NET - это одно из самых быстрых решений с достаточно компактным форматом. Версии под Java кажутся не очень удобными из-за конфигов, но я не искал библиотеки, где можно конфигурировать аннотациями. Версия под .NET не падает при расхождении схемы, так что с обновлением протокола проблем практически нет.

pilot

А что, архивирование json/xml на уровне http уже отменили?

kill-still

На распарсивание JSON время тратится, ты ещё на разархивирование хочешь тратить? :)

pilot

Не хочу, оно уже тратится нлрмальным браузером.
Сколько времени, кстати, тратится и сколько хочешь сэкономить?

istran

 
А что, архивирование json/xml на уровне http уже отменили?
Выигрыша в размере действительно не будет. Но вот по скорости парсинга протобуф выигрывает на порядок.
UPD: изменил ссылку file:// на нормальную.

kill-still

Ну, если каждую секунду войну и мир туда-сюда слать, то нормальный выигрыш будет. :grin:

psm-home

А что, архивирование json/xml на уровне http уже отменили?
Ты про gzip? Его использование подразумевается, конечно. Все равно нагуглилась разница с protobuf ~30% по размеру.

pilot

Очевидно что gzip+json - слишком универсальные штуки и можно их ускорить. И как, 30% имеет смысл?
Улучшение даже не на порядок. Эти копейки имеют смысл при большом трафике или большой нагрузке и не в первую очередь.

kill-still

Это размер. А скорость распарсивания там поболе выигрыш будет.

kokoc88

И как, 30% имеет смысл?
На мобильных платформах - имеет, и ещё какой.

pilot

Почему?

kokoc88

Почему?
Странный вопрос. Потому что на мобильниках медленная и часто мигающая связь, медленные процессоры, и куча других проблем.

pilot

Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.

kokoc88

Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.
Странный ответ на нормальный ответ. Я так понимаю, ты сейчас занимаешься своим стандартным действием - с умным видом троллишь, не читая то, что пишут в тредике?
Все равно нагуглилась разница с protobuf ~30% по размеру.
И как, 30% имеет смысл?
На мобильных платформах - имеет, и ещё какой.

artimon

http://events.yandex.ru/lib/talks/1562/
Посмотри, очень познавательно.
Видео длинное, но хотя бы презентацию глянь, там очень показательно про байтики.

pilot

Пока что не читал ты, и после "и еще какой" опять не можешь ответить на вопрос "так какой?"

psm-home

Спасибо за ссылку, интересно. Прямо книжка High Performance Browser Networking в кратком изложении.

pilot

Да, посмотрел, там есть и про байтики, но нет ничего про protobuf vs gzip и когда это нужно.
там есть ровно то что я говорю: gzip работает неплохо, есть и другие оптимизации в других местах обработки запросов.
Сырой html против gzip = разница в 10 раз, gzip vs protobuf - разница на 30%, зато надо с ним еще уметь работать. Нахрена - неясно.

kill-still

Ой, а я её знаю. Точнее знаю её сестру младшую. :shy:

kokoc88

Пока что не читал ты, и после "и еще какой" опять не можешь ответить на вопрос "так какой?"
На вопрос, почему для мобильных устройств важен выигрыш в размере данных в 30%, я ответил. Понимаю, что ты совсем не умеешь признавать свою неправоту. Но ты хотя бы помолчал, если уж так открыто слился, не уловив суть дискуссии.

pilot

Ссылку дай плз.

kokoc88

Ссылку дай плз.

pilot

Не нашел там ни одной циферки, только твои фантазии :o
сколько мс экономят твои фантазии?

okis

о каких клиентах идет речь?
я слышал, что мобильные клиенты некоторых мессенджеров используют протокол на основе XMPP (стансы могут быть бинарными с шифрованием, сжатие применяют изредка.

kokoc88

Не нашел там ни одной циферки, только твои фантазии
сколько мс экономят твои фантазии?
OK, давай поиграем в тупого , циферки нагуглил и привёл yanus:
Все равно нагуглилась разница с protobuf ~30% по размеру.
Ты спросил, имеют ли эти циферки смысл:
И как, 30% имеет смысл?
Я ответил, что имеют:
На мобильных платформах - имеет, и ещё какой.
Ты спросил, почему?
Я ответил:
Потому что на мобильниках медленная и часто мигающая связь, медленные процессоры, и куча других проблем.

на мобильниках медленная и часто мигающая связь

медленная и часто мигающая связь

pilot

Только в тупого майка: так сколько мс экономят твои фантазии? Сколько это процентов времени обработки запроса?
Зы: Ссылочку от lynn почитай для самообразования, а не тупи.

kokoc88

Только в тупого майка: так сколько мс экономят твои фантазии? Сколько это процентов времени обработки запроса?
Фантазии тупого экономят 0% времени обработки запроса. Потому что в этих фантазиях нет ничего о цифрах по времени обработки запроса. Потому что эти фантазии были в ответ на сообщение yanus:
Все равно нагуглилась разница с protobuf ~30% по размеру.

разница с protobuf ~30% по размеру.

~30% по размеру

по размеру
размеру

pilot

Совсем упоролся? (
Ну ок, хорошо, если дело не в скорости, так расскажи циферки про размер, нахрена нужно экономить 30%. Прям из тебя клещами надо тянуть чо ты там имел в виду под "еще какой".

kill-still

Вы задрали. Нет бы Марину обсудить - нет, им важнее посраться. :facepalm:

kokoc88

Совсем упоролся? (
Да, ты совсем упоролся.
нахрена нужно экономить 30%
Предлагаю тебе рекурсивно перейти на ссылку

pilot

Гнобить майка - давняя традиция :o

pilot

Там опять нет циферок о том нахрена это надо. Не тупи.

kill-still

Пока что гнобят тебя. :p (имхо)

kokoc88

Гнобить майка - давняя традиция
В твоём случае традиция скорее в том, чтобы слиться на попытке кого-то загнобить. Но, да, она древняя.

kokoc88

Там опять нет циферок о том нахрена это надо. Не тупи.
Там и не должно быть циферок. Не тупи. Если уж сделал глупую ошибку, не прочитав сообщения в тредике, то хотя бы просто помолчи.

kokoc88

Вы задрали. Нет бы Марину обсудить - нет, им важнее посраться.
Волосы в ванной Марину мы могли бы обсудить в Love&Sex, чё. :)

pilot

Зачем молчать-то? Твои бредовые фантазии будут казаться разумным ответом, не интересно, да и баттхерт твой неплох. :o

psm-home

о каких клиентах идет речь?
Нативные мобильные приложения. Например, Киви кошелек или мобильный кошелек Тинькова.

kokoc88

Зачем молчать-то? Твои бредовые фантазии будут казаться разумным ответом, не интересно, да и баттхерт твой неплох.
Со стиля "тупой " ты перешёл на стиль "закидаю какашками". Но зачем? Просто напиши, что ты был не прав, я даже плюсик тебе поставлю.

pilot

Да где блин неправ-то? Я вообще ничего не утверждал, только спросил что же улучшится и насколько.
Ты привел левые циферки про размер, которые юзверю и серверу вообще говоря до лампочки.
Почитай презентацию lynn - там девица хоть какие-то оценки типичные дать пытается, ты же весь тред только ноешь.

okis

можно попробовать послушать их трафик каким-нибудь http://www.charlesproxy.com/
скорее всего, правда, он будет зашифрованным, но можно будет например понять, что это https )
Наверняка это можно узнать только методами обратной инженерии

kokoc88

Да где блин неправ-то?
Так ты почитай тему. Может быть, сам поймёшь?
Я вообще ничего не утверждал, только спросил что же улучшится и насколько.
Конечно, ты не утверждал. Ты спросил, имеет ли смысл 30% экономии, не прочитав, что речь идёт о размере трафика. На что получил вполне вразумительный ответ, к которому в силу своей природы решил прикопаться, потроллить, но сел в лужу.

6yrop

Как пользователь почувствует эти 30%? Вроде, ты пишешь, что на времени отклика это не будет заметно. Как пользователь почувствует трафик? Он за трафик платит (я не пользуюсь мобильниками :grin: , только звоню)?

kill-still

девица
:mad: :mad:

kokoc88

Вроде, ты пишешь, что на времени отклика это не будет заметно.
Уточню. Я делал упор на том, что не будет заметно время обработки запроса. Время отклика, то есть получения ответа от сервера, вполне может сократиться на те же 30%. Кроме этого, да, бывают и провайдеры, которые берут деньги за трафик.
Вообще при разработке мобильного приложения лучше экономить на всём. Многие начинающие часто жалуются на "преждевременную оптимизацию", но им стоит вспомнить, какую оценку имело приложение Facebook в AppStore, и почему его в итоге полностью переписали.
Даже форум до сих пор имеет режим SL, несмотря на то, что странички вроде бы зипуются.

kill-still

Даже форум до сих пор имеет режим SL
Чтобы на работе не палиться же! :)

stm5872449

Время отклика, то есть получения ответа от сервера, вполне может сократиться на те же 30%.
Именно фаза получения ответа может быть в три раза меньше вроде, если из-за меньшего размера не пришлось делать лишний ack.

pilot

Это ты фантазируешь что так удачно размер странички подберется, правильно?
и то вроде как не в 3 раза.
Anyway, в итоге для пользователя насколько будет отличаться время?

pilot

Спасибо, а то у майка на меня аллергия и на этот вопрос мне он ответить никак не мог. )

kokoc88

Anyway, в итоге для пользователя насколько будет отличаться время?
А ты как думаешь, насколько в среднем отличается время отправки и получения данных, объём которых на 30% меньше?

pilot

На полпроцента

kill-still

30% от войны и мира это не в тапки срать! :umnik:

Dasar

А ты как думаешь, насколько в среднем отличается время отправки и получения данных, объём которых на 30% меньше?
Один из вариантов - не насколько, если оба размера умудряются влазить в один сетевой пакет.
ps
т.е., имхо, для ответа на этот вопрос важно вводить второй параметр - размер передаваемых данных за раз.

pilot

В среднем по больнице никто ж не пересылает войну и мир.

kokoc88

Один из вариантов - не насколько, если оба размера умудряются влазить в один сетевой пакет.
Ок, мне просто интересно, насколько по-твоему отличается время отправки и получения таких данных, если они влазят в один пакет?

kokoc88

На полпроцента
Почему?

pilot

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

kill-still

С чего ты взял? Взять вот хотя бы MMO/MOBA/FPS игры - они очень интенсивно с клиентом обмениваются.

stm5872449

Anyway, в итоге для пользователя насколько будет отличаться время?
До полусекунды для 3G.

pilot

С чего ты взял? Взять вот хотя бы MMO/MOBA/FPS игры - они очень интенсивно с клиентом обмениваются.
Мелкими порциями данных - да, нужно быстро обмениваться. Какая у ТС задача - непонятно, поэтому в начале треда я и простой вопрос.
99% мобильных приложений (насколько я понимаю) - совсем не такие игры.

Dasar

Ок, мне просто интересно, насколько по-твоему отличается время отправки и получения таких данных, если они влазят в один пакет?
Допустим размер данных 50 и 70 байт. Ответ мобильный клиент получит вместо 30мс (что уже только при очень хорошей связи) для 50 байт и за 30мс и 1мкс для 70 байт.

kill-still

Мобильные приложения тебе только как один из примеров того, где критичен язык обмена данными привели. Не надо только на нём зацикливаться.

kill-still

1мкс
wat?

pilot

Почему?
Это гипотеза. Пока ты не начал вредничать, я задавал вопрос без подтекста, мне было интересно какой процент времени для пользователя на этом экономится.
Нормальный ответ не-майка был бы такой: 99% мобильных приложений пересылают примерно по 400 байт раз в 5 минут, пересылка и парсинг данных во времени обработки запроса занимает 50%, если улучшим на 30% - будет на 17% быстрее. Пользователь этого никогда не заметит, лучше поискать другие узкие места.
Если ты майк, мог бы подставить свои циферки и получить другой вывод, не осилил.
Ответ на вопрос "почему":
1) потому что я неправильно ответил, думая про время реакции приложения для пользователя, а не только время пересылки данных,
2) при этом на большинстве данных разница будет не в 30% (30% это непонятное пока число - ссылку дали корявую, возможно это какие-то пограничные случаи)
Чуть выше были прикидки про 17%(например полпроцента маловато.

pilot

Мобильные приложения тебе только как один из примеров того, где критичен язык обмена данными привели. Не надо только на нём зацикливаться.
Из-за того что я не зациклен на мобильных приложениях, я в треде вопрос и задаю.
В реальном мире в рамблере была как раз такая история, как описана мной выше, где экономия на ускорении обработки какой-то части странички в 2 раза давала в результате полпроцента ускорения для пользователя, а разработчики носились с идеей оптимизации, рассказывая как она нас спасет.

Dasar

wat?
Столько уйдет на прокидывание лишних 20 байтов между уровнями кода и десериализацию.

pilot

До полусекунды для 3G.
Какое распределение?

kill-still

так и писал бы 30000мкс и 30001мкс

kokoc88

Допустим размер данных 50 и 70 байт. Ответ мобильный клиент получит вместо 30мс (что уже только при очень хорошей связи) для 50 байт и за 30мс и 1мкс для 70 байт.
Ты знаешь спецификацию конкретного аппаратного слоя или твои слова верны для любого?

kokoc88

Пока ты не начал вредничать, я задавал вопрос без подтекста
Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.

katrin2201

Json обычно тоже со схемой, просто менее явной (парсишь датабиндом в объект поэтому я бы не сказал, что в этом смысле есть большая разница.
Разница по цпу, как уже сказали, есть, причем значительная.
Особенно дорого парсинг из-за того, что надо матчить строки. Сериализацию же можно сделать довольно быструю, очень быструю если у вас везде fixed-sized поля.
Я бы, правда, сказал, что это все важно только на сервере обычно, потому что там каждый лишний процент цпу выливается в бабло на содержание лишнего сервера.
Гзип по этой же причине не оптимален почти всегда. Это очень старый алгоритм, который и цпу жрет и компрессии толком не дает. Берите что-нибудь более современное типа lz4.
Плюс, архивация и способ маршаллинга все же перпендикулярные вещи. Архивация жмет не только оверхед, но и контент. Так что если мы возьмем бинарный протокол с отдельными полями, которым нужно, пожатыми lz4, то это будет почти всегда лучше. Еще есть femtozip.
Мобильные клиенты последнее время достаточно быстрые, и не шлют много запросов, чтобы именно разница по цпу binary vs json становилась заметной. Конкретно на них важнее то, как ты с сокетами работаешь, из-за кривой связи в первую очередь.
Там нужно быстро детектить мертвые сокеты и быстро и прозрачно ретраить, но при этом отличать это от медленного сервера/связи, чтобы не зафлудить свою же инфраструтктуру. К сожалению, это очень нетривиальная задача.

kokoc88

Пользователь этого никогда не заметит
Очевидно, пользователя интересует момент, когда он давит на кнопку, а не какая-то абстрактная передача данных, которая происходит в фоне. Если об этом подумать, то становится ясно, что сокращение объёма передаваемых данных в условиях плохой связи будет иметь преимущества. Глупо топать ножкой и плакать о том, что нужны какие-то цифры, и что тебе ничего не понятно.
Что касается ответа не-, то уж лучше рассмотреть вопрос не-.

katrin2201

В реальном мире в рамблере была как раз такая история, как описана мной выше, где экономия на ускорении обработки какой-то части странички в 2 раза давала в результате полпроцента ускорения для пользователя, а разработчики носились с идеей оптимизации, рассказывая как она нас спасет.

В реальном мире из таких оптимизаций там и здесь и складывается в целом быстрая и производительная система. Если ты будешь ждать, что в какой-то момент, кто-то придет, и ткнет пальцем в 10 строк кода, и быстро и строго докажет (не переписывая что вот если это переписать так то, то получите ускорение в сотню попугаев, то ждать придется бесконечно.
В реальном мире ты сидишь и вдупляешь в профайлер. И вдупление в него, это такое полунаучное гадание на кофейной гуще, потому что он или семплит (причем криво) или слишком большой оверхед интродьюсит, или все сразу, и понять, что из того, что он показывает, действительно проблема - заранее почти невозможно.
Поэтому ты идешь, и как честная обезьянка переписываешь или отрезаешь на время профайлинга все вылезшие места. И каждое дает тебе микроскопический в целом выигрыш. Снова идешь в профайлер, там теперь новые места вылезли, снова переписываешь. И так через несколько итераций глядь, и количество выделяемой памяти с гигабайт в секунду упало до мегабайт в секунду, гц заткнулся и не вылазит, попугаи скакнули вверх, а в профайлере наконец-то, после облезания всей шелухи, вылезла часть, которая создает 50% общей нагрузки на цпу.

pilot

К идиллической картинке из первой половины поста допиши ограничения по срокам и ресурсам, и вот тогда получишь картинку из реального мира, в которой становтяся внезапно актуальны прикидки по приоритетности направлений раскопок. Если у вас таких ограничений нет - менеджеров надо перевешать на столбах, а программистам невысокого уровня простительно не думать о таких вещах.
В реальном мире ты сидишь и вдупляешь в профайлер. И вдупление в него, это такое полунаучное гадание на кофейной гуще, потому что он или семплит (причем криво) или слишком большой оверхед интродьюсит, или все сразу, и понять, что из того, что он показывает, действительно проблема - заранее почти невозможно.
Поэтому ты идешь, и как честная обезьянка переписываешь или отрезаешь на время профайлинга все вылезшие места. И каждое дает тебе микроскопический в целом выигрыш. Снова идешь в профайлер, там теперь новые места вылезли, снова переписываешь. И так через несколько итераций глядь, и количество выделяемой памяти с гигабайт в секунду упало до мегабайт в секунду, гц заткнулся и не вылазит, попугаи скакнули вверх, а в профайлере наконец-то, после облезания всей шелухи, вылезла часть, которая создает 50% общей нагрузки на цпу.

А пробуй еще мозги включать, окажется что профайлер не всегда нужен.
Вот в этом треде видим как майк сопротивляется включению у себя мозгов, прошлые с его участием были про то же - руки у него из плеч, а вот вместо головы - ж.

pilot

Одно и то же повторяешь весь тред, без цифирек не приходи больше. Даже девочка в презентации осилила эффект оценить, стыд и позор. :mad:

katrin2201

Так и получается софт не самой лучшей производительности, проблемы которого фиксятся в лучшем случае покупкой нового бокса (а чаще никак не фиксятся). Кроме того программисты в таких командах обычно не успевают развиваться, поэтому шансов вообще никаких.
Зато есть эффективный менеджер, который "успешно" разруливает "заебызатыки" разработчиков и быстро и дешево делает софт, который good enough.
Вообще, такая схема вполне живуча. И ты такой не один, вас таких много. Живут такие, к счастью, в небольших проектиках, там где действительно, думать не надо, а надо лабать-лабать-лабать. Когда такие распространяют это видение на весь остальной мир, конечно, остальной мир только снисходительно улыбается.
А совсем вообще, самые лучшие программисты просто научились это делать, пока "менеджер не видит". У меня есть живой пример человека, который просто раз в месяц-два проходит по коудбейзу вычищая то, что наговнокодили другие (включая внутренние инфраструктурные либы типа service framework). Могу даже привести результат в цифрах: этот человек переписал сервис, который раньше жил на ~200 боксах. Сейчас он живет на 12. При этом лейтенси p99 с ~300мс упало до <30мс.
Его уровень в иерархии, правда, таков, что над ним нету менеджера, который бы мог ему сказать, что надо фигачить фичу. Там, скорее, наоборот, если надо это он к менеджеру придет, и скажет - "какого вы тут нафигачили фич, сломав мой сервис?".
В некоторых реальных мирах, не сломать сервис, знаешь ли, важнее, когда каждая секунда аптайма этого сервиса тебе приносит примерно доллар. Важнее, чем нафигачить новую фичу в некий абстрактный срок, придуманный абстрактным эффективным менеджером (scientific wild-ass guess).
> А пробуй еще мозги включать, окажется что профайлер не всегда нужен.
Не всегда - да, сложно не согласиться. В коде размера и сложности рекурсивного фибоначчи, конечно, профайлер не нужен, чтобы найти проблему, кто бы сомневался.
В остальных случаях с ростом проекта заюзать профайлер становится гораздо быстрее "прочитать весь код и подумать". Мне кажется, это очевидно. Учитывая, что в множество кода, которое надо брать в расчет, входит, например, код вашей OS, то профайлер лучше практически since day 1.
Для наглядности - можешь, например, почитать, что такое interconnect и каким местом он участвует в cache coherency. Если осилишь, то сможешь на досуге подумать, каким образом без профайлера ты обнаружишь, что проблема в том, что твоя приложенька упирается в bandwidth этой шины. Я бы с интересом послушал твой рассказ. Если осилишь хотя бы заботать и осознать, в чем подвох, можешь собой смело гордиться.

podluchaya

Вообще говоря анализ перфоманса это отдельная профессия. В intel/мцст перф аналитики и инженеры разделены. И требовать от рядового инженера знание деталей работы CPU/mmu/GC/VM/компилятора/OS достаточно абсурдно. Тем более странно это требовать от джавера. Ну это просто совершенно разная по сути работа. Одни пишут код, другие хачат компиляторы, профилировщики, генерируют и просматривают килотонны трасс. Это совершенно разная по сути работа и мышление у аналитиков и кодеров различное.

kokoc88

И требовать от рядового инженера знание деталей работы CPU/mmu/GC/VM/компилятора/OS достаточно абсурдно. Тем более странно это требовать от джавера.
Есть разные способы повышать производительность системы, разные методы оптимизации. Если речь идёт о каком-нибудь процессе, который сжимает видеофайлы, то здесь можно требовать оптимизацию на уровне CPU и каких-то специальных знаний. Если речь идёт об оптимизации в целом, то от профессионального разработчика, даже на Java, вполне разумно требовать как минимум знания о GC, VM, OS и алгоритмической сложности. Может быть, это было бы абсурдно требовать от Junior, но в целом это далеко не отдельная профессия, а достаточно стандартная обязанность всех разработчиков.
Например, сократить объём трафика на 30%, по сути за копейки - вполне себе оптимизация, какой отдельной профессии она требует?

podluchaya

Ну выше речь зашла про пол процента, coherence protocols. А для того, чтобы это учитывать и разбираться <<почему>> оно работает, а не как, надо потратить много времени на забатывание всей этой мути и еще пару лет поработать перфомансником, ибо в этой области все очень эвристично. По хорошему, если есть необходимость в перфе, надо организовывать перфомансное тестирование. Асимптотики хорошо моделируют перф только в модели с универсальной памятью, стоимостью операций в клоках, с максимальным ipc == 1, без виртуальной памяти, инвалидаций, переключений контекста и на равномерно распределенном наборе данных. То есть в теории.

kokoc88

надо потратить много времени на забатывание всей этой мути и еще пару лет поработать перфомансником
Не думаю, что обязательно тратить столько времени, чтобы оптимизировать какую-нибудь высоконагруженную систему. Мы же не ведём речь о том, что вместо 10 серверов нам надо 5; а вместо 100 сделать 10 можно (если вообще можно) и без супертонких оптимизаций. Такой масштаб, скорее, означает какие-то более простые проблемы в коде и архитектуре.
В остальном профайлеры обычно вполне неплохо наводят на мысль о происходящем. Не вижу проблем в том, чтобы разработчик имел об этом представление. В общем случае я не вижу необходимости в отдельной должности. Видимо, приводил пример такого случая, когда просто посмотрев на код мы вряд ли найдём проблему даже через очень продолжительное время, то есть нам нужно запускать профайлер независимо от того, насколько хорошо работают мозги.

podluchaya

Профилировщик нужно использовать всегда. Вне завсисмости от того, как мозги работают. Единственное, инструментальные работают на основе Монте-Карло и могут врать, да и оверхед вносят. 300 мс это 3 секунды что-ли? Ад какой-то. Я, видимо, неправильно понял исходный мессэдж. Все вышесказанное мной относится к драке за микросекунды. А это только арбитражные роботы.

kill-still

300 мс это 3 секунды что-ли?
http://www.google.ru/search?q=300мс= :facepalm:

podluchaya

Ага, но все равно на 2 порядка больше. В любом случае, на этом уровне проблемы решаются без особой магии простой аналитикой.

katrin2201

Сейчас порядок у нас как раз милисекунды (latency avg 5ms, p50 2.5ms).
Микросекунды важны не всегда только уж в арбитражных роботах. В любом хот лупе на самом деле.
Пример из моей жизни: у нас в запросе обрабатывается порядка сотни сущностей в среднем. На каждую сущность нам надо сходить в некий индекс. При общем лейтенси в среднем 5мс можно на глазок прикинуть, сколько мкс может макс занимать один раз сходить в индекс. Потом поделить это пополам, потому что половина нашего лейтенси - сходить в ремоут кеш :)
Требовать от "рядовых" девелоперов многого, конечно, бесполезно. Я б не сказал только, что это прямо отдельная профессия. Отдельная профессия - это когда человек досконально знает архитектуру цпу или ос, и только ей и занимается.
И, собственно, один из моих поинтов был в том, что если у тебя есть профайлер, то достаточно знать хотя бы в общих чертах. А профайлер расскажет куда копать.
Ну и, как сказали выше, джаверу знать, что есть gc, что у него там дженерейшены есть, понимать какие операции для гц наиболее тяжелы, какие очень дешевы - надо (не в мире _Но_, конечно). Иначе количество ошибок в оценке прироста от оптимизации, описанное _Но_, будет стремиться к 100%.
Ну и чем дальше в лес, тем злее дятлы.
Про cache coherency неплохо б знать, хотя бы чтобы не распространять популярный ныне бред, что так как volatile это мемори барьер (это верно а мемори барьер это флаш кеша, то волатайл это очень дорого. Я видел умных людей, которые в своем коде принципиально не ставили волатайл, хотя и знали что он там нужен, именно по этой причине. Мол, и так сойдет, вероятность ошибки крайне низкая, зато быстро. Работало в принципе, только когда эти объекты без волатайлов начинали дергать из jmx консольки (отдельный сокетный тред) иногда случались всякие рандомные случайности. К счастью, в проде это делали очень редко.
И вообще про кеш надо знать, чтоб понимать, в чем квиксорт круче хипсорта.
Если ты начинаешь писать сетевое приложение, то для тебя, хоппа, и открывается занимательный мир tcp/ip stack и epoll/kqueue со всей его кровью и кишками.
Даже если ты "программист на джаве", который оперирует высокими материями, рано или поздно ты в это упрешься. Точнее, сначала упрешься в то замечательное месиво, которое сан/оракл наворотил поверх простого как пробка epoll. Отпилив его упрешься в сам epoll.
Ну итд.
Я не ожидаю, что один человек досконально будет разбираться во всем мной затронутом. Я досконально не разбираюсь, например. Досконально это имхо анриал.
Но я ожидаю, что если у человека возникнет проблема описанного выше уровня, то он не разведет ручками, а сообразит, куда копать.

6yrop

Ну и, как сказали выше, джаверу знать, что есть gc, что у него там дженерейшены есть, понимать какие операции для гц наиболее тяжелы, какие очень дешевы - надо (не в мире _Но_, конечно). Иначе количество ошибок в оценке прироста от оптимизации, описанное _Но_, будет стремиться к 100%.
А я вот на .NET программирую. :) Там до сих пор есть вот такая проблема. Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена. А рефлекшен писец как медленная вещь. И об этом мало кто знает. И фиксить походу не собираются. Всем пох. А ситуация то банальная — дженерик метод+лямбда и всё приплыли.
А ты про поколения GC говоришь, я вот сколько работаю они ни разу не понадобились, хотя на собеседованиях регулярно спрашивают. :)

katrin2201

поколения GC говоришь, я вот сколько работаю они ни разу не понадобились
Я не знаю, что тебе ответить на это, чтобы сильно не задеть. Но попробую.
Да, бывают ситуации, когда никому не интересно, что там с гц и как его вообще тюнить. Заключать из этого, что тюнить гц вообще никому никогда не должно быть нужно, вроде должно быть понятно, что не стоит.

6yrop

Заключать из этого, что тюнить гц вообще никому никогда не должно быть нужно
Конечно, тут не черное или белое.
А если очень надо, то можно многое чего. Вон для Фейсбука не влом было аж два раза переписать движок PHP.
Только сначала нужно найти кому это реально нужно. Ну или играться за чужой счет.

katrin2201

Только сначала нужно найти кому это реально нужно. Ну или играться за чужой счет.
Разумеется. Главное, чтобы не получалось так, как у меня сейчас, например: стандартными внутренними тулзами (а-ля мавен) наш проект в облаке собирается полчаса. У меня локально с моими хаками этих тулов 30 секунд.

luna89

Разумеется. Главное, чтобы не получалось так, как у меня сейчас, например: стандартными внутренними тулзами (а-ля мавен) наш проект в облаке собирается полчаса. У меня локально с моими хаками этих тулов 30 секунд.
Хороший пример по теме треда. IRL проги тормозят не потому что в них сериализация текстовая, а потому что они делают что-то невероятно тупое, типа по 10 раз одни и те же данные запрашивают. Чтобы такого не было, программа должна быть как можно более прозрачна, чему бинарная сериализация не способствует.

Dasar

Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена.
это не так.

katrin2201

Ну как сказать. Как один из степов, например, эти тулзы для каждого модуля парсят 10мегабайтный json файл. По два раза. Занимает это порядка секунды для каждого модуля.
Справедливости ради, после того, как ты начнешь это кешировать, выигрыш от бинарного формата вместо json не очень большой и локально практически не виден.
Но если взять в рассмотрение наше билд облако, наверное, только из-за одной этой штуки ежедневно мы в нем кипятим лишнюю бочку воды.
По поводу прозрачности\непрозрачности - плохое оправдание для бездействия. Тем более, что всегда можно завести два ендпоинта - один с бинарным форматом для прода, и второй такой же, но с хьюман ридбл json для дебага

pilot

выигрыш от бинарного формата вместо json не очень большой и локально практически не виден.
Тем более, что всегда можно завести два ендпоинта - один с бинарным форматом для прода, и второй такой же, но с хьюман ридбл json для дебага

После, казалось бы, эпичной победы такая зрада :lol:
Оказывается выигрыш заметен не всегда, да еще и стОит лишних проблем в сопровождении

yroslavasako

Не забывай, что вы ведёте речь о МОБИЛЬНОМ приложении. Мне вот как-то пришлось переписывать простейшей приложение со смешным потоком данных с json на бинарный формат (это было несложно просто потому что gprs в специально созданных условиях хреновой связи столько отказывался пропускать.

pilot

Ну и ты не забывай что сначала был вопрос о выгоде и ее оценке, и ответ что надо не думать, а оптимизировать ;)

katrin2201

Просто ты предпочел все остальные примеры, включая пример идущий следующим предложением, не заметить.
Расслабься уже вообще. Ну не хотите вы платить за пефоманс ваших приложений, рассчитывая на некоторое абстрактное разработческое "подумать", которое как показывает твой же пример так себе работает (о чем везде пишут, premature optimization, люди плохо угадывают, не важно с мехмата они или с вмк, все дела).
Ну отобрали вы, судя по всему, у ваших разработчиков в рамблере ту небольшую радость с которой они "носились", подорвав их мотивацию. Ну бывает. Может они там правда неделю консилиумом из десяти человек оптимизировывали это, откуда я знаю.
Жизнь она такая, в конце концов все все равно вокруг бабла вертится.
Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough. Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.

katrin2201

Ответ был, что в 99% случаях быстрее (специально для тебя: "экономически выгоднее" ) найти потенциальный хотспот в профайлере, пофиксить его, посмотреть на результат, сделать выводы и двинуться дальше.
И еще много аргументации почему "думать головой" (привет мехмат) после какого-то (тривиального) предела неэффективно.
Если в двух словах, то ( писал что-то похожее даже если мы допустим, что весь код вашего приложения помещается в голову некоего человека (у человека суперпамять, или приложение 1к строк этого мало и не дает понимания остальных компонентов(ос-железо которые участвуют в модели, в которые вложены человекостолетия. Без понимания этих компонентов ты можешь построить только упрощенную модель, вывести из которой хотспоты сидя себе и просто думая зачастую невозможно.
Этой возможностью дешевых экспериментов, кстати, наша профессия выгодно отличается от физики, например. Там, чтобы померять, надо коллайдер строить. У нас достаточно пойти код поправить и перезапуститься.

pilot

Просто ты предпочел все остальные примеры, включая пример идущий следующим предложением, не заметить.
Примеры плохая штука, всякие идиоты пытаются приводить в пример какой-нибудь фэйсбук, хотя очевидно что случай совсем не типичный. Поэтому больше была бы интересна статистика.
Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough.

Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.

katrin2201

Примеры плохая штука, всякие идиоты пытаются приводить в пример какой-нибудь фэйсбук, хотя очевидно что случай совсем не типичный. Поэтому больше была бы интересна статистика.
Непонятна нетипичность. Учитывая количество людей, которое задействовано в его разработке, это, может, вообще чуть ли не самый типичный случай, а всякие нишевые мелкие штуки, которыми ты занимаешься, в меньшинстве.
Всю жизнь в этой профессии было так, что из-за ограничений железа надо было много эксперементировать и оптимизировать. Благодаря Муру последние лет 15 с этим сильно проще, и стало дешевле "нафигачить как есть", потому что "и так работает". Но где-то еще "по-старинке". Блидинг эдж игрушки. Эмбеддед. Сайты\сервисы с 100500тпсов. И куча всего еще.
Статистика из таких примеров вроде и собирается. Тебе ее тут и собирают со всего мира. Ты свою "статистику", однако, не спешишь приводить.
> Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough.
No> Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.
Надо ли это понимать так, что вашим разработчикам регулярно выделяется время в спринте на оптимизацию?

Dasar

Ответ был, что в 99% случаях быстрее (специально для тебя: "экономически выгоднее" ) найти потенциальный хотспот в профайлере, пофиксить его, посмотреть на результат, сделать выводы и двинуться дальше.
Изначальное утверждение было другое - изначальное изречение звучало так:
всякую выявленную неоптимальность по трафику не менее 30% следует обязательно устранять. И не следует делать оценок или исследований с помощью профайлера (тестов и т.д.) насколько это скажется на общей производительности и является ли это текущим узким местом.

katrin2201

Sigh. Ну окей.
Если быть совсем точным, то с чего началась моя дискуссия с Но.
Там его это, вот, мол, "носились", а выхлоп ноль десятых. Из этого, видимо, оппонентам предполагалось сделать вывод, что нефиг "носиться", а надо сидеть и "думать". Это, типа, круче и выхлоп больше.
На что я и ответил, что обычно проще попробовать и померять, а не думать.

6yrop

это не так.
Об этом пишут:

Creating a delegate pointing to generic virtual method time is 1000x.
http://tips.x-tensive.com/2008/10/method-call-performance.ht...

А я и сам на это натолкнулся еще в 2011 году. Результат на .NET Framework 4.5.1:

direct call 13ms
generic 729ms
fixed generic 40ms
reflection 190ms

 
using System;
using System.Diagnostics;

namespace ConsoleApplication9
{
class Program
{
static void Main
{
const int iterations = 500000;

Method2<string>
Method2<string>

Method3<string>
Method3<string>

Method1;
Method1;

var methodInfo = typeof(Program).GetMethod("Method1");

methodInfo.Invoke(null, new object[] { });
methodInfo.Invoke(null, new object[] { });

{
var stopwatch = new Stopwatch;
stopwatch.Start;
for (int i = 0; i < iterations; i++)
{
Method1;
Method1;
}
stopwatch.Stop;
Console.WriteLine("direct call " + stopwatch.ElapsedMilliseconds + "ms");
}

{
var stopwatch = new Stopwatch;
stopwatch.Start;
for (int i = 0; i < iterations; i++)
{
Method2<string>
Method2<string>
}
stopwatch.Stop;
Console.WriteLine("generic " + stopwatch.ElapsedMilliseconds + "ms");
}

{
var stopwatch = new Stopwatch;
stopwatch.Start;
for (int i = 0; i < iterations; i++)
{
Method3<string>
Method3<string>
}
stopwatch.Stop;
Console.WriteLine("fixed generic " + stopwatch.ElapsedMilliseconds + "ms");
}

{
var stopwatch = new Stopwatch;
stopwatch.Start;
for (int i = 0; i < iterations; i++)
{
methodInfo.Invoke(null, new object[] { });
methodInfo.Invoke(null, new object[] { });
}
stopwatch.Stop;
Console.WriteLine("reflection " + stopwatch.ElapsedMilliseconds + "ms");
}
}

public static bool Method1
{
Func<string> func1 = => string.Empty;
Func<Type> func2 = => null;
func1;
func2;
return true;
}

public static bool Method2<T>
{
Func<string> func1 = => string.Empty;
Func<Type> func2 = => null;
func1;
func2;
return true;
}

public static bool Method3<T>
{
return Class1<T>.Method2;
}

private static class Class1<T>
{
public static bool Method2
{
Func<string> func1 = => string.Empty;
Func<Type> func2 = => null;
func1;
func2;
return true;
}
}
}
}

Dasar

А я и сам на это натолкнулся еще в 2011 году. Результат на .NET Framework 4.5.1:
Минимальный пример стоит тестить.
с таким кодом

public static bool Method2<T>
{
Func<string> func1;
Func<Type> func2;
Funcs(out func1, out func2);
func1;
func2;
return true;
}

private static void Funcs(out Func<string> func1, out Func<Type> func2)
{
func1 = => string.Empty;
func2 = => null;
}

получается

direct call 8ms
generic 7ms
fixed generic 17ms
reflection 185ms

т.е. проблема в декларации делегатов внутри generic method-ов, а не в самих generic-ах

6yrop

т.е. проблема в декларации делегатов внутри generic method-ов, а не в самих generic-ах
это и написано в моем посте:
 

Creating a delegate pointing to generic virtual method time is 1000x.
 

И об этом же я писал постами выше.
Короче, напиши, что ты был не прав, или ты неадекват. :)

kokoc88

Короче, напиши, что ты был не прав, или ты неадекват.
Ты же сам написал:
Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена.
Есть разница между использованием и созданием?

6yrop

Есть разница между использованием и созданием?
Ты о создании чего говоришь?
Лямбды используются для содания делегатов:
 
A lambda expression is an anonymous function that you can use to create delegates or expression tree types.
http://msdn.microsoft.com/en-us/library/bb397687.aspx
  

Dasar

это и написано в моем посте: Creating a delegate pointing to generic virtual method time is 1000x.
Я отвечал на пример. Утверждение с самим примером по моим ощущениям плохо билось, и поэтому я его использовал лишь как контекст для анализа примера.

Формализация следующая:
в исходном варианте утверждение несогласовано с примером из-за того, что в примере нет никаких виртуальных методов("Creating a delegate pointing to generic virtual method time is 1000x."). Рассмотр его без актуального примера не имеет смысла из-за отсылки к 2008-году.
Оно неверно в домысленном мной усиленном виде "Всякие Creating a delegate pointing to generic virtual method time is 1000x.". Ниже контр-пример, в котором создается "быстрый" delegate, ссылающийся на generic method.

public static bool Method2<T>
{
Func<string> func1 = Func1;
Func<string> func2 = Func2<string>;
func1;
func2;
return true;
}

private static Func<string> Func1
{
return => string.Empty;
}

static Type Func2<Type>
where Type : class
{
return null;
}



direct call 7ms
generic 14ms
fixed generic 19ms
reflection 180ms

В ослабленном виде оно формально верно, но незначимо из-за своей неконкретности ("Некоторые Creating a delegate pointing to generic virtual method time is 1000x.")

Dasar

Спасибо за пример! До этого я не знал о том, что есть проблемы с декларацией делегатов внутри generic method-ов.
Придется теперь весь код перелопачивать - использовать такой изврат вполне в моем духе. И таких грабель я совсем не ожидал.
Оставить комментарий
Имя или ник:
Комментарий: