2

我想对何时(忽略可用内存空间)存储比较结果而不是重新计算它是有意义的有一个深刻的理解。证明存储所产生的时间成本合理的临界点是什么?是 2 次、3 次还是 4 次比较?更多的?

例如,在这种特殊情况下,哪个选项(通常)在速度方面表现更好?

选项1:

int result = id.compareTo(node.id);

return result > 0 ? 1 : result < 0 ? -1 : 0;

选项 2:

return id.compareTo(node.id) > 0 ? 1 : id.compareTo(node.id) < 0 ? -1 : 0;

我试图自己分析这两个选项以回答我自己的问题,但我对这种性能测试没有太多经验,因此,我宁愿从有更多经验的人那里得到更明确的答案更好地掌握所涉及的理论要素。

我知道这没什么大不了的,而且大多数时候差异可以忽略不计。但是,我是一个完美主义者,我真的很想解决这个特殊的问题,这样我就可以继续我的生活了,哈哈。

此外,我认为对于我将来可能遇到的类似情况,我认为答案可能会很有启发性,其中差异可能非常显着(例如,当比较或内存分配的成本无法产生或其他情况时)复杂到足以引起有关性能的真正问题)。

答案应该与使用 Java 而不是其他语言编程相关,请。

我知道我已经提到过几次了,但是请仅将答案集中在速度差异上!我很清楚在编写代码时可以而且应该考虑许多其他因素,但在这里我只想要一个直截了当的论点,即 FASTER。

4

4 回答 4

2

经验告诉我选项 1 应该更快,因为您只需调用一次 compare 方法并存储结果以供重用。支持这一观点的事实是,局部变量存在于堆栈中,并且进行方法调用涉及堆栈中的更多工作,而不仅仅是将值压入堆栈。然而,分析是比较两种实现的最好和最安全的方法。

首先要意识到的是,java 编译器和 JVM 可以一起优化您的代码,使其希望最有效地完成工作(只要遵循某些规则)。很可能在性能上没有差异,也很可能实际执行的不是你想象的那样。然而,一个真正重要的区别在于调试:如果您在变量存储版本的返回语句上放置一个断点,您可以看到调用返回的内容,否则在调试器中看不到。更方便的是,当您看似无用地将要从方法返回的值存储在变量中时,然后将其返回,因此您可能会在调试时看到方法将返回什么,否则无法看到它。

于 2013-03-19T12:16:04.650 回答
1

选项 1 不能比 2 慢,如果编译器优化,那么两者可能相等,但仍然 1) 更具可读性、更紧凑和更好的可测试性。

因此,选项 2) 没有任何论据。

如果您愿意,可以更改为final int result = .... 虽然我希望编译器非常聪明以至于 final 关键字在这种情况下没有任何区别,并且 final 使代码的可读性降低了一些。

于 2013-03-19T13:12:45.847 回答
0

选项1一个总是首选一个,因为这里是现实世界的场景

----->好吧让

1) id.compareTo(node.id) > 0 处的线程执行?1、在这个进程中一些其他线程

id.compareTo(node.id) > 0 ? 1在去之前改变 node.id 的值

id.compareTo(node.id) < 0 ? -1 : 0这个检查,结果不一样?

当检查中存在一些功能时,性能明智的 option1 具有更高的性能。

于 2013-03-19T12:24:51.817 回答
0

什么时候存储比较结果而不是根据速度重新计算比较?

大多数情况下,选项#1 与选项#2 之类的微优化不会产生任何显着差异。实际上,只有在以下情况下才会产生显着的性能差异:

  • 比较贵,
  • 比较执行了很多次,并且
  • 性能很重要。

事实上,您可能已经花费了更多的时间和金钱来考虑这一点,而不是在应用程序的整个有用生命周期中节省下来的时间和金钱。

与其专注于性能,不如专注于使代码可读。想想下一个必须阅读和修改代码的人,并让他/她不太可能误读它。

In this case, the first option is more readable than the second one. THAT is why you should use it, not performance reasons. (Though, if anything, the first version is probably faster.)

于 2013-03-19T13:13:36.787 回答