【问题标题】:android java loops versus statements which is better for performance?android java循环与语句哪个对性能更好?
【发布时间】:2020-09-02 12:15:19
【问题描述】:

我问这个问题是因为考虑以下情况:

在我的 android 应用程序中,如果有 10 个项目,那么为了选择 3 个项目,我会检查当前范围。例如如果当前范围是 3 到 5(即第 3、第 4 和第 5 项),那么我想以不同方式处理小于 3 即 0 到 2 项和大于 3 项以及范围项目,即第 3 项、第 4 项和第 5 项不同。所以我可以通过两种方式做到这一点:

第一种方法)通过使用多个 for 循环,例如:

for(int i=0;i<3;i++)
{
  //treat less than 3 items in this loop
} 

for(int i=3;i<5;i++)
{
  //treat range items i.e. 3rd, 4th and 5th items in this loop
} 

for(int i=4;i<9;i++)
{
  //treat greater than 3 items in this loop
} 

第二种方法)通过在 for 循环中使用 if 语句,例如:

for(int i=0;i<9;i++)
{
  if(i<3)
  {
    //treat less than 3 items
  }
  else if(i>3)
  {
    //treat greater than 3 items 
  }
  else
  {
    //treat range items i.e. 3rd, 4th and 5th items 
  }
} 

那么哪种方法对性能更好?使用多个 for 循环更好还是在一个 for 循环中使用 if 语句更好?如果我想增加条件怎么办?递增条件会影响性能吗?

编辑 1: 实际上这些项目是 RecyclerView 项目。如果项目不在范围内,那么我将回收它。还有一件事,每一个项目都包含 WebView 和一个协调器布局;实际上,我使用 RecyclerView 作为浏览器的选项卡管理器。它的一项代表一个浏览标签。

【问题讨论】:

  • 性能差异几乎可以肯定是无关紧要的。选择你认为最容易阅读的那个。
  • 我不确定实际上是否存在差异(编译器也可能优化代码),因此我不会打扰。很可能您不会遇到任何性能问题,如果您遇到问题,那么问题很可能在其他地方,您需要正确分析您的应用程序。您究竟为什么担心这里的性能?
  • 我认为第一个更快,这样你就不用检查i的范围是什么了
  • @Thomas 一般来说,java 编译器在源代码方面做了接近于零的优化。几乎所有的“魔法”都是由 JIT 在运行时发生的(我承认:我不知道 android “jvm” 在这里表现得如何“聪明”)。
  • 请检查编辑 1。您对在这种情况下使用正确的方法有何看法?

标签: java android


【解决方案1】:

问问自己需要为您的两个选项执行多少“指令”。在第一个示例中,您有 3 个循环,但每个循环都处理“三分之一”的数据。选项两个循环一次,但“所有”元素,对于“所有”元素,它运行那些 if/else 级联。

因此,从技术上讲,第一个解决方案导致指令更少。

但真正的答案是:除非我们谈论的是数千个元素的处理,否则这真的无关紧要。 Java 性能并非来自聪明的源代码。它来自简单的代码,即时编译器可以在必要时转换为最佳机器代码。

除此之外:只有在遇到实际问题时才应该担心性能。当然,避免在源代码中做完全愚蠢的事情,但请记住:现代 CPU,即使在移动设备中也非常强大。在这里或那里再多几个几乎没有效果。与“3 个循环”与“1 个循环和 3 个 ifs”相比,一个日志记录调用、数据库提取或对远程服务器的调用可能会带来一千倍的“惩罚”。

因此,真正的答案是:尝试编写易于阅读和理解的代码。在您的情况下:在您的第一个示例中,您可以将每个 for 循环放在自己的方法中。这将使 JIT 能够内联方法体,等等。

您会发现,当您编写简单的代码时,JIT 可以更轻松地完成其工作。并且:如果您以后发现“性能很差”,那么易读代码也更容易更改。

【讨论】:

  • 所以结论:第一种方法更好?因为它比较容易阅读并且说明较少?
  • 是的,我同意。
  • 请检查编辑 1。在包含 RecyclerView 作为选项卡管理器的那种情况下,您对使用第一种方法有何想法。
  • 请避免返回并更改问题的整个上下文。我对 android 编程并没有那么深入……但我真的不明白这会有什么不同。
  • 好的。感谢您的帮助和时间。
【解决方案2】:

这不是效率问题。

单独的循环可以确保处理所有索引:

int i = 0;
for (; i < 3; i++) {
    // treat less than 3 items in this loop
} 
for (; i < 6; i++) {
    // treat range items i.e. 3rd, 4th and 5th items in this loop
} 
for (; i < 9; i++) {
    // treat greater than 3 items in this loop
}

或者:

int i = 0;
while (i < 3) {
    // treat less than 3 items in this loop
    ++i;
} 
while (i < 6) {
    // treat range items i.e. 3rd, 4th and 5th items in this loop
    ++i;
} 
while (i < 9) {
    // treat greater than 3 items in this loop
    ++i;
}

通知&lt; 5改为&lt; 6


稍微好一点,因为条件的语义/含义更不言自明。所以更具可读性。

【讨论】:

  • 那么,你的意思是 3 个单独的循环方法比在一个 for 循环中包含各种条件的 if 语句更好吗?
  • 是的,因为语义,条件的含义更加不言自明。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2010-09-11
  • 2010-11-01
  • 1970-01-01
  • 2015-12-18
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多