Пример довольно хороший, и вопрос интересный (я согласен с Робертом в том, что вам следует хотя бы раз запустить сам метод Main, прежде чем выполнять какие-либо измерения, так как инициализация сортов не должна рассматриваться как часть теста.)
При этом одно из ключевых отличий между XmlSerializer и BinaryFormatter (помимо очевидного) заключается в том, что XmlSerializer не пытается отслеживать ссылки. Если у вашего графа объектов есть несколько ссылок на один и тот же объект, вы получаете несколько копий в XML, и это не разрешается должным образом (обратно в один объект) после десериализации. Хуже того, если у вас есть циклы, объект вообще не может быть сериализован. Сравните это с BinaryFormatter, который отслеживает ссылки и надежно восстанавливает граф объектов независимо от того, сколько и какого типа ссылок на объекты вы можете иметь. Возможно, накладные расходы этого средства объясняют худшую производительность?
Основной причиной использования BinaryFormatter поверх XmlSerializer является размер вывода, а не производительность сериализации / десериализации. (Затраты на создание текста не так велики, это дорогостоящая транспортировка этого XML-текста.)