定制系列 - 还值得额外的工作吗?

时间:2008-10-30 04:45:06

标签: .net performance collections generics

对不起,如果我的术语不合适,我只有大约2。4年的编程经验,主要是在.NET中。

目前我是大型机商店中的两个.NET开发人员之一,另一个开发人员设定了标准,并且是一个有很多经验和CS学位(我100%自学成才)的伟大程序员。

我们为每个应用程序使用自定义集合,最近因为.NET 2.0我让他使用泛型而不是ArrayLists,以及他们似乎做得很棒的眼球表现。我们开发了一个自动程序,它使用SQLDMO连接到数据库,并为我们想要的任何对象创建基础Datalayer和业务层,并且它处理逻辑删除等等。

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

是否有其他人严格使用自定义通用集合而不是简单的路线?表现的牺牲是否与我所认为的那样重要?因为我仍然处于我的发展生涯的初级阶段,我会说下一个合乎逻辑的步骤是让我自己开始基准测试,但我想得到其他专业人士的意见......那么,如何其他人都这样做吗?作为唯一一个真正严格使用自定义集合而不是更快更容易创建解决方案的人之一?

非常感谢所有意见。

编辑:对于这个术语感到抱歉,我知道我会得到一些东西。我所说的自定义集合确实是使用自定义类,以及继承List(Of T)的自定义集合类,还实现了IComparable来处理排序。

8 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

在优化和集合时,首先应该考虑算法的复杂性。

一个简单的例子是 - 如果你有一个对象列表,并且你不断地查找该列表中的内容,并且它变得非常大,那么你可能最好还是使用Dictionary。字典查找具有与列表不同的查找复杂性保证(在O(log n)和O(1)之间而不是O(n))。

如果您还没有这样做(如果您对它完全不熟悉,check out the wikipedia article),那么值得让自己熟悉各种集合类的算法复杂性。

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

.Net的问题(警告:到目前为止我自己只使用过.Net 2.0)是因为它们没有很好的收集类,它们的复杂性保证并不像它们那样广为人知。应该是。

就我个人而言,我使用优秀的PowerCollections来增加我的收藏,其中包括了Sets和MultiDictionaries等。这为您提供了更多可供选择的工具,这意味着您可以在更多时间选择正确的工具。

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

答案 2 :(得分:3)

我建议在早期开发中使用标准通用集合。如果您发现性能瓶颈,可以使用自己的自定义集合重新设计。用Code Complete的作者史蒂夫麦康奈尔来解释,人类在估计绩效方面非常糟糕。除非你确定该类和它的方法将被访问多少,否则它不值得进行优化。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我个人使用那里的标准通用集合,最常见的是List和Dictionary。在可能的情况下,我尝试在数据库中进行排序,因为我发现它更容易管理。

我没有看到真正需要自定义集合的位置,也没有提供性能改进,并且使其不太适合实现。

自定义集合在2.0中引入泛型之前更为常见

答案 5 :(得分:1)

自定义集合在界面中使用时可能具有优势,因为您可以比使用标准集合更多地控制它们的使用方式。但是,请务必始终返回接口而不是具体类。这样,您的用户就不必关心集合类的类型,您可以在不破坏界面的情况下更改实际类型。

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

答案 6 :(得分:1)

现在使用.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” );

答案 7 :(得分:0)

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

Array, Dictionary, Collections – Performance, Functionality, Reliability