0

我喜欢使用 Java(与 C 相比)的一个重要原因是有很多可用的内置数据结构(如 Collections API)。但是,这些数据结构的实现是否次优?为了获得更好的性能,我是否会更好地编写自己的实现?

4

3 回答 3

8

在解决具体的性能问题之前,我不会浪费任何时间重新实现 Java 集合库中的任何类。内置类已经过数千人的测试。它们被证明是有效的,并且对于大多数一般用例来说都是高性能的。我发现大多数时候当我发现 Collection 类的性能问题时,这是因为有人为问题选择了错误的数据结构,而不是该数据结构的错误实现。

于 2013-01-22T18:50:57.323 回答
1

内置实现非常快(它们在构建时考虑到了性能)并且对于绝大多数应用程序来说足够快。

对于您的情况,它是否足够快取决于您的应用程序和硬件,例如,如果您有一个快速的 CPU,但内存受到限制,反之亦然,这可能会产生巨大的影响。

如果您正在开发一些需要极高性能的东西,我建议您首先创建一个小测试项目,该项目具有您需要支持的数据负载和处理级别,以让您自己更有信心它会足够快地运行您的目标硬件。如果不是,您可以调整算法、购买更好的硬件、使用缓存等,或者切换到“更接近金属”的语言。

注意不要落入优化一切的陷阱——通常它只是需要优化的应用程序的一小部分。

于 2013-01-22T19:04:12.750 回答
-2

JCF最大的优势在于灵活性不一定是性能;它具有出色的设计,可让您轻松地从一个系列更改为另一个系列。它具有使它们成为线程安全、不可变等的实用程序类,或者您可以实现自己的自定义集合(通过实现接口并将其与最近的现有实现组合):

public MyList<E> implements List<E> {
    private List<E> holdingList = new ArrayList<E>();

    @Override
    public boolean add(E e) {
        //your custom needs
    }
    //delegate non custom ones to holdingList    
}

如果您真的被性能问题所困扰,那么您可能应该使用良好的旧数组,但在大多数情况下,这并不一定。

但是,您应该对 JCF 的内部结构有所了解,以便从中获得最佳性能;从某种角度来看,它们可能会受到批评,因为它们往往会消耗大量内存。

一些基本的事情:很高兴知道使用的排序是合并排序,它对就地排序进行排序,但比快速排序慢一点。您应该预测要使用的集合的大小,并将其作为值传递给构造函数,而不是总是依赖默认值。另一个重要的事情是选择合适的收藏;当 List 可以使用时不要使用 Map,因为它会占用更多内存。您还应该确保不要保留无用的空集合,因为它们也占用内存。您可以在此处找到有关集合和内存使用的精彩文章。

于 2013-01-22T19:04:06.433 回答