【问题标题】:If I use byte instead int, will my loop iterate faster?如果我使用 byte 而不是 int,我的循环会迭代得更快吗?
【发布时间】:2013-10-31 09:22:18
【问题描述】:

这段代码,

for (byte b = 0; b < 100; b++)
{
    //some code
}


比这段代码运行得更快?

for (int b = 0; b < 100; b++)
{
    //some code
}

【问题讨论】:

  • 测量时间并检查一下。我认为这比在这里发布问题要快。
  • 答案是大不。
  • @reindeer 这不是那个问题的重复。这要求记忆力,这要求速度。

标签: java


【解决方案1】:

不,一点也不;如果有的话,它会更慢,因为底层硬件通常具有使用本机“int”类型(32 位二进制补码整数)但不使用 8 位有符号字节的指令。

【讨论】:

  • 安卓系统也一样?
  • 不仅底层硬件,甚至 Java 字节码本身都有一个指令集,主要用于int。在for 循环中使用int 意味着单个iinc 指令将执行循环的增量,但是当使用byte 时,iloadiconst_1iaddi2b 的四个指令序列, istore 是必填项。
  • 我通过 System.nanoTime() 计算了时间差,结果两边都有偏差,顺便说一句,你的回答刚刚赢得了粉丝
  • 我说的是“四”吗?甚至五个指令;-)
【解决方案2】:

尽可能始终使用 int 数据类型作为循环索引变量,因为与使用 byte 或 short 数据类型相比,它更有效。因为当我们使用 byte 或 short 数据类型作为循环索引变量时,它们涉及到隐式类型转换为 int 数据类型。

检查这个 http://www.precisejava.com/javaperf/j2se/Loops.htm

【讨论】:

  • 好点+1。但是,当您从其他链接粘贴时,请引用它们。我现在做到了。
  • 这个建议毫无价值,因为 JIT 肯定会将循环编译成有效的形式。
【解决方案3】:

优化代码的正确方法是对其进行剖析和分析以找到热点,即占用大部分时间的地方。这些可以是(并且经常是)数据库或网络操作,或者是在大量数据上运行的糟糕算法。当发现热点时,可以进一步分析它们以找出提高它们速度的方法(修改数据库查询、使用缓存等)

优化不是决定是使用byte 代替int,还是使用StringBuilder 代替StringBuffer。这被称为微优化,毫无价值。优化始终依赖于上下文,不能使用一般的“使用 X 代替 Y”或“总是使用 Z”规则来执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2015-11-07
    • 2020-07-11
    • 2021-12-11
    • 1970-01-01
    • 2018-01-09
    • 2020-03-31
    • 2014-04-27
    相关资源
    最近更新 更多