Может ли статический конструктор снизить производительность доступа к статическим методам? - PullRequest
6 голосов
/ 15 ноября 2011

Статический конструктор выполняется при первом обращении к статическому члену.Зная это, у меня есть несколько вопросов:

  • Означает ли это, что каждый раз, когда я обращаюсь к статическому методу, среда выполнения должна проверять, был ли вызван статический конструктор?
  • Влечет ли это снижение производительности?
  • Избегают ли статические классы "без конструктора" этого снижения производительности?

[EDIT] : Я хотел бы уточнить, что меня НЕ касаетсямикрооптимизация.
Я задаю этот вопрос, потому что это решение design .Если статический конструктор подвергнется снижению производительности, я разработаю свой код с учетом этого и буду больше знать о решениях, которые могут повлиять на производительность.

Вот пример, иллюстрирующий мой вопрос.Будет ли какая-то польза от использования метода Independent и помещения его в отдельный статический класс?Таким образом, не нужно проверять, была ли инициализирована статическая Test.[ Обновление Смотрите мой ответ ниже для лучшего и более простого примера].

static class Test {
  // Static constructor with dependent method:
  static int x;
  static Test() { x = 5; }
  static int Dependent() { return x; }

  // Static, independent method:
  static int Independent(int y) { return y+1; }
}

Вот цитата из спецификации C # о статическом конструкторе:

Выполнение статического конструктора инициируется первым из следующих событий, происходящих в домене приложения:

  • Создается экземпляр класса.
  • Ссылки на любой статический член класса.

Ответы [ 3 ]

7 голосов
/ 16 ноября 2011

Из-за отсутствия ответов и под руководством @ Jobo я решил проверить это для себя.

Вот мои тестовые классы:

static class WithConstructor {
    static WithConstructor(){ }
    public static int Square(int x){ return x*x; }
}
static class NoConstructor {
    public static int Square(int x){ return x*x; }
}

Скомпилировано для выпуска с использованием .NET 4.0, результаты были очень согласованными:

╔═════════════╦══════════════════╦═════════╦═══════════════╗
║ Iterations: ║ With Constructor ║ 4513 ms ║ Improvement:  ║
║ 1000000000  ║ No Constructor   ║ 3072 ms ║ 33%           ║
╚═════════════╩══════════════════╩═════════╩═══════════════╝

Поэтому ясобираюсь ответить на мои собственные вопросы:

  • Если существует статический конструктор, то статический метод будет иметь (микроскопический) удар по производительности, потому что всегда должен проверяться флаг beforefieldinit.

  • Если статического конструктора не существует, то метод не приведет к снижению производительности.

2 голосов
/ 15 ноября 2011

Почему бы не проверить это самостоятельно?

Вызовите свой независимый метод несколько раз, как указано выше. Затем создайте собственный статический класс с тем же методом и вызовите его столько же раз.

Используйте http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx для измерения.

Полагаю, это не имеет значения ...

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

0 голосов
/ 05 января 2015
Статический конструктор

может снизить производительность первого вызывающего метода. Indead, первый вызывающий абонент изменен на проверку, если статический конструктор уже вызван, но другой вызывающий, если не затронут.

...