Проверяется ли значение свойства перед установкой, и устанавливается ли оно, если оно отличается, быстрее или медленнее, чем настройка вслепую?

1

Пожалуйста, кто-нибудь может мне посоветовать, если в С#.Net более эффективно проверять значение свойства перед настройкой и устанавливать только, отличается ли значение или он более эффективен, чтобы просто слепо установить его в новое значение?

Например:

bool newActiveState = true;

// Only set the value if it differs
if(myObject.IsActive != newActiveState )
{
     myObject.IsActive = newActiveState;
}

против

bool newActiveState = true;

// Set it blindly
myObject.IsActive = newActiveState;

Помогает ли один компилятор лучше, чем другой? Один из способов дает лучший подсказку компилятора?

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

Обновление основано на вопросе уточнения ~ Адам Houldsworth:

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

  • 5
    Это зависит от размера устанавливаемых данных и от того, выполняется ли какой-либо код при изменении значения.
  • 2
    Это зависит от данных, но только для простого поля bool , разница будет незначительной (если есть) . Определенно микрооптимизация.
Показать ещё 1 комментарий
Теги:
optimization
properties

1 ответ

1
Лучший ответ

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

Чтобы более подробно рассмотреть это, рассмотрите свой код:

if (myObject.IsActive != newActiveState)
{
    myObject.IsActive = newActiveState;
}

Очевидно, что если значения не равны, и вы в конечном итоге устанавливаете значение, то общая сумма работы, которую выполняет процессор, больше, чем если бы она просто указала значение вслепую. То есть, он должен был выполнить проверку и установить переменную.

Если значения равны, тогда он должен проверять и разветвляться вокруг набора.

Так

  • если проверка и ветвь быстрее, чем запись
  • и количество времени, сохраненного в чек-и-ветке, составляет дополнительное время записи
  • то условное может быть быстрее

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

Однако я избавлю вас от неприятностей. Если есть разница между ветвью и слепой записью, она будет очень-очень маленькой. Вероятно, доли микросекунды. Запись будет быстрой, потому что записанная память будет уже в кэше CPU. Независимо от того, какая разница (если таковая имеется) между веткой и записью, она не будет компенсировать дополнительную стоимость условного теста.

  • 0
    Спасибо, это такие вещи, как скорость чтения и записи, о которых я понятия не имею. Кроме того, я понятия не имею, если CLR имеет проверки на равенство или оптимизацию, которые он уже применяет, поэтому мне не нужно. Я полностью понимаю, что если мой сеттер имеет дорогой код, то есть преимущество, но он не был уверен, что сеттер не дорогой. Спасибо за разъяснения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню