繁体   English   中英

使用集合属性了解时间复杂度

[英]Understanding Time Complexity with Set Properties

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

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

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

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

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

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

但是您可以使用 boolean 做得更好:

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM