大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说java图像清晰化处理_jdk16新特性,希望您对编程的造诣更进一步.
背景
将原始值(例如 int 和 long 原始值)打包/解包到字节数组中/从字节数组中解包时,之前使用显式位移进行转换,如 ImageInputStreamImpl::readInt 下面的方法所示:
public int readInt() throws IOException {
if (read(byteBuf, 0, 4) != 4) {
throw new EOFException();
}
if (byteOrder == ByteOrder.BIG_ENDIAN) {
return
(((byteBuf[0] & 0xff) << 24) | ((byteBuf[1] & 0xff) << 16) | // (1)
((byteBuf[2] & 0xff) << 8) | ((byteBuf[3] & 0xff) << 0));
} else {
return
(((byteBuf[3] & 0xff) << 24) | ((byteBuf[2] & 0xff) << 16) | // (2)
((byteBuf[1] & 0xff) << 8) | ((byteBuf[0] & 0xff) << 0));
}
}
- 通过位移位进行大端解包
- 通过位移位进行小端解包
这里使用的方案与我在上一篇文章中描述的方案类似 ,所以我不会再深入细节。简而言之,这种方法复杂且具有挑战性,Java 无法对其进行全面优化。此外,对于我们人类来说,阅读也很困难。
JDK 21 中的改进
在 Java 21 中,转换是通过 VarHandle 新的 jdk.internal.util.ByteArray class. 以下是内部 ByteArray 类的部分内容:
private static final VarHandle INT =
MethodHandles.byteArrayViewVarHandle(int[], ByteOrder.BIG_ENDIAN);
static int getInt(byte[] b, int off) {
return (int) INT.get(b, off);
}
与显式位移相比,使用 VarHandles 意味着 Java 能够更好地优化方法。
上面的类处理 big-endian。由于图像也需要能够处理 小端,因此ByteArrayLittleEndian添加了 一个名为的新类 。这意味着 readInt() 可以像这样简化和改进该方法:
public int readInt() throws IOException {
if (read(byteBuf, 0, 4) != 4) {
throw new EOFException();
}
return (byteOrder == ByteOrder.BIG_ENDIAN)
? ByteArray.getInt(byteBuf, 0)
: ByteArrayLittleEndian.getInt(byteBuf, 0);
}
好的!现在看起来干净多了。
受影响的类别和影响
直接改进了以下类:
- ImageInputStreamImpl
- ImageOutputStreamImpl
好消息是,这些类为包中和其他地方的大量其他图像处理类提供了基础 javax.imageio.stream (毕竟,上述类在公共 API 中)。
这意味着,在许多情况下,图像处理变得更快,并且所有依赖上述任何类(直接或间接)的第三方库也将运行得更快,而无需更改您的应用程序代码。
基准
在下面的基准测试中,我使用 Java 17 作为基准,这意味着 Java 21 的其他性能改进也将有助于提高性能。
因此,基准方法的吞吐量在我的机器上从大约 579,800,000 字节/秒提高到大约 639,000,000 字节/秒,提高了 10% 以上!还不错!
实际应用程序性能提升
实际上,您的图像应用程序在 Java 21 下的运行速度有多快?只有一种方法可以找出答案:今天通过下载 JDK 21 Early-Access Build在 JDK 21 上运行您自己的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/12070.html