Брент Роуз, партийный функционер говорящая голова сообщества РНР и автор очередного конкурирующего стандарта фреймворка Tempest, объявил конкурс, весьма вторичный, после эпичного One billion row challenge (который и сам по себе уже был вторичен, по отношению к оригинальному 1brc), но кто ж считает, когда на кону такие призы, как плюшевый слон от JetBrains!
История вопроса: некоторое время назад наш незадачливый разработчик вдруг обнаружил, что event sourcing, столь прекрасно выглядевший на бумаге, внезапно забуксовал при попытке реального применения концепции "один и тот же код для однократного вызова и для восстановления состояния по исходным данным АКА провернуть мясо в фарш заново". И выполняется, буквально сутками. И в итоге Брент засел за оптимизацию, открыв для себя такие крутые хаки для работы с MySQL, как множественный INSERT или оборачивание отдельных запросов в транзакцию.
При этом двух блог-постов на тему оптимизации ему показалось мало, да и к тому же новый фреймворк сам себя не разрекламирует. И в итоге появилась идея конкурса. Который к исходной задаче уже никакого отношения не имеет, а представляет собой банальный парсинг CSV.
Конкурс объявлен вчера и продлится две недели.
За первые сутки было подано около 80 заявок, из которых обработано 60. Разумеется, самый большой интерес вызывает лидер с конца, которому удалось превысить результат ближайших соперников болee чем в два раза. При беглом взгляде на его решение причина видится в том, что он перепутал конкурс по скорости с конкурсом по экономии памяти и зачем-то пишет все промежуточные результаты в файл, причём не один, а множество.
Далее довольно плотным пелетоном идут стандартные решения с результатами в пределах 100-150 сек, реализующие различные варианты построчного чтения. При этом видно явное преимущество использования stream_get_line(), которая в одном вызове объединяет функции чтения и парсинга. Также стоит присмотреться к stream_set_read_buffer().
Ну а в топе, с таймингами меньше 50 секунд, идут, разумеется, паралеллисты. Результаты которых довольно предсказуемы, и зависят в основном от того, сколько воркеров хватило наглости поставить. Впрочем, результат тройки лидеров даже на их фоне впечатляет - 6-7 секунд. И, похоже, код лидера стоит серьёзного изучения.
Но лично мне бы хотелось, чтобы было два разных зачёта - с параллельностью, и без. Чтобы видеть "чистые" оптимизации.
roxblnfk
Там же есть призовое место за самую быструю обработку на одном ядре
FanatPHP Автор
Спасибо, действительно! Изучаю код текущего лидера. Пока совершенно непонятно, за счёт чего он оторвался от конкурентов...