【问题标题】:Understanding Time Complexity with Set Properties使用集合属性了解时间复杂度
【发布时间】:2020-01-30 23:03:46
【问题描述】:

我正在尝试减少代码中的行数,以提高 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;
}

【问题讨论】:

  • 我认为没有人能够确定地告诉您哪个对您的用例来说更快。你最好的选择是在你的代码中自己测试它。还要小心像这样过度设计的东西。您可能花费了太多时间来将执行时间缩短千分之一秒。

标签: c# properties set time-complexity big-o


【解决方案1】:

减少代码行数并不总是意味着提高执行速度。

决定速度的因素首先是方法调用的数量(属性是对 getter 和 setter 的调用),以及类型转换、数据类型(例如数组或 List)、循环(for vs foreach)和条件测试、计算以及诸如堆和堆栈使用、内存访问、I/O 访问、硬件和软件中断之类的事情......

为了提高速度,你应该:减少方法调用,消除无用的代码,仔细选择类型,使用 for instead 或 foreach,避免使用 Linq,使用 StringBuilder 而不是 String 来操作大字符串...

您的“旧”代码(5 行)几乎按原样优化。

您的“新”代码(10 行)不是因为 getset 引入的调用,即使编译器对其进行了优化。

但是使用布尔值可以做得更好:

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。

【讨论】:

  • 我担心会是这样。我确实注意到,每当更改值时,set 属性都会重复调用自身,从而添加到代码行中。如果是这种情况,那么依赖属性而不是字段的主要目的是什么?如果前者会通过生成更多调用来明显减慢该过程?
  • 属性是用来控制使用 getter 和 setter 的值。它们在 OOP 中非常重要。你可以看看Using Properties (C# Programming Guide)Why use getters and setters/accessors?Mutator method
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多