Cod*_*der 3 c# performance accessor
哪个是更好的编程习惯,为什么?
我有一个这样的课:
class data {
public double time { get; internal set; }
public double count { get; internal set; }
public average_count { ... }
}
Run Code Online (Sandbox Code Playgroud)
其中average_count应为read_only并计算计数/时间.
将访问者编写为:
public average_count { get {
return (time == 0) ? 0 : (count / time);
}}
Run Code Online (Sandbox Code Playgroud)
或者我应该做以下事情:
private _avg_count;
public average_count {
get
{
return _avg_count;
}
internal set
{
return _avg_count;
}
}
Run Code Online (Sandbox Code Playgroud)
在时间和计数集访问器中更新_avg_count的位置?
看起来第一个更容易阅读,但如果经常访问average_count可能会更慢.编译器优化是否会使差异无关紧要?
Ski*_*ick 13
即时执行会产生更易读的代码.预先计算可以提高性能,但是只有在(a)有必要和(b)您已经分析并且它有所不同时,您才应该这样做.
最重要的是,可读性和可维护性只有在绝对必要时才能牺牲性能.
这是一个看似简单的问题,但几乎不可能回答.原因在于"正确"取决于许多因素.
在他的回答中,Skilldrick建议您更喜欢可读性优于一般规则的内容:
只有绝对必要时,才能牺牲可扩展性和可维护性 .
我会反驳说,这只适用于典型的商业应用程序,其中性能和功能是两个明显可区分的功能.在某些高性能软件场景中,这并不是一件容易的事情,因为性能和功能可能会变得密不可分 - 也就是说,如果程序完成任务的程度取决于它的执行情况(这种情况就是如此)我目前的工作地点,一家进行算法交易的公司.
所以这是你的判断.最好的建议是在你有一个问题时进行分析; 如果在你的情况下牺牲性能的可读性是合适的,那么你应该这样做.
0xA3建议一种相当优雅的方法,提供各种类型的折衷:只根据需要计算值,然后缓存它.
当然,这种方法的缺点是它需要更多的内存来维护.An int?需要与int加号a 基本相同的内存量bool(由于对齐问题,实际上可能意味着64位而不是40位).如果你有这个data类的实例的加载和加载,并且内存是你所瞄准的平台上的稀缺资源,那么每个实例的另外32位膨胀你的类型可能不是最聪明的举动.
也就是说,我总体上同意其他人所说的,在其他条件相同的情况下,你最好在可读性方面犯错,以便在将来重新访问时能够理解你的代码.然而,这个问题的各种方法都没有特别复杂.
最重要的是,只有你知道自己的确切情况,因此你才能最好地决定在这里做什么.