Понимание сложности времени с установленными свойствами - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь уменьшить количество строк в моем коде, чтобы повысить скорость выполнения моего приложения Windows. До сих пор я понял полезность использования свойств, когда дело доходит до добавления условий в полях get и set. Однако я не уверен, что использование свойств помогает улучшить сложность времени по сравнению с установкой базового значения, за которым следуют условные выражения в определенных методах. Я приведу пример того, что я сделал первым и что я улучшил. Если кто-то может поделиться некоторыми советами о том, помогает ли текущее усовершенствование сократить время обработки, а также если оно следует простейшей нотации Big-O, которая, как мы надеемся, O (n), я был бы признателен за отзыв.

Старый

public float tempP1 = 1.0f;
public void addToP1() {
        tempP1 += 0.4f;
        tempP1 = (tempP1 > 2.0f) ? 2.0f : tempP1;
}

Новый

private float _tempP1 = 1.0f;
public float tempP1 { get { return this._tempP1; }
        set {
                value = (value > 2.0f) ? 2.0f : value;
                this._tempP1 = value;
        }
}

public void addToP1() {
        tempP1 += 0.4f;
}

1 Ответ

1 голос
/ 01 октября 2019

Сокращение количества строк кода не всегда означает улучшение скорости выполнения.

То, что определяет скорость, - это, во-первых, количество вызовов методов (свойства являются вызовами для методов получения и установки), а также тип-тип, типы данных (например, массивы или List <>), циклы (для vs-foreach). ) и тесты условий, расчеты и такие вещи, как использование кучи и стека, доступ к памяти, доступ к вводу-выводу, аппаратные и программные прерывания ...

Для повышения скорости необходимо: сократить вызовы методов, исключить бесполезный код, тщательно выбирайте типы, используйте вместо или foreach, избегайте Linq, используйте StringBuilder вместо String для манипулирования большими строками ...

Ваш «старый» код (5 строк) практически оптимизирован как есть.

Ваш "новый" код (10 строк) не из-за вызова, введенного с get и set, даже если компилятор их оптимизирует.

Но вы можете добиться большего, используя логическое значение:

bool reached = false;
public float tempP1 = 1.0f;
public void addToP1()
{
  if ( reached ) return;
  tempP1 += 0.4f;
  reached = tempP1 > 2.0f;
  if ( reached )
    tempP1 = 2.0f;
}

Вы можете скомпилировать в режиме релиза и проверить, включена ли оптимизация в настройках / сборке проекта.

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

Конечно, вы можете использовать IL.

...