java - 为什么 short 原始类型明显比 long 或 int 慢?

标签 java android performance caliper

我试图通过将 int primitives 更改为 shorts 来优化 Android 游戏的 RAM 使用。在我这样做之前,我对 Java 中原始类型的性能很感兴趣。

所以我使用 caliper 库创建了这个小测试基准。

public class BenchmarkTypes extends Benchmark {

    @Param("10") private long testLong;
    @Param("10") private int testInt;
    @Param("10") private short testShort;


    @Param("5000") private long resultLong = 5000;
    @Param("5000") private int resultInt = 5000;
    @Param("5000") private short resultShort = 5000;

    @Override
    protected void setUp() throws Exception {
        Random rand = new Random();

        testShort = (short) rand.nextInt(1000);
        testInt = (int) testShort;
        testLong = (long) testShort;
    }

    public long timeLong(int reps){
        for(int i = 0; i < reps; i++){
            resultLong += testLong;
            resultLong -= testLong;         
        }
        return resultLong;
    }

    public int timeInt(int reps){
        for(int i = 0; i < reps; i++){
            resultInt += testInt;
            resultInt -= testInt;           
        }
        return resultInt;
    }

    public short timeShort(int reps){
        for(int i = 0; i < reps; i++){
            resultShort += testShort;
            resultShort -= testShort;
        }
        return resultShort;
    }
}

测试的结果让我很吃惊。

测试环境

在 Caliper 库下运行基准测试。

测试结果

https://microbenchmarks.appspot.com/runs/0c9bd212-feeb-4f8f-896c-e027b85dfe3b

内部 2.365 纳秒

长 2.436 纳秒

短 8.156 纳秒

测试结论?

short 原始类型明显比 long 和 int 原始类型慢(3-4~ 倍)?

问题

  1. 为什么 short 原语明显比 int 或 long 慢?我希望 int 原始类型在 32 位 VM 上是最快的,并且 long 和 short 在时间上相等,或者 short 更快。

  2. Android 手机也是这样吗?知道 Android 手机通常在 32 位环境中运行,现在越来越多的手机开始配备 64 位处理器。

最佳答案

Java 字节码不支持对小于 int 的原始类型的基本操作(+、-、*、/、>>、>>>、<<、%)。指令集中根本没有为此类操作分配字节码。因此,VM 需要将 short(s) 转换为 int(s),执行操作,然后将 int 截断回 short 并将其存储在结果中。

使用 javap 检查生成的字节代码,以了解 short 和 int 测试之间的区别。

VM/JIT 优化显然严重偏向 int/long 操作,这是有道理的,因为它们是最常见的。

比 int 小的类型有它们的用途,但主要用于节省数组中的内存。它们不如简单的类成员那么适合(当然,当它是适合数据的类型时,您仍然会使用它们)。较小的成员可能甚至不会减小对象的大小。当前的 VM(再次)主要为执行速度量身定制,因此 VM 甚至可以将字段与本地机器字边界对齐,以提高访问性能,但会增加内存开销。

关于java - 为什么 short 原始类型明显比 long 或 int 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24304433/

相关文章:

java - 将 Java 类(用于代码表示)解析为 JSON 对象

android - 为什么处理程序泄漏问题不会在主线程以外的线程中发生

android - 如何使用 OkHttp 在 Android 上实现 cookie 处理?

android - 单击按钮设置全局变量值

performance - 压缩使响应时间变慢

java - Java Optional 和 Scala Option 的区别

java - MongoDB : Sorting Data when using DBcollection find

sql-server - SQL性能: Is there any performance hit using NVarchar(MAX) instead of NVarChar(200)

c# - 使用 + 分配单个字符串值的性能成本是多少

java - 为什么 Vista 机器上的 Java 报告它在 XP 上?