Русский
Русский
English
Статистика
Реклама

Андрей акиньшин

Если ты видишь статью, что язык Х быстрее, чем язык Y можешь закрывать статью

28.07.2020 20:05:54 | Автор: admin


Я своими гуманитарными мозгами всегда думал так если программист знает, как сделать перфоманснее значит надо сделать перфоманснее. Производительное решение = правильное решение. Один язык программирования может быть медленнее другого, и если это выяснится язык программирования отправляется на помойку.

Ну и уж точно если разработчик специалист в области перфоманса, он будет топить за все эти вещи, даже если они неверны.

Естественно, все это чушь, но не мне вам об этом говорить. Поэтому к нам в подкаст пришел Андрей Акиньшин разработчик и математик, кандидат физико-математических наук, мейнтейнер BenchmarkDotNet и perfolizer, автор книги Pro .NET Benchmarking и просто очень, очень крутой инженер.


Ниже избранные цитаты.

Предусмотреть в бенчмарках все невозможно


У моего коллеги недавно случилось следующее. Он программировал с утра, у него всё было хорошо, всё работало быстро. В какой-то момент всё начало втыкать Rider работает медленно, IDEA, браузер всё работает медленно. Он никак не мог понять, в чём же дело? А потом понял. Он работал на ноутбуке чёрного цвета, который стоял у окна. С утра было довольно прохладно, а днём поднялось солнышко, ноутбук очень сильно нагрелся и ушёл в термальный троттлинг.

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

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

Я приведу аналогию с языками. Когда ты учишь свой первый функциональный ЯП, тебе нужно немного модифицировать своё отношение к миру понять принципы функционального программирования, то, как вообще нужно мыслить. Потом ты берёшь следующий функциональный язык Х, и у тебя в голове эти принципы уже есть. Ты смотришь пару hello world и тоже начинаешь писать.

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

Я считаю, что нужно в каждой области доходить до похожего уровня, а дальше идти вширь.

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

Бенчмаркинг ради бенчмаркинга не самое лучшее, чем можно заниматься


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

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

Грубо говоря, если у меня в коллекции есть максимум 10 элементов, и есть два варианта написать простой алгоритм за куб или очень сложный за n*log n я напишу простой за куб, который будет понятен всем, который будет легко поддерживать и модифицировать. Потому что я понимаю мои перфомансные ограничения он никогда в жизни не пробьёт.

Если ты написал медленное решение для маленького набора данных, а потом его использовали для большого, и у этого не было сверхплохих последствий (обычно их нету) ну, пошли и починили. Зато в голове будет модель того, как в будущем этих ошибок избежать.

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

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

Пока этой интуиции нет, можно идти методом проб и ошибок и смотреть, что получается.

У тебя есть всегда трейдоф между перфомансом и красотой


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

Я считаю, нужно ориентироваться на текущие бизнес-требования, и в рамках них писать максимально чистый, понятный, красивый, поддерживаемый код. А в тот момент, когда оно начинает жать, (или есть ощущение, что скоро начнёт), то тогда уже что-то менять.

И даже если ты будешь всегда концентрироваться исключительно на перфомансе нет такой штуки, как идеально оптимизированный, максимально производительный код. Это значит всё забыли про C#, забыли про все красивые языки. А лучше вообще писать в машинных кодах, потому что Ассемблер он тоже по синтаксису ограничен. А если сразу по байтикам писать, то ты получишь перфоманс-boost.

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

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

У языка нет такого свойства как перфоманс


Если ты видишь статью, что язык Х быстрее, чем язык Y можешь закрывать статью. Язык это математическая абстракция. Это набор правил, согласно которому составляется программа. У него нет производительности, у него нет перфоманса, это нечто, что существует в твоей голове и находит воплощение в текстовом редакторе.

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

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

Условно можно сказать, что C++ в большинстве случаев работает быстрее, чем JavaScript. Но более правильно будет сказать, что С++ программисты с хорошим опытом С++, которые пишут на С++, напишут программу, которая скорее всего будет быстрее, чем джаваскриптер на JavaScript напишет что-то, что будет работать в браузере.

Но и здесь есть очень много оговорок. А что если чувак, который писал на JavaScript скажет, что это не так, и пойдёт там на какой-нибудь там WebAssembly или еще чего-нибудь переделывать. Или найдет на GitHub суперинтерпретатор-компилятор JavaScript, который работает с очень усечённым подмножеством JS на три с половиной синтаксические конструкции, но зато выдаёт сверхбыстрый нативный код.

И вот там при желании можно написать такой код, который обгонит С++. Более того, можно написать свой компилятор JavaScript, который будет задизайнен, чтобы компилировать одну-единственную программу и обогнать по скорости плюсы. И Это, в принципе валидный вариант.

Социальное давление популярного опенсорсного проекта


С ростом и известностью проектов приходит некий уровень ответственности. Но на самом деле у тебя не появляются обязательства. Этот факт не всегда просто понять, особенно когда приходят всякие люди на GitHub и говорят: У меня вот здесь не работает! Почините срочно! Мне очень надо, чтоб вот это заработало. Идите и чините! Или чувак заводит ишью, а я в отпуске. Проходит три-четыре дня, я даже не видел того, что он что-то там завёл. Я где-то отдыхаю, и чувак начинает Какого хрена вы мне не отвечаете? Что вообще у этого проекта за комьюнити?! Вы вообще все отвратительные люди, с вами надо делать плохие вещи! Я потратил своё время, написал вам, что вы неправы, а вы с этим вообще ничего не делаете, уже четыре дня меня игнорируете! Как так можно?!

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

И вот, когда появляется иммунитет против людей, которые от тебя что-то хотят, то жить становится намного проще. Сейчас я добираюсь до BenchmarkDorNet, когда у меня есть время и настроение покодить. Я знаю, что там много багов. Они в основном некритичные, и касаются каких-то маргинальных случаев в таком-то окружении с последней превьюхой пятого DotNet что-то где-то не работает. Ну и ладно, пущай не работает. Когда у меня будет настроение, я пойду и пофикшу.

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



Смотрите весь подкаст здесь.
Подробнее..

Тесты на статистическую значимость это чудовищно ущербный инструмент

30.07.2020 18:15:54 | Автор: admin

Когда я участвовал в продуктовой разработке, меня страшно бесили прагматичные дизайнеры те, что все пытались делать только на основе статистических исследований.

Вот мне хочется, чтобы кнопка была зеленой, просто потому что мне так больше нравится. А дизайнер говорит неважно, АБ-тесты показали, что на кнопку поносного цвета кликают на 0,2% чаще. Господи, дружище, ты десять лет прокачивал свой вкус и опыт, чтобы что? Чтобы наш продукт напоминал птичью какашку? Но бизнес говорит раз есть цифры, значит мы обмажем этим все.

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

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

Видео с таймкодом. Ниже только монологи Андрея из видео.


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

Тесты на статистическую значимость классический подход к решению этой задачи. Работают они просто. У тебя есть формула, в которую ты засовываешь данные, и она на выходе тебе даёт некое магическое P-value, которое ты сравниваешь с магической константой Альфа. Если P-value получилось меньше Альфа, то ты говоришь, что там есть разница. А если получилось больше, говоришь разницы нет (на практике правильнее говорить нельзя отвергнуть нулевую гипотезу и много других страшных слов).

Эти стат-тесты дико распространены, они есть во всех университетских курсах по математической статистике. Но этот инструмент чудовищно ущербный. В стат-тестах плохо всё. Они максимально контринтуитивны. Многие интерпретируют P-value как вероятность, что у нас есть разница. На самом деле нет разницы, это совсем другое.

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

С тем же Альфа в качестве Альфа принято использовать значение 0,05. Почему это принято? Потому что был такой мужик Фишер, который в 30-х годах прошлого века написал статью в сельскохозяйственный журнал, где рассуждал о том, как определить есть ли у нас эффект от навоза на то, насколько хорошо растут сельскохозяйственные культуры или нет. У него было 20 экспериментов, он говорил, что в одном эксперименте из двадцати мы можем просто по чистой случайности увидеть разницу между полем с навозом и полем без навоза, даже если от навоза толку никакого нет.

Но сквозь несколько публикаций оттуда просочилось число 0,05. Всё это случайное рандомное число, которое стало индустриальным стандартом. Примерно как с клавиатурой Qwerty, которую дизайнили как средство, которое замедляет печать. Теперь везде будет Qwerty до конца наших дней.

А дальше начали происходить более плохие вещи. В 80-х Коэн, занялся анализом статистической мощности, и ввёл дефолтное значение для константы Бета. То есть Альфа это вероятность ошибки первого рода. Ситуация, когда у нас на самом деле нет никакой разницы между нашими бенчмарками, но стат-тест подумал, что есть, там falsepositive. А Бета обозначает вероятность ошибки второго рода. Когда у тебя разница есть, но ты подумал, что нет falsenegative.

Эта Бета очень часто берется равным 0.2. Это тоже число взятое просто от балды. Коэн написал: Ну, там ошибка второго рода, наверное, раза в четыре более критичная, чем ошибка первого рода. Ошибка первого рода это 0.05. Давайте домножим на четверку. То есть чувак просто взял одно случайное магическое число, домножил на другое число, получил 0.2 всё, новый индустриальный стандарт, все его используют.

При этом там чётко было написано: Ребята, это конвенция только для тех, кто не знает, что он исследует, зачем исследует, и как будут применяться эти результаты. Только если у вас вообще нет никакого представления о том, что вы делаете, можете взять 0.2, но вообще думайте своей головой. Но этот факт никто не заметил, все используют дефолт. И то не очень часто, потому что статистическую мощность и эту Бета очень сложно оценивать. Это вроде как необходимый шаг в применении стат-тестов, но на него все забивают. Потому что ну сложно, зачем?

Эта система приводит к тому, что очень много крутых, умных учёных изо дня в день занимаются какой-то несусветной хренотнёй.

Там всё плохо. В научные журналы по физике, математике, психологии, биологии, генетике каждый день идёт масса статей, в которых люди занимаются просто ерундой. Это вредительство. И этим подходам обучаются новые студенты.

То, как их используют это просто жесть. Например, мы хотим подать статью в научный журнал. С нас требуют указать P-value. В научный журнал можно подать только значимый результат поэтому P-value должно быть меньше, чем условный 0.05. Если у тебя получилось там 0.049 или 0.051, ты такой: Йей! У меня почти значимый результат!.

Если у тебя получилось 0.9, тогда ты делаешь просто ещё один эксперимент, а потом ещё один. И вот из наших фишеровских опытов с навозом мы помним, что если сделать 20 экспериментов, то хотя бы в одном P-value получится таким, какое нам нужно. И всё, и мы все равно сможем опубликовать статью.

Я не говорю, что так делают абсолютно все. Есть люди, которые понимают как работают стат-тесты, зачем они нужны, как их правильно использовать и используют по делу. Но основная масса занимается чепухой и пишет очень много статей, которые не имеют под собой статистическую основу. Они просто написали каких-то случайных чисел, и от этого очень, очень, очень грустно.

Если мы возьмём науку там повально все обмазаны этими стат-тестами. На продакшне тоже очень многие берут их например, делают с их помощью любые АБ-эксперименты.

Типичный пример: в красный нам надо покрасить кнопку или в синий? Мы делаем АБ-эксперимент, засовываем всё в чудо-формулу, получаем P-value и нам говорят цвет. И мы такие: Вот, мы там применили какую-то научную формулу, вот мы сделали решение, вот наш дизайн. А это ещё хрен проверишь, потому что валидацией результатов мало кто занимается в долговременной перспективе. И вроде то, что мы сильно продолбались не видно.

И да, все это массово используют.

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

Если не хочешь разбираться, можешь спросить у человека: Какая статистическая мощность у вашего теста? Если человек тебе не ответит (а большинство людей не отвечают на такой вопрос), то можно говорить: До свидания!.

Статистическая мощность это число от 0 до 1. Тебе его должны назвать. Или дать формулу, с помощью которой она оценивается. Во многих сложных случаях мощность не обозначается одним числом, а, например, зависит от данных, от форм распределения, от других дополнительных условий. Но это неважно. Важно ответит он или нет. Если он скажет: А я не знаю или Мы что-то не считали никогда то это проблема.

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

Все вокруг так делают, а миллион леммингов не может ошибаться.

Это очень спорный тезис, потому что типичный ответ тех, кто любит использовать стат-тесты Остальные просто не умеют их правильно использовать, поэтому у них проблемы. А я умею. Есть люди, которые действительно умеют. И у них всё хорошо. Но таких людей меньшинство. Работает замкнутая система люди используют стат-тест, учат других людей, те передают это следующему поколению. Критика существует уже очень давно, многие говорят, что мы должны забанить P-value, и не использовать это никогда ни в работах, ни в журналах! Но как-то оно не уходит.

Проблема в том, что альтернативные методы чаще всего сложнее. Там реально нужно думать, там нет универсальной формулы, которая легко ложится на все задачи.

А задача исследователя в том, чтобы проанализировать предметную область и подобрать те подходы и параметры, которые лучше всего на эту предметную область лягут. Это сложно, это надо думать. Думать не хочется. Зачем мне что-то изучать, зачем мне думать, когда у меня есть готовая формула, которая в один клик посчитает мне всё, что нужно.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru