Arbob Ahmad and Henry DeYoung
http://www.google.com/search?q=Cache%20Performance%20of%20Lazy%20Functional%20Programs%20on%20Current%20HardwareCache Performance of Lazy Functional Programs on Current Hardware
Известно, что рантаймы функциональных языков зачастуют имеют отличные от императивных паттерны доступа к данным в памяти. А современные процессоры оптимизируются под паттерны поведения обычных программ, написанных на более распространённых языках.
Существует несколько исследований, показывающих, где и как функциональные языки неоптимально используют ресурсы процессора. Например, в исследовании 2002 года Nethercote и Mycroft исследовали поведение кэша при выполнении нескольких хаскель-программ, и нашли, что ожидания процессора при отсутствии данных в L2 кэше (cache miss stalls) составляли до 60% задержек при работе программ.
Товарищи из Carnegie Mellon решили ещё раз воспроизвести результаты теста 2002 года. Хардвер за десять лет поменялся довольно сильно, и хотелось определить, так ли пессимистично хаскель работает с кэшем второго уровня.
Использовали валграйндовый Cachegrind и
Perf, в частности.
Короче, опредилили, что на тех же данных процессор теперь практически не ждёт на миссах в L2. В 2002 году кэша было 256k, а в 2009 году кэша было уже 4 мега.
К сожалению, они ещё внезапно нашли, что дефольтный размер для нового поколения (nursery) в GC хаскеля составляел 256 kb. То есть, старые тесты 2002 года наверняка упирались именно в то, что дефолтные значения были слишком большими для имеющегося размера кэша. В 2009 году этот же размер оказался более приемлемым.
На мой взгляд, эта находка практически полностью переводит обе статьи, и старую и новую, из подобия науки в разряд тыкания палочкой. Авторы старого исследования не заметили, что упираются в nursery, а авторы нового даже не отметили роль влияния GC-опций GHC на скорость программ. Кроме того, за семь лет изменился и характер нагрузки, а считалось всё на тех же тестах с почти теми же параметрами. Ещё одним соображением являются не абсолютные цифры неоптимальностей в хаскель-программах, а сравнения с эффективностью обычных императивных программ, написанных, скажем, на C или C++. Как поменялась относительная эффективность за эти годы? Нет ответа.
As a result, we conclude that the change in L2 cache size is responsible for most of the performance improvement.
Перевожу: «увеличили кэш, стало быстрее работать». Вау.
И всё же, даже до такого уровня исследования абсолютному большинству российских студентов пилить и пилить.