Недавно наткнулся на сравнительный тест производительности компиляторов. Статья хоть и старая, да и тестируемые компиляторы не блещут новизной, однако подкидывает пищу для размышлений. Задуматься меня заставил раздел, в котором тестировалась работа с памятью. В этих тестах gcc рвал оппонентов как тузик грелку. В то время как на остальных тестах демонстрировал более чем посредственные результаты. Выглядело это как минимум подозрительно, т.к. остальные компиляторы показывали более-менее ровную работу.
Почесав тыковку, удалось вспомнить хорошо забытую статью. Наибольший интерес представляет вот этот отрывок:
В один из дней мы обсуждали какой-то алгоритм, требовавший распределения памяти. Я был убежден, что это решение неприемлемо, так как распределение памяти обошлось бы слишком дорого. Я произнес что-то вроде «ну конечно, если вы будете использовать этот тупоголовый распределитель памяти из Unix, то вы обречены на проблемы с производительностью. Нормальный распределитель снял бы все вопросы.». Один человек из присутствовавших на обсуждении сразу же набросился на меня: «Мне неприятно слышать, как вы опускаете Unix. И вообще, что вы знаете о распределителях памяти?». На что мой ответ был – «задержитесь на этой мысли, я сейчас вернусь». Я сходил в свой кабинет, где лежала копия книги IDL, принес ее с собой назад, и открыл главу «Распределение памяти». «Видите это?» - «Да». «Как называется эта глава?» - «Распределение памяти». Я закрыл книгу и указал на обложку – «Это имя вам знакомо?» - «Да, это ваше имя». «Отлично. Я написал эту главу, в которой рассказывается о разработке высокопроизводительного, минимально фрагментирующего распределителя памяти. Итак, вы спрашивали, что я знаю о распределителях памяти? Вообще-то, я написал на эту тему книгу».
Тут всё сразу встало на свои места. Т.е. жила была операционная система, которую все хорошо знают. И был у этой операционки чудовищный менеджер памяти. Разработчики данной системы покопались у неё в «кишках», поняли, что исправить что-либо нереально и «напрягли» разработчиков gcc, мол, вы, пацаны, подшаманьте там что-нибудь в своей библиотеке, что бы всё шустро бегало. Надо отдать должное разработчикам компилятора, они свою задачу выполнили. gcc по операциям с выделением памяти рвёт всех. Однако здравый смысл опять оказался побеждённым. Особую пикантность ситуации придает тот момент, что в теории хоть и декларируется, будто любой пользователь может изменять свободный софт, на практике вполне может оказаться, что даже самим разработчикам ссыкотно что-то менять в своей программе.