最新版与按需版

时间:2009-04-13 17:48:56

标签: c# .net

我不知道标题是否有意义,但基本上我想知道人们在是否需要更改公众成员时,或者只要他们被访问时,是否会计算公众成员的意见?

假设你有一个类似CustomCollection的类,它有一个名为Count的属性。应该为每个CountAdd等操作更新Remove,还是应该在访问时进行计算?

保持最新状态似乎很直观,但您想知道,人们多久会拨打AddRemove等与.Count

还有一个混合版本,您可以在访问该属性时缓存它吗?我认为这需要更新另一个变量,对吗?

6 个答案:

答案 0 :(得分:4)

当你说你必须考虑访问这些功能的频率时,你是对的。如果始终访问count,则不应该按需,因为这将比必要的慢。如果更多地访问其他功能,那么每次重新计算count也是一种浪费。

如果标志设置为false,那么中间地带将根据需要计算count,然后将标志设置为true。调用addremove等会将标志设置为false。

这样的事情:

Class CachedCount 
   int count = 0;
   boolean count_is_valid = false;

   int getCount()
       if count_is_valid
           return count;
       else
           count = calculate_count();
           count_is_valid = true;
           return count;

    void Add(item)
        count_is_valid = false;
        ...

    ...

请注意,如果您连续几次访问count而没有访问addremove等,并且访问{{1},那么这实际上只会带来好处}},add等不与remove的调用交错。如果请求是交错的,那么这样做的好处就会丢失。最大的好处来自于:count而不是add, add, add, remove, remove, add, count, count, count, count, count, count

答案 1 :(得分:4)

关于类的 state 的大多数信息应始终是最新的,因为它是操纵数据的副作用。例如,Count属性基于数据的内部存储(即数组长度)。

可能需要计算依赖于类的某些状态的其他属性。对于exaple,ContainsValidOrder属性可能取决于类中的订单。对于这些属性,您必须评估类的使用,并确定在添加和删除集合中的项目时计算值的成本是否更便宜,然后在每次访问属性时扫描整个集合。

然而,.NET guidlines确实建议属性不执行复杂的代码,并且重复访问属性不会产生任何副作用或性能影响。因此,对于表示计算数据的属性,最好使用方法GetXXX。这向使用您的库的开发人员表明1.计算可能需要一些时间,并且2.他们应该保留他们任务的duratino的值。

答案 2 :(得分:2)

取决于更新计数所需的时间,如果它是一个耗时的过程并且您不经常调用Count我会选择在您调用函数时更新计数而不是每次修改集合时都会更新。

答案 3 :(得分:1)

这个答案取决于申请的类型。具体情况。

对于计数变量,我通常会动态更新它,因为计算成本可能过高,而且存储成本非常低。

在其他情况下,计算的成本可能非常低,但存储成本可能很高(可能需要保持代码的位数以保持准确)

答案 4 :(得分:1)

您可能希望做一些关于访问这些公共成员的频率与计算它们所需时间的指标。如果让它保持最新是一项微不足道的操作,那么以更直观的方式进行操作,如果它是一个复杂的更新操作但很少被访问,那么按需提供它可能是有意义的。

答案 5 :(得分:1)

按需可以说更简单,因此通常可以被认为更好。

至于性能,大多数应用程序可能不会注意到差异。两种方法都有其背后的作用;最新策略可能导致不必要的计算,而按需可能会导致您多次执行相同的计算(但另一方面,客户可以自行存储计算值,从而避免双重工作) 。按需还可以创建更小的对象,理论上意味着更少的缓存未命中和更少的垃圾收集,这两者都会极大地损害性能。但是,我估计大多数应用程序都不会注意到。

顺便说一下,如果计算非常昂贵,那么如果我正确记住.Net编码指南,它就不应该属于属性。