【问题标题】:Does compareTo have some sort of pre-launching delay?compareTo 是否有某种预启动延迟?
【发布时间】:2011-02-28 12:55:47
【问题描述】:

我刚刚发现了这样的说法:“通过首先比较最有可能不同的项目,可以大大提高 compareTo 的性能”。这是真的吗?如果是,为什么?

【问题讨论】:

  • 你在哪里找到的?我的猜测是,它是在讨论排序的背景下发生的。
  • 嗯,是的,我知道,我只是想知道这是不是真的,因为我没有找到任何其他提及此类的东西。
  • 就像this一样简单
  • 这是非常简单的观察,如果您比较 9 个属性并且都返回 0 但第 10 个产生结果,那么您有 10 个 compareTo 调用(不是很快),如果您设法比较第 10 个首先,你赢了一个compareTo

标签: java collections comparable compareto


【解决方案1】:

考虑一个具有多个属性的类。为了比较实例,您需要比较它们的一些属性。如果除一个之外的所有属性都相等,则需要进行的比较量取决于属性比较的顺序:如果您碰巧首先比较不同的属性,则通过一次比较即可得到结果。但是,如果您最后比较不同的属性,则必须进行 n 次比较才能得到相同的结果。

正如@Kdeveloper 所指出的,除非您批量进行大量类似的比较,否则性能差异可能并不明显。但另一个好处是恕我直言逻辑排序:这让您考虑类属性之间的逻辑关系。总的来说,由于这是一个无中断的优化(即它不会使代码更难阅读和维护),我认为大部分时间都值得这样做。

【讨论】:

  • 好吧,我认为这句话可能不是关于要比较的对象,而是关于那个属性。起初我认为对象比较的顺序很重要,但如果是你所说的,那是有道理的。
【解决方案2】:

是的,这是真的

因为如果您将最有选择性的比较放在首位,则平均而言,每次比较您将执行更少的代码。但由于这些测试通常非常快,因此只有在比较许多对象时(例如对大集合进行排序时),速度提升才会很明显。

【讨论】:

  • 但由于这些测试通常非常快,如果您需要在其他一些属性/字段上调用 ​​compareTo,它们并不快,尤其是。如果它是具有多个 (>2) 调用目标的接口。
  • 不过,这通常只有在您经常这样做时才会注意到,例如对集合进行排序。
【解决方案3】:

这是真的吗?如果是,为什么?

嗯,从字面上看,没有。无论历史记录如何,compareTo 方法的执行时间都一样长。

如果它可以在特定实现中获得任何整体性能?是肯定的。但为了能够回答您的问题,我们需要更多关于这种情况的背景信息。

【讨论】:

  • 正确,如果您只比较一个属性。看看 Péter Török 的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多