我尝试通过将int基元更改为short来优化 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

Int 2.365 ns

长2.436 ns

短8.156 ns

测试结论?

短基元类型比long和int基元类型慢得多(3-4~)?

>为什么短原语明显慢于int或long?我希望int原语类型在32位虚拟机上最快,长短在时间上相等,或者短到甚至更快.
> Android手机也是如此吗?知道Android手机通常在32位环境中运行,现在越来越多的手机开始配备64位处理器.

解决方法

Java字节代码不支持小于int的基本类型的基本操作(,–,*,/,>>,>>>,<<,%).在指令集中没有为这种操作分配字节代码.因此,VM需要将short(s)转换为int(s),执行操作,然后将int截断为short并将其存储在结果中. 使用javap检查生成的字节代码,以查看short和int测试之间的区别. VM / JIT优化显然偏向于int / long操作,这是有意义的,因为它们是最常见的. 小于int的类型有其用途,但主要用于在数组中保存内存.它们不像简单的类成员那样适合(当然,当它适用于数据类型时,你仍然会使用它们).较小的成员甚至可能不会减小对象大小.当前VM(再次)主要针对执行速度而定制,因此VM甚至可以将字段与本机机器字边界对齐以提高访问性能,但代价是内存花费.

java – 为什么短基元类型明显慢于long或int?的更多相关文章

  1. 使用canvas压缩图片大小的方法示例

    这篇文章主要介绍了使用canvas压缩图片大小的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. html5写一个BUI折叠菜单插件的实现方法

    这篇文章主要介绍了html5写一个BUI折叠菜单插件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. Swift专题讲解十五——类型构造

    Swift专题讲解十五——类型构造一、引言构造是类、结构体、枚举在实例化中必须执行的过程,在构造过程中,类、结构体必须完成其中存储属性的构造。检查4:在完成父类构造方法之前,不能使用self来引用属性。六、构造方法的继承Swift和Objective-C有很大不同,其构造方法不会被子类无条件的继承。Swift中类的构造方法的继承遵守下面两个原则:1.如果子类没有定义任何的指定构造方法,则子类会默认继承父类所有的指定构造方法。

  4. Swift专题讲解十六——ARC在Swift中的应用

    Swift专题讲解十六——ARC在Swift中的应用一、引言ARC是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于ARC的例子:在一个公用的图书馆中,每次进入一人就将卡插入,走的时候将自己的卡拔出拿走。这个例子对应于Objective-C中的对象声明周期管理十分贴切。Swift也采用同样的方式进行内存管理。

  5. 如何在swift中覆盖泛型类中的泛型方法?

    我正在迅速学习.我想覆盖泛型类中的泛型函数.当我写override关键字时,发生编译错误.我可以省略override关键字.但是当我将对象类型声明为“Parent”时,将调用父方法.从字面上看,它并非“压倒一切”.在这个例子中,我想通过object.genericFunc获得“child”.我怎么能得到这个?是否有任何解决方法来实现这一目标?

  6. 如何在Swift代码中将数组附加到数组对象?

    参见英文答案>ArrayoftuplesinSwift3我搜索了谷歌,但我无法找到一种方法来添加新元素到Swift的数组对象.错误代码“缺少参数fot参数”名称“在调用”出现.我的代码是遵循的.如果你知道任何解决方案,我会很高兴.谢谢.只需将元组分配给一个临时变量:不知道为什么它不工作,只是检查一个功能,像这样:结果:功能正常,数组方法不行.更新:在操场上试过这段代码:结果:当将元组变量传递给do

  7. android rest客户端不支持的媒体类型

    我尝试从android模拟器发送请求到一个安静的服务器.但我总是得到错误:415UnsupportedMediaType.客户代码:服务器的代码:解决方法问题是服务器不知道客户端请求的媒体类型.在客户端代码中尝试这样的事情:request.setHeader(“Content-Type”,“application/json”);

  8. Android – 使用带有请求标头的网址打开浏览器

    非常感谢提前编辑即使请求正文中带有’param’的POST请求也应该没问题.编辑2接受的答案是POST请求,而不是标题.解决方法Android浏览器支持“查看”javascript,例如以下代码可以启动浏览器应用程序以显示警告对话框:通过javascript进行后期操作的常见技巧是您通过javascript创建表单然后提交它.所以理论上下面的代码应该可以工作:

  9. canvas绘图按照contain或者cover方式适配并居中显示

    这篇文章主要介绍了canvas绘图按照contain或者cover方式适配并居中显示的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. JSP中param标签用法实例分析

    这篇文章主要介绍了JSP中param标签用法,以实例形式较为详细的分析了param标签的功能、定义与使用技巧,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部