当前位置: 首页 > 知识库问答 >
问题:

为什么short基元类型比long或int慢得多?

景凌
2023-03-14
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;
    }
}

基准测试在卡钳库下运行。

测试结果

Int 2.365ns

长2.436 ns

短8.156ns

>

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

    Android手机上也是这样吗?众所周知,Android手机通常运行在32bit环境下,现在越来越多的手机开始配备64bit处理器。

  • 共有1个答案

    别宏盛
    2023-03-14

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

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

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

     类似资料:
    • 我在Surface Pro 2平板电脑上运行Windows8.1x64和Java7更新45x64(没有安装32位Java)。 下面的代码在i类型为long时占用1688ms,在i类型为int时占用109ms。为什么在64位JVM的64位平台上,long(64位类型)比int慢一个数量级? 我唯一的猜测是,CPU加一个64位整数比加一个32位整数需要更长的时间,但这似乎不太可能。我怀疑Haswell

    • 问题内容: 我有一个简单的任务:计算每个字母在一个字符串中出现的次数。我已经使用了它,但是在一个论坛上我看到了使用/比每个字母都要慢得多的信息。我认为它只能在字符串中进行一次遍历,而解决方案则必须遍历该字符串四次(在这种情况下)。为什么这么慢? 问题答案: 允许您计算任何可哈希对象,而不仅仅是子字符串。两种解决方案都是-time。您的测量结果表明,迭代和散列单个字符的开销大于运行4倍。 可以 使用

    • 下面的代码将简单的值持有者映射到一个对象,它在Java中的运行速度比使用XCode 7 beta3“最快、积极的优化[-ofast]”的Objective-C快15倍以上。在Java中,我可以获得超过280m/sec的查找,但在objc示例中只有大约19m。(我在这里发布了相应的Java代码,因为这是作为一个Swift比较开始的:Swift Dictionary即使经过优化也很慢:是否不断保留/发

    • 我一直在做一些欧拉项目练习,以提高我的C语言知识。 我编写了以下函数: 这将在17毫秒内计算。 但是,如果我改变路线 自 计算在2毫秒内完成。我是否遗漏了< code>pow(int,int)的一些明显的实现细节,导致第一个表达式的计算速度如此之慢?

    • 许多用户认为这是切换到 Pytorch 的原因,但我还没有找到牺牲最重要的实际质量、速度来换取急切执行的理由/解释。 下面是代码基准测试性能,TF1与TF2-TF1的运行速度从47%到276%不等。 我的问题是:在图形或硬件级别,是什么导致了如此显着的减速? 寻找详细的答案-我已经熟悉广泛的概念。相关Git 规格:CUDA 10.0.130、cuDNN 7.4.2、Python 3.7.4、Win

    • 示例:类中的字段使用。 如果差异太小,那么为什么这些数据类型(、)会存在呢?