[хочу всё знать] Бинарные протоколы для мобильных клиентов
protobufИспользую для всего, но под .NET - это одно из самых быстрых решений с достаточно компактным форматом. Версии под Java кажутся не очень удобными из-за конфигов, но я не искал библиотеки, где можно конфигурировать аннотациями. Версия под .NET не падает при расхождении схемы, так что с обновлением протокола проблем практически нет.
А что, архивирование json/xml на уровне http уже отменили?
На распарсивание JSON время тратится, ты ещё на разархивирование хочешь тратить?
Сколько времени, кстати, тратится и сколько хочешь сэкономить?
А что, архивирование json/xml на уровне http уже отменили?Выигрыша в размере действительно не будет. Но вот по скорости парсинга протобуф выигрывает на порядок.
UPD: изменил ссылку file:// на нормальную.
Ну, если каждую секунду войну и мир туда-сюда слать, то нормальный выигрыш будет.
А что, архивирование json/xml на уровне http уже отменили?Ты про gzip? Его использование подразумевается, конечно. Все равно нагуглилась разница с protobuf ~30% по размеру.
Улучшение даже не на порядок. Эти копейки имеют смысл при большом трафике или большой нагрузке и не в первую очередь.
Это размер. А скорость распарсивания там поболе выигрыш будет.
И как, 30% имеет смысл?На мобильных платформах - имеет, и ещё какой.
Почему?
Почему?Странный вопрос. Потому что на мобильниках медленная и часто мигающая связь, медленные процессоры, и куча других проблем.
Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.
Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.Странный ответ на нормальный ответ. Я так понимаю, ты сейчас занимаешься своим стандартным действием - с умным видом троллишь, не читая то, что пишут в тредике?
Все равно нагуглилась разница с protobuf ~30% по размеру.
И как, 30% имеет смысл?
На мобильных платформах - имеет, и ещё какой.
http://events.yandex.ru/lib/talks/1562/
Посмотри, очень познавательно.
Видео длинное, но хотя бы презентацию глянь, там очень показательно про байтики.
Посмотри, очень познавательно.
Видео длинное, но хотя бы презентацию глянь, там очень показательно про байтики.
Пока что не читал ты, и после "и еще какой" опять не можешь ответить на вопрос "так какой?"
Спасибо за ссылку, интересно. Прямо книжка High Performance Browser Networking в кратком изложении.
там есть ровно то что я говорю: gzip работает неплохо, есть и другие оптимизации в других местах обработки запросов.
Сырой html против gzip = разница в 10 раз, gzip vs protobuf - разница на 30%, зато надо с ним еще уметь работать. Нахрена - неясно.
Ой, а я её знаю. Точнее знаю её сестру младшую.
Пока что не читал ты, и после "и еще какой" опять не можешь ответить на вопрос "так какой?"На вопрос, почему для мобильных устройств важен выигрыш в размере данных в 30%, я ответил. Понимаю, что ты совсем не умеешь признавать свою неправоту. Но ты хотя бы помолчал, если уж так открыто слился, не уловив суть дискуссии.
Ссылку дай плз.
Ссылку дай плз.
сколько мс экономят твои фантазии?
я слышал, что мобильные клиенты некоторых мессенджеров используют протокол на основе XMPP (стансы могут быть бинарными с шифрованием, сжатие применяют изредка.
Не нашел там ни одной циферки, только твои фантазииOK, давай поиграем в тупого , циферки нагуглил и привёл yanus:
сколько мс экономят твои фантазии?
Все равно нагуглилась разница с protobuf ~30% по размеру.Ты спросил, имеют ли эти циферки смысл:
И как, 30% имеет смысл?Я ответил, что имеют:
На мобильных платформах - имеет, и ещё какой.Ты спросил, почему?
Я ответил:
Потому что на мобильниках медленная и часто мигающая связь, медленные процессоры, и куча других проблем.
на мобильниках медленная и часто мигающая связь
медленная и часто мигающая связь
Зы: Ссылочку от lynn почитай для самообразования, а не тупи.
Только в тупого майка: так сколько мс экономят твои фантазии? Сколько это процентов времени обработки запроса?Фантазии тупого экономят 0% времени обработки запроса. Потому что в этих фантазиях нет ничего о цифрах по времени обработки запроса. Потому что эти фантазии были в ответ на сообщение yanus:
Все равно нагуглилась разница с protobuf ~30% по размеру.
разница с protobuf ~30% по размеру.
~30% по размеру
по размеру
размеру
Ну ок, хорошо, если дело не в скорости, так расскажи циферки про размер, нахрена нужно экономить 30%. Прям из тебя клещами надо тянуть чо ты там имел в виду под "еще какой".
Вы задрали. Нет бы Марину обсудить - нет, им важнее посраться.
Совсем упоролся? (Да, ты совсем упоролся.
нахрена нужно экономить 30%Предлагаю тебе рекурсивно перейти на ссылку
Гнобить майка - давняя традиция
Там опять нет циферок о том нахрена это надо. Не тупи.
Пока что гнобят тебя. (имхо)
Гнобить майка - давняя традицияВ твоём случае традиция скорее в том, чтобы слиться на попытке кого-то загнобить. Но, да, она древняя.
Там опять нет циферок о том нахрена это надо. Не тупи.Там и не должно быть циферок. Не тупи. Если уж сделал глупую ошибку, не прочитав сообщения в тредике, то хотя бы просто помолчи.
Вы задрали. Нет бы Марину обсудить - нет, им важнее посраться.
Зачем молчать-то? Твои бредовые фантазии будут казаться разумным ответом, не интересно, да и баттхерт твой неплох.
о каких клиентах идет речь?Нативные мобильные приложения. Например, Киви кошелек или мобильный кошелек Тинькова.
Зачем молчать-то? Твои бредовые фантазии будут казаться разумным ответом, не интересно, да и баттхерт твой неплох.Со стиля "тупой " ты перешёл на стиль "закидаю какашками". Но зачем? Просто напиши, что ты был не прав, я даже плюсик тебе поставлю.
Ты привел левые циферки про размер, которые юзверю и серверу вообще говоря до лампочки.
Почитай презентацию lynn - там девица хоть какие-то оценки типичные дать пытается, ты же весь тред только ноешь.
http://www.charlesproxy.com/
скорее всего, правда, он будет зашифрованным, но можно будет например понять, что это https )
Наверняка это можно узнать только методами обратной инженерии
можно попробовать послушать их трафик каким-нибудь скорее всего, правда, он будет зашифрованным, но можно будет например понять, что это https )
Наверняка это можно узнать только методами обратной инженерии
Да где блин неправ-то?Так ты почитай тему. Может быть, сам поймёшь?
Я вообще ничего не утверждал, только спросил что же улучшится и насколько.Конечно, ты не утверждал. Ты спросил, имеет ли смысл 30% экономии, не прочитав, что речь идёт о размере трафика. На что получил вполне вразумительный ответ, к которому в силу своей природы решил прикопаться, потроллить, но сел в лужу.
Как пользователь почувствует эти 30%? Вроде, ты пишешь, что на времени отклика это не будет заметно. Как пользователь почувствует трафик? Он за трафик платит (я не пользуюсь мобильниками , только звоню)?
девица
Вроде, ты пишешь, что на времени отклика это не будет заметно.Уточню. Я делал упор на том, что не будет заметно время обработки запроса. Время отклика, то есть получения ответа от сервера, вполне может сократиться на те же 30%. Кроме этого, да, бывают и провайдеры, которые берут деньги за трафик.
Вообще при разработке мобильного приложения лучше экономить на всём. Многие начинающие часто жалуются на "преждевременную оптимизацию", но им стоит вспомнить, какую оценку имело приложение Facebook в AppStore, и почему его в итоге полностью переписали.
Даже форум до сих пор имеет режим SL, несмотря на то, что странички вроде бы зипуются.
Даже форум до сих пор имеет режим SLЧтобы на работе не палиться же!
Время отклика, то есть получения ответа от сервера, вполне может сократиться на те же 30%.Именно фаза получения ответа может быть в три раза меньше вроде, если из-за меньшего размера не пришлось делать лишний ack.
и то вроде как не в 3 раза.
Anyway, в итоге для пользователя насколько будет отличаться время?
Спасибо, а то у майка на меня аллергия и на этот вопрос мне он ответить никак не мог. )
Anyway, в итоге для пользователя насколько будет отличаться время?А ты как думаешь, насколько в среднем отличается время отправки и получения данных, объём которых на 30% меньше?
На полпроцента
30% от войны и мира это не в тапки срать!
А ты как думаешь, насколько в среднем отличается время отправки и получения данных, объём которых на 30% меньше?Один из вариантов - не насколько, если оба размера умудряются влазить в один сетевой пакет.
ps
т.е., имхо, для ответа на этот вопрос важно вводить второй параметр - размер передаваемых данных за раз.
В среднем по больнице никто ж не пересылает войну и мир.
Один из вариантов - не насколько, если оба размера умудряются влазить в один сетевой пакет.Ок, мне просто интересно, насколько по-твоему отличается время отправки и получения таких данных, если они влазят в один пакет?
На полпроцентаПочему?
Ну и для пользователя важный параметр - время реакции системы, а не время отправки и получения данных. в той же презентации например написаны времена для других фаз обработки запроса.
С чего ты взял? Взять вот хотя бы MMO/MOBA/FPS игры - они очень интенсивно с клиентом обмениваются.
Anyway, в итоге для пользователя насколько будет отличаться время?До полусекунды для 3G.
С чего ты взял? Взять вот хотя бы MMO/MOBA/FPS игры - они очень интенсивно с клиентом обмениваются.Мелкими порциями данных - да, нужно быстро обмениваться. Какая у ТС задача - непонятно, поэтому в начале треда я и простой вопрос.
99% мобильных приложений (насколько я понимаю) - совсем не такие игры.
Ок, мне просто интересно, насколько по-твоему отличается время отправки и получения таких данных, если они влазят в один пакет?Допустим размер данных 50 и 70 байт. Ответ мобильный клиент получит вместо 30мс (что уже только при очень хорошей связи) для 50 байт и за 30мс и 1мкс для 70 байт.
Мобильные приложения тебе только как один из примеров того, где критичен язык обмена данными привели. Не надо только на нём зацикливаться.
1мксwat?
Почему?Это гипотеза. Пока ты не начал вредничать, я задавал вопрос без подтекста, мне было интересно какой процент времени для пользователя на этом экономится.
Нормальный ответ не-майка был бы такой: 99% мобильных приложений пересылают примерно по 400 байт раз в 5 минут, пересылка и парсинг данных во времени обработки запроса занимает 50%, если улучшим на 30% - будет на 17% быстрее. Пользователь этого никогда не заметит, лучше поискать другие узкие места.
Если ты майк, мог бы подставить свои циферки и получить другой вывод, не осилил.
Ответ на вопрос "почему":
1) потому что я неправильно ответил, думая про время реакции приложения для пользователя, а не только время пересылки данных,
2) при этом на большинстве данных разница будет не в 30% (30% это непонятное пока число - ссылку дали корявую, возможно это какие-то пограничные случаи)
Чуть выше были прикидки про 17%(например полпроцента маловато.
Мобильные приложения тебе только как один из примеров того, где критичен язык обмена данными привели. Не надо только на нём зацикливаться.Из-за того что я не зациклен на мобильных приложениях, я в треде вопрос и задаю.
В реальном мире в рамблере была как раз такая история, как описана мной выше, где экономия на ускорении обработки какой-то части странички в 2 раза давала в результате полпроцента ускорения для пользователя, а разработчики носились с идеей оптимизации, рассказывая как она нас спасет.
wat?Столько уйдет на прокидывание лишних 20 байтов между уровнями кода и десериализацию.
До полусекунды для 3G.Какое распределение?
так и писал бы 30000мкс и 30001мкс
Допустим размер данных 50 и 70 байт. Ответ мобильный клиент получит вместо 30мс (что уже только при очень хорошей связи) для 50 байт и за 30мс и 1мкс для 70 байт.Ты знаешь спецификацию конкретного аппаратного слоя или твои слова верны для любого?
Пока ты не начал вредничать, я задавал вопрос без подтекста
Странный ответ, непонятно каким образом относящийся к 30% ускорению от protobuf.
Разница по цпу, как уже сказали, есть, причем значительная.
Особенно дорого парсинг из-за того, что надо матчить строки. Сериализацию же можно сделать довольно быструю, очень быструю если у вас везде fixed-sized поля.
Я бы, правда, сказал, что это все важно только на сервере обычно, потому что там каждый лишний процент цпу выливается в бабло на содержание лишнего сервера.
Гзип по этой же причине не оптимален почти всегда. Это очень старый алгоритм, который и цпу жрет и компрессии толком не дает. Берите что-нибудь более современное типа lz4.
Плюс, архивация и способ маршаллинга все же перпендикулярные вещи. Архивация жмет не только оверхед, но и контент. Так что если мы возьмем бинарный протокол с отдельными полями, которым нужно, пожатыми lz4, то это будет почти всегда лучше. Еще есть femtozip.
Мобильные клиенты последнее время достаточно быстрые, и не шлют много запросов, чтобы именно разница по цпу binary vs json становилась заметной. Конкретно на них важнее то, как ты с сокетами работаешь, из-за кривой связи в первую очередь.
Там нужно быстро детектить мертвые сокеты и быстро и прозрачно ретраить, но при этом отличать это от медленного сервера/связи, чтобы не зафлудить свою же инфраструтктуру. К сожалению, это очень нетривиальная задача.
Пользователь этого никогда не заметитОчевидно, пользователя интересует момент, когда он давит на кнопку, а не какая-то абстрактная передача данных, которая происходит в фоне. Если об этом подумать, то становится ясно, что сокращение объёма передаваемых данных в условиях плохой связи будет иметь преимущества. Глупо топать ножкой и плакать о том, что нужны какие-то цифры, и что тебе ничего не понятно.
Что касается ответа не-, то уж лучше рассмотреть вопрос не-.
В реальном мире в рамблере была как раз такая история, как описана мной выше, где экономия на ускорении обработки какой-то части странички в 2 раза давала в результате полпроцента ускорения для пользователя, а разработчики носились с идеей оптимизации, рассказывая как она нас спасет.
В реальном мире из таких оптимизаций там и здесь и складывается в целом быстрая и производительная система. Если ты будешь ждать, что в какой-то момент, кто-то придет, и ткнет пальцем в 10 строк кода, и быстро и строго докажет (не переписывая что вот если это переписать так то, то получите ускорение в сотню попугаев, то ждать придется бесконечно.
В реальном мире ты сидишь и вдупляешь в профайлер. И вдупление в него, это такое полунаучное гадание на кофейной гуще, потому что он или семплит (причем криво) или слишком большой оверхед интродьюсит, или все сразу, и понять, что из того, что он показывает, действительно проблема - заранее почти невозможно.
Поэтому ты идешь, и как честная обезьянка переписываешь или отрезаешь на время профайлинга все вылезшие места. И каждое дает тебе микроскопический в целом выигрыш. Снова идешь в профайлер, там теперь новые места вылезли, снова переписываешь. И так через несколько итераций глядь, и количество выделяемой памяти с гигабайт в секунду упало до мегабайт в секунду, гц заткнулся и не вылазит, попугаи скакнули вверх, а в профайлере наконец-то, после облезания всей шелухи, вылезла часть, которая создает 50% общей нагрузки на цпу.
В реальном мире ты сидишь и вдупляешь в профайлер. И вдупление в него, это такое полунаучное гадание на кофейной гуще, потому что он или семплит (причем криво) или слишком большой оверхед интродьюсит, или все сразу, и понять, что из того, что он показывает, действительно проблема - заранее почти невозможно.
Поэтому ты идешь, и как честная обезьянка переписываешь или отрезаешь на время профайлинга все вылезшие места. И каждое дает тебе микроскопический в целом выигрыш. Снова идешь в профайлер, там теперь новые места вылезли, снова переписываешь. И так через несколько итераций глядь, и количество выделяемой памяти с гигабайт в секунду упало до мегабайт в секунду, гц заткнулся и не вылазит, попугаи скакнули вверх, а в профайлере наконец-то, после облезания всей шелухи, вылезла часть, которая создает 50% общей нагрузки на цпу.
А пробуй еще мозги включать, окажется что профайлер не всегда нужен.
Вот в этом треде видим как майк сопротивляется включению у себя мозгов, прошлые с его участием были про то же - руки у него из плеч, а вот вместо головы - ж.
Одно и то же повторяешь весь тред, без цифирек не приходи больше. Даже девочка в презентации осилила эффект оценить, стыд и позор.
Зато есть эффективный менеджер, который "успешно" разруливает "
Вообще, такая схема вполне живуча. И ты такой не один, вас таких много. Живут такие, к счастью, в небольших проектиках, там где действительно, думать не надо, а надо лабать-лабать-лабать. Когда такие распространяют это видение на весь остальной мир, конечно, остальной мир только снисходительно улыбается.
А совсем вообще, самые лучшие программисты просто научились это делать, пока "менеджер не видит". У меня есть живой пример человека, который просто раз в месяц-два проходит по коудбейзу вычищая то, что наговнокодили другие (включая внутренние инфраструктурные либы типа service framework). Могу даже привести результат в цифрах: этот человек переписал сервис, который раньше жил на ~200 боксах. Сейчас он живет на 12. При этом лейтенси p99 с ~300мс упало до <30мс.
Его уровень в иерархии, правда, таков, что над ним нету менеджера, который бы мог ему сказать, что надо фигачить фичу. Там, скорее, наоборот, если надо это он к менеджеру придет, и скажет - "какого вы тут нафигачили фич, сломав мой сервис?".
В некоторых реальных мирах, не сломать сервис, знаешь ли, важнее, когда каждая секунда аптайма этого сервиса тебе приносит примерно доллар. Важнее, чем нафигачить новую фичу в некий абстрактный срок, придуманный абстрактным эффективным менеджером (scientific wild-ass guess).
> А пробуй еще мозги включать, окажется что профайлер не всегда нужен.
Не всегда - да, сложно не согласиться. В коде размера и сложности рекурсивного фибоначчи, конечно, профайлер не нужен, чтобы найти проблему, кто бы сомневался.
В остальных случаях с ростом проекта заюзать профайлер становится гораздо быстрее "прочитать весь код и подумать". Мне кажется, это очевидно. Учитывая, что в множество кода, которое надо брать в расчет, входит, например, код вашей OS, то профайлер лучше практически since day 1.
Для наглядности - можешь, например, почитать, что такое interconnect и каким местом он участвует в cache coherency. Если осилишь, то сможешь на досуге подумать, каким образом без профайлера ты обнаружишь, что проблема в том, что твоя приложенька упирается в bandwidth этой шины. Я бы с интересом послушал твой рассказ. Если осилишь хотя бы заботать и осознать, в чем подвох, можешь собой смело гордиться.
Вообще говоря анализ перфоманса это отдельная профессия. В intel/мцст перф аналитики и инженеры разделены. И требовать от рядового инженера знание деталей работы CPU/mmu/GC/VM/компилятора/OS достаточно абсурдно. Тем более странно это требовать от джавера. Ну это просто совершенно разная по сути работа. Одни пишут код, другие хачат компиляторы, профилировщики, генерируют и просматривают килотонны трасс. Это совершенно разная по сути работа и мышление у аналитиков и кодеров различное.
И требовать от рядового инженера знание деталей работы CPU/mmu/GC/VM/компилятора/OS достаточно абсурдно. Тем более странно это требовать от джавера.Есть разные способы повышать производительность системы, разные методы оптимизации. Если речь идёт о каком-нибудь процессе, который сжимает видеофайлы, то здесь можно требовать оптимизацию на уровне CPU и каких-то специальных знаний. Если речь идёт об оптимизации в целом, то от профессионального разработчика, даже на Java, вполне разумно требовать как минимум знания о GC, VM, OS и алгоритмической сложности. Может быть, это было бы абсурдно требовать от Junior, но в целом это далеко не отдельная профессия, а достаточно стандартная обязанность всех разработчиков.
Например, сократить объём трафика на 30%, по сути за копейки - вполне себе оптимизация, какой отдельной профессии она требует?
Ну выше речь зашла про пол процента, coherence protocols. А для того, чтобы это учитывать и разбираться <<почему>> оно работает, а не как, надо потратить много времени на забатывание всей этой мути и еще пару лет поработать перфомансником, ибо в этой области все очень эвристично. По хорошему, если есть необходимость в перфе, надо организовывать перфомансное тестирование. Асимптотики хорошо моделируют перф только в модели с универсальной памятью, стоимостью операций в клоках, с максимальным ipc == 1, без виртуальной памяти, инвалидаций, переключений контекста и на равномерно распределенном наборе данных. То есть в теории.
надо потратить много времени на забатывание всей этой мути и еще пару лет поработать перфомансникомНе думаю, что обязательно тратить столько времени, чтобы оптимизировать какую-нибудь высоконагруженную систему. Мы же не ведём речь о том, что вместо 10 серверов нам надо 5; а вместо 100 сделать 10 можно (если вообще можно) и без супертонких оптимизаций. Такой масштаб, скорее, означает какие-то более простые проблемы в коде и архитектуре.
В остальном профайлеры обычно вполне неплохо наводят на мысль о происходящем. Не вижу проблем в том, чтобы разработчик имел об этом представление. В общем случае я не вижу необходимости в отдельной должности. Видимо, приводил пример такого случая, когда просто посмотрев на код мы вряд ли найдём проблему даже через очень продолжительное время, то есть нам нужно запускать профайлер независимо от того, насколько хорошо работают мозги.
Профилировщик нужно использовать всегда. Вне завсисмости от того, как мозги работают. Единственное, инструментальные работают на основе Монте-Карло и могут врать, да и оверхед вносят. 300 мс это 3 секунды что-ли? Ад какой-то. Я, видимо, неправильно понял исходный мессэдж. Все вышесказанное мной относится к драке за микросекунды. А это только арбитражные роботы.
300 мс это 3 секунды что-ли?http://www.google.ru/search?q=300мс=
Ага, но все равно на 2 порядка больше. В любом случае, на этом уровне проблемы решаются без особой магии простой аналитикой.
Микросекунды важны не всегда только уж в арбитражных роботах. В любом хот лупе на самом деле.
Пример из моей жизни: у нас в запросе обрабатывается порядка сотни сущностей в среднем. На каждую сущность нам надо сходить в некий индекс. При общем лейтенси в среднем 5мс можно на глазок прикинуть, сколько мкс может макс занимать один раз сходить в индекс. Потом поделить это пополам, потому что половина нашего лейтенси - сходить в ремоут кеш
Требовать от "рядовых" девелоперов многого, конечно, бесполезно. Я б не сказал только, что это прямо отдельная профессия. Отдельная профессия - это когда человек досконально знает архитектуру цпу или ос, и только ей и занимается.
И, собственно, один из моих поинтов был в том, что если у тебя есть профайлер, то достаточно знать хотя бы в общих чертах. А профайлер расскажет куда копать.
Ну и, как сказали выше, джаверу знать, что есть gc, что у него там дженерейшены есть, понимать какие операции для гц наиболее тяжелы, какие очень дешевы - надо (не в мире _Но_, конечно). Иначе количество ошибок в оценке прироста от оптимизации, описанное _Но_, будет стремиться к 100%.
Ну и чем дальше в лес, тем злее дятлы.
Про cache coherency неплохо б знать, хотя бы чтобы не распространять популярный ныне бред, что так как volatile это мемори барьер (это верно а мемори барьер это флаш кеша, то волатайл это очень дорого. Я видел умных людей, которые в своем коде принципиально не ставили волатайл, хотя и знали что он там нужен, именно по этой причине. Мол, и так сойдет, вероятность ошибки крайне низкая, зато быстро. Работало в принципе, только когда эти объекты без волатайлов начинали дергать из jmx консольки (отдельный сокетный тред) иногда случались всякие рандомные случайности. К счастью, в проде это делали очень редко.
И вообще про кеш надо знать, чтоб понимать, в чем квиксорт круче хипсорта.
Если ты начинаешь писать сетевое приложение, то для тебя, хоппа, и открывается занимательный мир tcp/ip stack и epoll/kqueue со всей его кровью и кишками.
Даже если ты "программист на джаве", который оперирует высокими материями, рано или поздно ты в это упрешься. Точнее, сначала упрешься в то замечательное месиво, которое сан/оракл наворотил поверх простого как пробка epoll. Отпилив его упрешься в сам epoll.
Ну итд.
Я не ожидаю, что один человек досконально будет разбираться во всем мной затронутом. Я досконально не разбираюсь, например. Досконально это имхо анриал.
Но я ожидаю, что если у человека возникнет проблема описанного выше уровня, то он не разведет ручками, а сообразит, куда копать.
Ну и, как сказали выше, джаверу знать, что есть gc, что у него там дженерейшены есть, понимать какие операции для гц наиболее тяжелы, какие очень дешевы - надо (не в мире _Но_, конечно). Иначе количество ошибок в оценке прироста от оптимизации, описанное _Но_, будет стремиться к 100%.А я вот на .NET программирую. Там до сих пор есть вот такая проблема. Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена. А рефлекшен писец как медленная вещь. И об этом мало кто знает. И фиксить походу не собираются. Всем пох. А ситуация то банальная — дженерик метод+лямбда и всё приплыли.
А ты про поколения GC говоришь, я вот сколько работаю они ни разу не понадобились, хотя на собеседованиях регулярно спрашивают.
поколения GC говоришь, я вот сколько работаю они ни разу не понадобилисьЯ не знаю, что тебе ответить на это, чтобы сильно не задеть. Но попробую.
Да, бывают ситуации, когда никому не интересно, что там с гц и как его вообще тюнить. Заключать из этого, что тюнить гц вообще никому никогда не должно быть нужно, вроде должно быть понятно, что не стоит.
Заключать из этого, что тюнить гц вообще никому никогда не должно быть нужноКонечно, тут не черное или белое.
А если очень надо, то можно многое чего. Вон для Фейсбука не влом было аж два раза переписать движок PHP.
Только сначала нужно найти кому это реально нужно. Ну или играться за чужой счет.
Только сначала нужно найти кому это реально нужно. Ну или играться за чужой счет.Разумеется. Главное, чтобы не получалось так, как у меня сейчас, например: стандартными внутренними тулзами (а-ля мавен) наш проект в облаке собирается полчаса. У меня локально с моими хаками этих тулов 30 секунд.
Разумеется. Главное, чтобы не получалось так, как у меня сейчас, например: стандартными внутренними тулзами (а-ля мавен) наш проект в облаке собирается полчаса. У меня локально с моими хаками этих тулов 30 секунд.Хороший пример по теме треда. IRL проги тормозят не потому что в них сериализация текстовая, а потому что они делают что-то невероятно тупое, типа по 10 раз одни и те же данные запрашивают. Чтобы такого не было, программа должна быть как можно более прозрачна, чему бинарная сериализация не способствует.
Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена.это не так.
Справедливости ради, после того, как ты начнешь это кешировать, выигрыш от бинарного формата вместо json не очень большой и локально практически не виден.
Но если взять в рассмотрение наше билд облако, наверное, только из-за одной этой штуки ежедневно мы в нем кипятим лишнюю бочку воды.
По поводу прозрачности\непрозрачности - плохое оправдание для бездействия. Тем более, что всегда можно завести два ендпоинта - один с бинарным форматом для прода, и второй такой же, но с хьюман ридбл json для дебага
выигрыш от бинарного формата вместо json не очень большой и локально практически не виден.
Тем более, что всегда можно завести два ендпоинта - один с бинарным форматом для прода, и второй такой же, но с хьюман ридбл json для дебага
После, казалось бы, эпичной победы такая зрада
Оказывается выигрыш заметен не всегда, да еще и стОит лишних проблем в сопровождении
Не забывай, что вы ведёте речь о МОБИЛЬНОМ приложении. Мне вот как-то пришлось переписывать простейшей приложение со смешным потоком данных с json на бинарный формат (это было несложно просто потому что gprs в специально созданных условиях хреновой связи столько отказывался пропускать.
Ну и ты не забывай что сначала был вопрос о выгоде и ее оценке, и ответ что надо не думать, а оптимизировать
Расслабься уже вообще. Ну не хотите вы платить за пефоманс ваших приложений, рассчитывая на некоторое абстрактное разработческое "подумать", которое как показывает твой же пример так себе работает (о чем везде пишут, premature optimization, люди плохо угадывают, не важно с мехмата они или с вмк, все дела).
Ну отобрали вы, судя по всему, у ваших разработчиков в рамблере ту небольшую радость с которой они "носились", подорвав их мотивацию. Ну бывает. Может они там правда неделю консилиумом из десяти человек оптимизировывали это, откуда я знаю.
Жизнь она такая, в конце концов все все равно вокруг бабла вертится.
Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough. Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.
И еще много аргументации почему "думать головой" (привет мехмат) после какого-то (тривиального) предела неэффективно.
Если в двух словах, то ( писал что-то похожее даже если мы допустим, что весь код вашего приложения помещается в голову некоего человека (у человека суперпамять, или приложение 1к строк этого мало и не дает понимания остальных компонентов(ос-железо которые участвуют в модели, в которые вложены человекостолетия. Без понимания этих компонентов ты можешь построить только упрощенную модель, вывести из которой хотспоты сидя себе и просто думая зачастую невозможно.
Этой возможностью дешевых экспериментов, кстати, наша профессия выгодно отличается от физики, например. Там, чтобы померять, надо коллайдер строить. У нас достаточно пойти код поправить и перезапуститься.
Просто ты предпочел все остальные примеры, включая пример идущий следующим предложением, не заметить.Примеры плохая штука, всякие идиоты пытаются приводить в пример какой-нибудь фэйсбук, хотя очевидно что случай совсем не типичный. Поэтому больше была бы интересна статистика.
Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough.
Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.
Примеры плохая штука, всякие идиоты пытаются приводить в пример какой-нибудь фэйсбук, хотя очевидно что случай совсем не типичный. Поэтому больше была бы интересна статистика.Непонятна нетипичность. Учитывая количество людей, которое задействовано в его разработке, это, может, вообще чуть ли не самый типичный случай, а всякие нишевые мелкие штуки, которыми ты занимаешься, в меньшинстве.
Всю жизнь в этой профессии было так, что из-за ограничений железа надо было много эксперементировать и оптимизировать. Благодаря Муру последние лет 15 с этим сильно проще, и стало дешевле "нафигачить как есть", потому что "и так работает". Но где-то еще "по-старинке". Блидинг эдж игрушки. Эмбеддед. Сайты\сервисы с 100500тпсов. И куча всего еще.
Статистика из таких примеров вроде и собирается. Тебе ее тут и собирают со всего мира. Ты свою "статистику", однако, не спешишь приводить.
> Ты просто так и говори честно - нам пефоманс не важен, то, что наши разработчики пишут с первого прохода нам good enough.Надо ли это понимать так, что вашим разработчикам регулярно выделяется время в спринте на оптимизацию?
No> Не возводи в абсолют, и, я тебе уже писал в какой-то теме раньше, у меня к тебе вообще вопросов не будет.
Ответ был, что в 99% случаях быстрее (специально для тебя: "экономически выгоднее" ) найти потенциальный хотспот в профайлере, пофиксить его, посмотреть на результат, сделать выводы и двинуться дальше.Изначальное утверждение было другое - изначальное изречение звучало так:
всякую выявленную неоптимальность по трафику не менее 30% следует обязательно устранять. И не следует делать оценок или исследований с помощью профайлера (тестов и т.д.) насколько это скажется на общей производительности и является ли это текущим узким местом.
Если быть совсем точным, то с чего началась моя дискуссия с Но.
Там его это, вот, мол, "носились", а выхлоп ноль десятых. Из этого, видимо, оппонентам предполагалось сделать вывод, что нефиг "носиться", а надо сидеть и "думать". Это, типа, круче и выхлоп больше.
На что я и ответил, что обычно проще попробовать и померять, а не думать.
это не так.Об этом пишут:
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;
}
}
}
}
А я и сам на это натолкнулся еще в 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-ах
т.е. проблема в декларации делегатов внутри generic method-ов, а не в самих generic-ахэто и написано в моем посте:
Creating a delegate pointing to generic virtual method time is 1000x.
И об этом же я писал постами выше.
Короче, напиши, что ты был не прав, или ты неадекват.
Короче, напиши, что ты был не прав, или ты неадекват.Ты же сам написал:
Если у метода есть дженерик параметр и в теле этого метода используется лямбда, то вызов этого метода медленнее рефлекшена.Есть разница между использованием и созданием?
Есть разница между использованием и созданием?Ты о создании чего говоришь?
Лямбды используются для содания делегатов:
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
это и написано в моем посте: 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
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
Придется теперь весь код перелопачивать - использовать такой изврат вполне в моем духе. И таких грабель я совсем не ожидал.
Оставить комментарий
psm-home
Сейчас модно для общения клиентов с сервером использовать HTTP протокол с JSON (иногда XML) в качестве полезной нагрузки.Насколько для мобильных клиентов имеет смысл использовать вместо JSON/XML что-нибудь более компактное и быстро разбираемое?
Например protobuf/thrift/msgpack из нового, или, прости господи, asn1.
Кто-нибудь сравнивал количественно, стоит оно того?
JSON обычно используют schemaless, а вышеупомянутые бинарные аналоги все используют схему. Для протокола обмена с мобильным клиентом наличие схемы скорее хорошо или скорее плохо?