Java 缓慢的集合。不可修改的列表()

Java 缓慢的集合。不可修改的列表(),java,list,collections,Java,List,Collections,集合的行为非常奇怪。unmodifiableList()函数。 我有一个算法,在这个算法中,我处理POJO对象的ArrayList,获取它的subList()并遍历它。问题是,如果我用Collections.unmodifiableList()包装这个列表,算法会慢2倍。 实际上,只有一个更改是使用不可修改的接口包装数组。使用JProfiler进行呼吸分析表明,有两件事情变得非常缓慢:iterator.hasNext()和iterator.next() 有什么问题吗?从UnmodifiableR

集合的行为非常奇怪。unmodifiableList()函数。 我有一个算法,在这个算法中,我处理POJO对象的ArrayList,获取它的subList()并遍历它。问题是,如果我用Collections.unmodifiableList()包装这个列表,算法会慢2倍。 实际上,只有一个更改是使用不可修改的接口包装数组。使用JProfiler进行呼吸分析表明,有两件事情变得非常缓慢:iterator.hasNext()和iterator.next()


有什么问题吗?从UnmodifiableRandomAccessList的源代码中,我只看到所有方法的一级包装。我不敢相信,这会给这样的降级运行时间

为什么使用不可修改列表?你的算法中有变异子吗?有没有可能这些变种人试图修改列表状态并产生异常(代价高昂)?我想我们需要看看你的代码。例如,您确定没有不经意地多次包装吗?我唯一能想到的是,通过额外的委托,JVM无法内联这些方法,这会导致代码跳转,从而破坏CPU管道。我不喜欢这个“理论”,因为它有点牵强。您可以使用@Cootri检查此问题。不,该算法中没有变元。在程序的某些地方,我只能使用不可修改的列表来跟踪某些类的不变量。但是现在,为了进行性能测试,我将程序的这一部分分开,可以使用不可修改列表和可修改列表?你的算法中有变异子吗?有没有可能这些变种人试图修改列表状态并产生异常(代价高昂)?我想我们需要看看你的代码。例如,您确定没有不经意地多次包装吗?我唯一能想到的是,通过额外的委托,JVM无法内联这些方法,这会导致代码跳转,从而破坏CPU管道。我不喜欢这个“理论”,因为它有点牵强。您可以使用@Cootri检查此问题。不,该算法中没有变元。在程序的某些地方,我只能使用不可修改的列表来跟踪某些类的不变量。但是现在,为了进行性能测试,我分离了程序的这一部分,可以使用不可修改列表和可修改列表。