Какое снижение производительности при большом .maxstack? - PullRequest
2 голосов
/ 28 июня 2010

Я работаю над написанием компилятора, и одна особенность этого компилятора состоит в том, что он автоматически генерирует методы GetHashCode (), Equals (объект) и Equals ({тип этого значения}) для типов значений.Сейчас реализация Equals ({этот тип значения}) в основном генерирует il, эквивалентный il, сгенерированному этим c #:

public bool Equals(ThisType o)
{
    return Field1 == o.Field1 && Field2 == o.Field2 && Field3 == o.Field3;//etc
}

Мой компилятор помещает все эти объекты в стек, а затем начинает сравнениеи "объединяя их.Это приводит к тому, что .maxstack метода очень быстро становится большим.Есть ли штраф за это?Если так, с какого момента я должен начать отправлять значения в локальные системы?

Спасибо.

1 Ответ

2 голосов
/ 29 июня 2010

Почему бы вам не оценить важные для вас сценарии и не выяснить это? Ваша производительность может варьироваться в зависимости от версии .NET или архитектуры процессора, так что вы действительно можете оценить варианты, которые вас интересуют. Насколько я понимаю, maxstack в основном используется для проверки, поэтому я бы предположил , что не будет большого снижения производительности, но единственный способ узнать наверняка - это измерить. 1004 *

Кроме того, в вашем случае вам вообще не нужны местные жители, чтобы избежать увеличения стека. Вы можете просто сделать что-то вроде этого:

  load Field1
  load o.Field1
  branch to end if not equal
  load Field2
  load o.Field2
  branch to end if not equal
  ...
  return true
end:
  return false

Используется постоянное пространство стека независимо от количества полей.

...