在编写用于OpenGL库的Matrix类时,我遇到了使用Java数组或Buffer策略来存储数据的问题(JOGL为Matrix操作提供直接缓冲区副本)。为了分析这一点,我写了一个小型性能测试程序,比较了阵列与缓冲区与直接缓冲区之间的循环和批量操作的相对速度。

我想在这里分享我的结果(因为我觉得他们很有趣)。请随意评论和/或指出任何错误。

代码可以在pastebin.com/is7UaiMV查看。

笔记

>循环读取数组实现为A [i] = B [i],否则JIT优化器将完全删除该代码。实际的var = A [i]似乎几乎相同。

>在数组大小为10,000的示例结果中,JIT优化器很可能已经用像System.arraycopy一样的实现替代了循环的数组访问。

>由于Java将A.get(B)作为B.put(A)实现,因此没有批量获取缓冲区 – >缓冲区,因此结果将与批量输出结果相同。

结论

在几乎所有情况下,强烈建议使用Java内部数组。投入/获取速度不仅速度更快,所以JIT能够对最终代码进行更好的优化。

只有在以下两种情况下才应使用缓冲区:

>您需要处理大量的数据。

>数据大部分或总是经过批量处理。

请注意,一个备份缓冲区有一个Java Array来缓冲缓冲区的内容。建议在这个back-buffer上进行操作,而不是循环put / get。

只有当您担心内存使用并且从不访问底层数据时,才应使用直接缓冲区。它们比非直接缓冲区慢一点,如果访问底层数据,则使用较少的内存。此外,当使用直接缓冲区时,将非字节数据(如浮点数组)转换为字节时,还需要额外的开销。

详情请见:

示例结果

注意:百分比只是为了便于阅读,没有真正的意义。

使用大小为16的数组与10,000,000次迭代…

-- Array tests: -----------------------------------------

Loop-write array: 87.29 ms 11,52%

Arrays.fill: 64.51 ms 8,51%

Loop-read array: 42.11 ms 5,56%

System.arraycopy: 47.25 ms 6,23%

-- Buffer tests: ----------------------------------------

Loop-put buffer: 603.71 ms 79,65%

Index-put buffer: 536.05 ms 70,72%

Bulk-put array->buffer: 105.43 ms 13,91%

Bulk-put buffer->buffer: 99.09 ms 13,07%

Bulk-put bufferD->buffer: 80.38 ms 10,60%

Loop-get buffer: 505.77 ms 66,73%

Index-get buffer: 562.84 ms 74,26%

Bulk-get buffer->array: 137.86 ms 18,19%

-- Direct buffer tests: ---------------------------------

Loop-put bufferD: 570.69 ms 75,29%

Index-put bufferD: 562.76 ms 74,25%

Bulk-put array->bufferD: 712.16 ms 93,96%

Bulk-put buffer->bufferD: 83.53 ms 11,02%

Bulk-put bufferD->bufferD: 118.00 ms 15,57%

Loop-get bufferD: 528.62 ms 69,74%

Index-get bufferD: 560.36 ms 73,93%

Bulk-get bufferD->array: 757.95 ms 100,00%

使用大小为1,000的数组,重复100,000次…

-- Array tests: -----------------------------------------

Loop-write array: 22.10 ms 6,21%

Arrays.fill: 10.37 ms 2,91%

Loop-read array: 81.12 ms 22,79%

System.arraycopy: 10.59 ms 2,97%

-- Buffer tests: ----------------------------------------

Loop-put buffer: 355.98 ms 100,00%

Index-put buffer: 353.80 ms 99,39%

Bulk-put array->buffer: 16.33 ms 4,59%

Bulk-put buffer->buffer: 5.40 ms 1,52%

Bulk-put bufferD->buffer: 4.95 ms 1,39%

Loop-get buffer: 299.95 ms 84,26%

Index-get buffer: 343.05 ms 96,37%

Bulk-get buffer->array: 15.94 ms 4,48%

-- Direct buffer tests: ---------------------------------

Loop-put bufferD: 355.11 ms 99,75%

Index-put bufferD: 348.63 ms 97,93%

Bulk-put array->bufferD: 190.86 ms 53,61%

Bulk-put buffer->bufferD: 5.60 ms 1,57%

Bulk-put bufferD->bufferD: 7.73 ms 2,17%

Loop-get bufferD: 344.10 ms 96,66%

Index-get bufferD: 333.03 ms 93,55%

Bulk-get bufferD->array: 190.12 ms 53,41%

使用大小为10,000的数组,重复100,000次…

-- Array tests: -----------------------------------------

Loop-write array: 156.02 ms 4,37%

Arrays.fill: 109.06 ms 3,06%

Loop-read array: 300.45 ms 8,42%

System.arraycopy: 147.36 ms 4,13%

-- Buffer tests: ----------------------------------------

Loop-put buffer: 3385.94 ms 94,89%

Index-put buffer: 3568.43 ms 100,00%

Bulk-put array->buffer: 159.40 ms 4,47%

Bulk-put buffer->buffer: 5.31 ms 0,15%

Bulk-put bufferD->buffer: 6.61 ms 0,19%

Loop-get buffer: 2907.21 ms 81,47%

Index-get buffer: 3413.56 ms 95,66%

Bulk-get buffer->array: 177.31 ms 4,97%

-- Direct buffer tests: ---------------------------------

Loop-put bufferD: 3319.25 ms 93,02%

Index-put bufferD: 3538.16 ms 99,15%

Bulk-put array->bufferD: 1849.45 ms 51,83%

Bulk-put buffer->bufferD: 5.60 ms 0,16%

Bulk-put bufferD->bufferD: 7.63 ms 0,21%

Loop-get bufferD: 3227.26 ms 90,44%

Index-get bufferD: 3413.94 ms 95,67%

Bulk-get bufferD->array: 1848.24 ms 51,79%

java数组缓冲_java – 何时使用数组,缓冲区或直接缓冲区相关推荐

  1. java数组语法_Java 基本语法----数组

    数组 数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理. 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任何数据类型,包 ...

  2. java交换二维数组行列_java二维数组行列

    培训系列AmberXie 求二维数组行列之和把二维数组 a 各行之和分别放入 b... 二维数组例题答案[技巧] [例 1]编写程序,利用二维数组在窗体上输出如图 5x5...如果没有 max 为行列 ...

  3. java二维数组坐标_Java 二维数组

    二维数组的定义 二维数组本质上是以数组作为数组元素的数组,即"数组的数组". 因为数组只能保存一行数据.在生活中,比如坐标等等,我们需要用二维数组来表示.通过行号和列好来定位数据. ...

  4. java二维数组试题_Java二维数组及习题总结

    二维数组 二维数组:就是一个由行和列组成的一个矩阵(Matrix):在这个矩阵中访问元素时,是根据元素的行角标和列角标所确定的. 二维数组在内存中的存储:无论是二维数组,还是多维数组,它们本身就是一个 ...

  5. java对象类型数组赋值_java声明对象数组

    java如何对象创建数组并初始化 急夜影驱动编程小编今天和大家分享答案 /** * 功能:声明一个学生类 * @author qqliweng * 时间:2009-10-22 * 版本:V1.0 */ ...

  6. java二维数组添加元素_Java二维数组与动态数组ArrayList类详解

    java二维数组 java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int ...

  7. java 设置数组长度_java如何增加数组长度

    遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子): ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(ht ...

  8. java 数组求和_java 实现随机数组输出及求和实例详解

    导读热词 java 实现随机数组输出及求和 问题描述: 随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 使用java.util中的 ...

  9. java数组键_Java基础之数组

    数组 数组就是用于存储相同数据类型数据的一个容器.可以通过有规律的索引来访问没有规律的元素. 一维数组 定义格式:元素的数据类型[ ] 数组名称 = new 元素的数据类型 [ 数组容器大小 ]: 数 ...

最新文章

  1. 组策略脚本的趣味应用
  2. 谋定重整衍生新360行-李玉庭:协同电商经信研究生态系统
  3. 科大星云诗社动态20210416
  4. 系统相机裁剪比例_要不要买全画幅相机?
  5. 华为5G又一黑科技曝光!中国通信技术将全球领先
  6. js实现sleep休眠
  7. 正则表达式里的?:是啥意思例如(?:a|b)
  8. 成功最快的就是改变你这个思维,拥有这个全新的思维
  9. 技术突破寻找新思路,互联网内容的风控与风口
  10. Ubuntu sublime text 3无法输入中文的解决办法
  11. MIKE水动力笔记8_冷启动与热启动
  12. linux 打包qt可执行文件
  13. MetaMask新版本新增获取并修改用户剪切板内容权限
  14. PS学习总结一:入门版必备的基础功能
  15. 出中的意思是什么_从里出来是什么意思
  16. 以“万物零售”为主题第十届中国网上零售年会
  17. XTU,C语言,平衡三进制2
  18. 一些基础知识:脑科学、神经科学、心理学
  19. Java汉字转换拼音工具类
  20. vue 汉字转首字母

热门文章

  1. reportInterruptAfterWait
  2. parkAndCheckInterrupt
  3. ThreadLocal的两种用法
  4. 数组的定义格式二_静态初始化
  5. 静态static关键字概述
  6. 使用RAID增加传统机器硬盘的性能
  7. 加密与安全 - Java加密与安全
  8. tab栏切换 动画的相关方法上 动画的相关方法下 隐藏动画案例 隐藏动画练习
  9. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  10. 常用软件滤波算法---摘自:FeoTech