Пожалуйста, кто-нибудь может мне посоветовать, если в С#.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:
Предполагая, что это просто свойство и никакой код не работает при настройке, но более поздний код считывает значение свойства и выполняет только трудоемкие процессы, поэтому не входит в объем этого кода.
Исходя из вашего разъяснения, что никакой другой код не выполняется в качестве прямого результата настройки свойства, тогда нет никакой пользы для проверки.
Чтобы более подробно рассмотреть это, рассмотрите свой код:
if (myObject.IsActive != newActiveState)
{
myObject.IsActive = newActiveState;
}
Очевидно, что если значения не равны, и вы в конечном итоге устанавливаете значение, то общая сумма работы, которую выполняет процессор, больше, чем если бы она просто указала значение вслепую. То есть, он должен был выполнить проверку и установить переменную.
Если значения равны, тогда он должен проверять и разветвляться вокруг набора.
Так
Вам нужно будет провести анализ, чтобы определить, как часто устанавливается значение, а не задано, и использовать этот анализ для определения общего времени, затраченного на каждый из этих двух случаев. Вы могли бы придумать среднее время для этого бита кода, исходя из вашего ожидаемого соотношения наборов/веток. Затем вы можете сравнить это число с общим временем, затраченным на то же количество слепых записей.
Однако я избавлю вас от неприятностей. Если есть разница между ветвью и слепой записью, она будет очень-очень маленькой. Вероятно, доли микросекунды. Запись будет быстрой, потому что записанная память будет уже в кэше CPU. Независимо от того, какая разница (если таковая имеется) между веткой и записью, она не будет компенсировать дополнительную стоимость условного теста.
bool
, разница будет незначительной (если есть) . Определенно микрооптимизация.