Почем методы? (Сравнение скорости работы методов в .NET)

Сегодня мы рассмотрим скорость работы методов.

К сравнению представлены следующие типы «методов»:

  1. вызов метода своего класса (this),
  2. вызов метода другого класса,
  3. вызов виртуального метода (virtual),
  4. вызов переопределенного виртуального метода (override),
  5. вызов события (event),
  6. вызов делегата на базе лямбда выражений (Lambda expressions).

Была написана небольшая программка, прогоняющая в 8 подходов каждый тип по 100 000 000 раз. Вызываемые методы не делали ничего, сразу возвращая управление.

Во время сбора данных стало понятно, что характер результатов зависит от производителя процессора. Процессоры AMD выполняли тест значительно медленнее чем процессоры от Intel.

Результаты

По полученным данным были построены следующие диаграммы:

Процессоры Intel показывают достаточно ровный рост вычислительных издержек методов в порядке тестирования. Из общего правила выбивается Intel Core i7, в первом тесте его опережает более слабый «пентиум».

Характер работы с процессорами от AMD немного другой, затраты на вызовы методов последних 4х групп отличаются незначительно.

На следующей диаграмме отображены общие результаты.

Выводы

Изучив данные, можно сделать следующие выводы:

  • Вызов метода своего класса через this примерно в 2 раза быстрее вызова метода другого класса.
  • Сделав метод виртуальным он станет вызываться от 2х до 3х раз медленнее, переопределенные методы будут вызываться с такими же издержками.
  • Вызов события медленнее от 2х до 4х раз нежели вызов простого метода класса.
  • Вызов делегатов через лямбда-выражение стоит в 5 раз больше на процессорах от Intel и в 2 раза больше на AMD.
  • В целом вызовы на процессорах от Intel стоят меньше чем аналогичные на процессорах AMD (до 2х раз).

Надо отметить, что подавляющее большинство машин выполняет 100 миллионов вызовов любого типа быстрее чем за секунду! Задумываться о стоимости методов имеет смысл только в особенных случаях, когда количество вызовов сопоставимо с указанным выше числом.

Лист с подробными результатами: methodsBenchmark

Тестовую программу можно скачать здесь.

Большое спасибо justserega и Drug за помощь в проведении тестирования 🙂

  • http://www.google.com/profiles/theaspect Constantine

    Забыл про самое главное: ответить на вопрос почему результаты именно такие. Вдруг я поменяю параметры местами или переименую метод и графики поменяются с точностью до наоборот.

    • Vladislav Pozdnyakov

      Над следующими постами буду работать тщательнее 🙂
      Результаты такие в силу реализации каждого метода (прямой вызов метода, извлечение адреса класса, оверхэд на таблицу виртуальных методов, оверхэд делегата).
      Параметров у методов нет, а имена используются только в высокоуровневых языках, в исполняемом коде они заменяются на адреса.

      • http://www.google.com/profiles/theaspect Constantine

        >в исполняемом коде они заменяются на адреса.
        Ооооочень сомневаюсь. Код же не перестанет работать, если я подсуну dll-ку с измененным порядком методов. Тем более во всяких жабодотнетах.
        >Результаты такие
        просто крайне интересно почему у амдешек не сильно отличаются результаты виртуальных-методов-лямбд, в сравнении с интелом. Хитрые оптимизации какие-то.

        • Vladislav Pozdnyakov

          Код же не перестанет работать, если я подсуну dll-ку с измененным порядком методов. Тем более во всяких жабодотнетах.

          dll -ки .NET не содержат исполняемого кода, они содержат IL-код (где методы имеют имена), который компилируется в исполняемый(машинный) перед непосредственным выполнением.

          просто крайне интересно почему у амдешек не сильно отличаются результаты виртуальных-методов-лямбд, в сравнении с интелом.

          Интересно, но тут нужно копать исполняемый код и знать особенности его выполнения на процессоре. Моих знаний тут не достаточно.

          Хитрые оптимизации какие-то

          Скорее их отсутствие в AMD.

          • http://www.google.com/profiles/theaspect Constantine

            да, с dll-ками это я конечно загнул.

      • http://www.google.com/profiles/theaspect Constantine