定制系列-仍然值得额外的工作



对不起,如果我不了解我的术语,我只有大约2.4年的编程经验,主要是在.NET.中

目前,我是一家大型机商店的两名.NET开发人员之一,另一名开发人员制定了标准,是一名出色的程序员,拥有丰富的经验和CS学位(我是100%自学成才的)。

我们对每个应用程序都使用自定义集合,最近从.NET 2.0开始,我让他使用泛型而不是ArrayLists,而且它们的性能看起来很棒。我们开发了一个自动化程序,该程序使用SQLDMO连接到数据库,并将为我们想要的任何对象创建基本数据层和业务层,此外,它还处理逻辑删除等。

当性能是你优化的目的时,你什么时候可以证明不使用自定义集合并为其编写自定义排序?目前,我们使用硬编码排序,因为我们所看到的一切都慢得多,因为大多数其他选项都使用反射或膨胀的数据集/LINQ(与自定义集合相比,它仍然像一年前那么慢吗?)。

是否有其他人严格使用自定义泛型集合,而不是走简单的路线?性能牺牲是否像我所相信的那样重要?由于我仍处于职业发展的初级阶段,我想说下一个合乎逻辑的步骤是我自己开始制定基准,但我也想征求其他专业人士的意见。。。。那么,其他人是怎么做到的呢?我是唯一一个真正严格使用自定义集合而不是更快更容易创建解决方案的人吗?

如有任何意见,我们将不胜感激。

编辑:很抱歉用了这个术语,我知道我会有点不对劲。我所说的自定义集合实际上是指使用自定义类,以及一个继承List(Of T)并实现IComparable来处理排序的自定义集合类。

当涉及到优化和收集时,您应该首先考虑算法的复杂性。

一个简单的例子是——如果你有一个对象列表,并且你一直在这个列表中查找东西,并且它变得很大,那么你可能会更好地使用Dictionary。字典查找具有与列表不同的查找复杂性保证(在O(logn)和O(1)之间,而不是O(n)之间)。

如果你还没有熟悉各种集合类的算法复杂性,那么让自己熟悉它是值得的(如果你完全不熟悉,请查看维基百科的文章)

如果您使用的是关联集合,如Dictionary,还应该检查您是否在集合中的对象上使用了GetHashCode()的最佳实现

.Net的问题(注意:到目前为止,我自己只使用过.Net 2.0)是,它们没有很好的集合类范围,而且它们的复杂性保证也没有像应该的那样广为人知

就我个人而言,我用优秀的PowerCollections来扩充我的收藏,它添加了Set和MultiDictionaries等。这给了你更多的工具可供选择,这意味着你可以更多地选择正确的工具。

到目前为止,我还没有遇到过由于内建(或PowerCollection)集合(除了旧的预泛型版本)性能不佳而不得不编写自定义集合类的情况。我的感觉是,如果在确保使用了正确的复杂性并进行了分析后,发现它们的性能仍然不够,那么.Net可能不是您应用程序的最佳选择。YMMV。

我也使用通用列表或字典,但我经常基于通用列表或词典创建自己的类。所以我可以定义一个class CustomerList : List<Customer>。这允许我向类添加自定义功能,也允许我稍后在需要时轻松地用自定义实现替换它。

我建议在早期开发中使用标准泛型集合。如果以后发现性能瓶颈,可以使用自己的自定义集合进行重新设计。借用《代码完整》一书的作者Steve McConnell的话来说,人类在估计性能方面是出了名的糟糕。除非你确切知道该类及其方法将被访问多少,否则还不值得进行验光。

我总是使用泛型集合。我可能偶尔会从现有的泛型类派生自己的集合类,以添加自己的方法和行为,但它仍然是泛型的。如果性能是一个很大的问题,那么您可能不会使用内置的集合类。

我个人使用标准的Generic集合,最常见的是List和Dictionary。如果可能的话,我会尝试在数据库中进行排序,因为我发现它更容易管理。

我看不出哪里真正需要自定义集合,它也不会提供性能改进,而且它使它在实现中不那么熟悉。

在2.0 中引入Generics之前,自定义集合要常见得多

自定义集合在接口中使用时可能具有优势,因为与使用标准集合相比,您可以更好地控制如何使用它们。不过,一定要始终返回一个接口,而不是具体的类。这样,用户就不必关心集合类的类型,并且可以在不破坏接口的情况下更改实际类型。

在大多数情况下,您可以使用默认集合之一。

现在使用.net 3.5时,我使用通用集合类(List、Dictionary),如果我需要将逻辑添加到这些集合中,我使用扩展方法。例如:

public static class Extensions
{
   public static Customer GetCustomerByName( this List<Customer> customers )
  {
     …
    return customer;
  }
}
var customers = new List<Customer>();
customers.Add( new Customer());
var customer = customers.GetCustomerByName( “Smith” );

我最近收集了许多使用自定义集合可能很有价值的情况(和基准测试)。它与.NET没有直接关系,但它是一个相当普遍的考虑因素,可能有助于决定什么集合更适合特定的问题。

阵列、字典、集合–性能、功能、可靠性

最新更新