java - 设置 ByteBuffer 顺序(取决于缓冲区使用)是安全/良好的优化吗?

标签 java performance endianness bytebuffer

Java 是 Big-Endian;网络堆栈是 Big-Endian; Intel/AMD (基本上我们所有的计算机)和 ARM CPU(最常见的 Android 和 iOS 芯片)也都是小端。

考虑到所有这些,如果我为不同的用途分配一个直接的 ByteBuffer,总是尝试匹配本地交互的字节顺序是个好主意吗?

更具体地说:

  • 网络缓冲区:保持大端。
  • 文件缓冲区(在 x86 上):Little-Endian。
  • OpenGL/ native 进程缓冲区:Little-Endian。

等等……

我问这个是因为我从来没有想过我的 ByteBuffer 的 Endian-ness,但是在看到一些 other questions 之后在 SO 和 performance impact 上它可以拥有,这似乎是值得的,或者至少是我在使用 ByteBuffers 时应该更加注意的事情。

或者担心我缺少并想知道的字节顺序可能有不利的一面?

最佳答案

它在您引用的文章中指出差异非常小。 (可能没有)

引用的结果并未显示一致的改进,使用最新的 JVM 可能会缩小差距。


  • 当我启用“ native 字节顺序”时(如果机器使用不同的“endian”约定,这实际上是不安全的):
mmap: 1.358
bytebuffer: 0.922
regular i/o: 1.387
  • 当我注释掉顺序语句并使用默认的大端顺序时:
mmap: 1.336
bytebuffer: 1.62
regular i/o: 1.467

有一个衡量差异,但它在事物的整体方案中很小。如果您希望它快得多,我发现唯一有很大不同的选项是直接使用 Unsafe,在这种情况下,只有 native 排序可用。

即便如此,它也只对延迟最敏感的应用程序有帮助。

Unsafe 加上代码和注释更加有趣。 ;)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/misc/Unsafe.java

关于java - 设置 ByteBuffer 顺序(取决于缓冲区使用)是安全/良好的优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9279725/

相关文章:

c - 字节序问题?

java - 如何从容器外部访问Websphere 7.0中定义的JNDI命名空间?

c - 在c中移动数组元素,有没有更好的选择

.net - ASP.Net Web 应用程序的分析器?

java - 比较存储在 hashmap 中的值的对象

c# - 编程语言中的字节顺序

C 程序来检查小端和大端

java - 使用 spring 注释读取属性文件中选定的内容

java - 在类 Unix 机器上运行 Talend 作业

java - 我创建了 2 个类,我想在 B 类的方法中使用 A 类