tfw список ошибок компиляции уже помещается на экран
tfw список ошибок компиляции уже помещается на экран
Пока я жду когда же кофе начнёт действовать, давайте поговорим о бенчмарках. Нет, я не предлагаю ставить phoronix test suite и бряцать своими железками, поговорим о муках выбора между двумя имплементациями функции.
Допустим я написал функцию f(const char,size_t) которая делает преобразование данных и делает это хорошо (но долго). Допустим я написал функцию f2(const char,size_t), которая делает то же самое преобразование и тоже делает это хорошо (и тоже долго). Как определить какая функция работает быстрее (на сферических данных в вакууме)?
Обычно я запускаю каждую функцию по сто раз (или по десять, если они реально медленные) и засекаю, сколько времени функции потратили на выполнение ста итераций, и вывожу количество затраченных миллисекунд в консоль. От запуска к запуску цифры скачут на 10-15%. Тогда я пишу ещё один внешний цикл, который запускает сто итераций десять раз и выводит лучшие времена среди этих десяти. Цифры теперь скачут на 5% — тут уже ничего не поделать, фрагментация памяти, случайные контекст свитчи, фазы луны. Можно увеличить количество итераций и тогда разброс стабилизируется, но всё равно мне ни разу не удалось сделать его менее одного процента, а время выполнения бенчмарка всё растёт и растёт.
Вопрос, как правильно выбирать критерий останова для подобных бенчмарках? Как сделать запуски сферическими в вакууме, чтобы ничего программе не мешало? callgrind не предлагать — он меряет количество выполненных процессорных операций, которое не обязательно отражает точное время (ибо кэшмиссы и прочее).
тем временем количество авто-тестов в рабочем проекте достигло четырёхсот. code coverage 38%
ты открываешь им свои исходники, а они не контрибьютят фиксы
Collections.unmodifiableCollection(...) не проксирует вызовы hashCode() и equals(Object). Хочешь класть в хэшмап — заворачивай в .unmodifiableList или .unmodifiableSet
tfw двое суток гоняешься за багой в HTTP-сервере, которая проявляется даже когда просто идёшь на ручку /ping, а оказывается что бага в реализации обработчика /ping, а не в самом HTTP-сервере. Я мудак и даже /ping без багов реализовать не могу
tfw смотришь на опенсурс проект, сердце исполняется скорби при виде этой говёной реализации хорошей идеи, а руки уже сами тянутся к текстовому редактору, чтобы написать свою реализацию
аххх, обожаю запах свежих кордампов по утрам
tfw просматриваешь байткод, чтобы найти lookupswitch в performance-critical функции и заменить его вручную на лукап в таблице. mfw функция начинает работать двое быстрее.
tfw самописный json-парсер оказывается в три раза быстрее того что используется сейчас в продакшене
вот есть всякие ragel, bison, lex, они все генерят DFA в итоге. А есть parser generator'ы которые работают на базе pushdown automaton (a.k.a. автомат с магазинной памятью)
в джаве нет множественного наследования (почти), нет метапрограммирования,у каждого объекта есть монитор, на который можно залочиться и которому можно нотифаи слать, все методы — виртуальные, в любой момент можно взять и перегрузить. есть gc, который позволяет не париться по поводу эксепшенов в деструкторе и прочих неподходящих местах. Программиста не спрашивают надо это ему или нет, ему просто дают кучу ништяков и при этом загоняют в новые рамки, чтобы он себе в ногу не выстрелил. Всё это напоминает Золотой Путь Бога-Императора Дюны, насильное принуждение программиста к спокойствию. Осталось выяснить, к какому Кразилецу нас готовит Гослинг
ну охуеть теперь, живёшь себе, думаешь что джаву знаешь, а оказывается у строк оператор += есть.
tfw когда на коленке написанная оттормаживающая http-прокся хорошо держит нагрузку и даже не сегфолтится. алсо, практика показала, что https://github.com/square/tape довольно шустро позволяет сохранять данные в файловую очередь и вычитывать. рекомендую
если вывернулся и избежал переизобретения велосипеда добавлением костыля, то это вин или успех?
дизлайк, если тоже пидарас, который заворачивает IOException в RuntimeException
лайк, если все структуры объявляешь как классы, чтобы потом не было путаницы с forward declarations
пока вы тут в вену ставитесь, реальные пацаны реальные проекты мутят: https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition/ найдено тут: http://thread.gmane.org/gmane.comp.misc.suckless/15363/focus=15364
использование #pragma once - это грех или тяжкий грех?
как прекратить программировать и пойти спать?