java图像清晰化处理_jdk16新特性

java图像清晰化处理_jdk16新特性背景将原始值(例如 int 和 long 原始值)打包/解包到字节数组中/从字节数组中解包时,之前使用显式位移进行转换,如 ImageInput

背景

将原始值(例如 intlong 原始值)打包/解包到字节数组中/从字节数组中解包时,之前使用显式位移进行转换,如 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));
    }
}
  1. 通过位移位进行大端解包
  2. 通过位移位进行小端解包

这里使用的方案与我在上一篇文章中描述的方案类似 ,所以我不会再深入细节。简而言之,这种方法复杂且具有挑战性,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 的其他性能改进也将有助于提高性能。

java图像清晰化处理_jdk16新特性

因此,基准方法的吞吐量在我的机器上从大约 579,800,000 字节/秒提高到大约 639,000,000 字节/秒,提高了 10% 以上!还不错!

实际应用程序性能提升

实际上,您的图像应用程序在 Java 21 下的运行速度有多快?只有一种方法可以找出答案:今天通过下载 JDK 21 Early-Access Build在 JDK 21 上运行您自己的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/12070.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注