资讯专栏INFORMATION COLUMN

java.util.zip.CRC32和java.util.zip.Adler32的性能对比分析

ISherry / 3176人阅读

摘要:当主机正在从某个输入流源源不断地读取文件时,校验码的计算是实时的,每次校验操作都只对文件的一部分进行处理。在计算校验码时,请至少使用的分区大小,否则调用会造成不可忽略的时间消耗。

原文:java.util.zip.CRC32 and java.util.zip.Adler32 performance
作者:Mikhail Vorontsov

校验码是把任意长度的字节内容输入通过特定算法变换为一个长度较短的字节数组(在CRC32和Adler32中变换为整数(Integer))。校验码最主要的一个特点是,即使输入内容发生了很小的变化,输出内容也会有极为明显的差别。校验算法通常在以下两种场景中使用:

当主机已经分别接收到一个完整文件和其对应的校验码时,我们要计算出整个文件的校验码,与接收到的校验码进行对比,来确认文件在传输的过程中没有被篡改。

当主机正在从某个输入流源源不断地读取文件时,校验码的计算是实时的,每次校验操作都只对文件的一部分进行处理。当某些原因导致主机与输入设备的连接断开,主机尝试重新传输时,我们会使用最后一次计算得到的校验码和读取到的文件位置与当前重传的数据内容进行比较,以免对前面已经传输过的数据进行重新处理,从而使得传输可以从当前位置继续进行。

在标准JDK中,最常使用的校验算法是java.util.zip.CRC32。许多开发者认为这是Java唯一的标准校验算法实现(其中也有人会说这是标准的CRC(Cyclic Redundancy Check,循环冗余校验)实现)。实际上,Java中还有另一种校验算法叫java.util.zip.Adler32,这两种算法都实现了同一个接口:java.util.zip.Checksum。

这两种校验算法是有区别的,Adler32比CRC32稍微弱一些,不过如果当需要校验的内容长达几千字节甚至更多时,你可以忽略校验质量上的差异。更重要的是,Adler32的计算速度比CRC32快。下面的列表对这两种校验算法的处理速度进行了比较,处理的内容是一个500MB的存档文件(文件已经预先读取到内存中)

500MB数据容校验速度对比

Adler32,一次性处理 CRC32,一次性处理 Adler32,每次处理区块大小10 bytes CRC32,每次处理区块大小10 bytes Adler32,每次处理区块大小1000 bytes CRC32,每次处理区块大小1000 bytes
Java 6 0.233 s 1.526 s 3.585 s 4.119 s 0.253 s 1.545 s
Java 7 0.227 s 0.666 s 3.684 s 3.691 s 0.267 s 0.699 s

如你所见,在Java 6中,当单次处理的区块足够大时,Adler32的速度是CRC32的5~6倍;而在Java 7中明确地对CRC32进行了性能优化,Adler32的速度只比CRC32快了2~3倍。使用小容量的区块进行处理时,JNI调用的成本是影响速度的最大因素。

有人可能觉得0.3s和1.5s的时间差异对于500MB的内容来说没有什么值得关注的地方,这并不完全正确。如今硬盘的读取速度能达到100M/s,读取500MB数据最多只需要5s,在这样的情况下,额外的1秒时间(1.5-0.3 s)就会造成20%的性能下降。换个方式说,你可以理解为“我们的系统使用CRC32能达到500,000条信息/每秒的处理速度,而使用Adler32可以达到600,000条信息/每秒”。

总结

如果你可以自由选择校验算法实现,你可以先尝试使用Adler32。如果它的校验质量对你来说已经足够了的话,使用它比CRC32要更好。无论在什么情况下,你应当使用Checksum接口来访问Adler32/CRC32的逻辑。

在计算校验码时,请至少使用500 bytes的分区大小,否则JNI调用会造成不可忽略的时间消耗。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68648.html

相关文章

  • 2015-0CTF-vezel

    摘要:静态分析题目地址运行定位关键代码详细分析通过编写一个可以获得该签名应用程序的包名不能为空从中过滤出获得的编写代码注意上有现成的命令然后只需要转为进制就可以了参考文章如何防止应用被二次打包轩辕的回答知乎 Java静态分析 题目地址:https://github.com/ctf-wiki/c... 1.运行 showImg(https://segmentfault.com/img/bVbq...

    Simon 评论0 收藏0
  • 现代罗塞塔石碑:微软提出深度学习框架通用语言

    摘要:完整版地址我们的想法是创建一个深度学习框架的罗塞塔石碑假设你很了解某个深度学习框架,你就可以帮助别人使用任何框架。我们的目标是创建深度学习框架的罗塞塔石碑,使数据科学家能够在不同框架之间轻松运用专业知识。 repo 1.0 完整版 GitHub 地址:https://github.com/ilkarman/DeepLearningFrameworks我们的想法是创建一个深度学习框架的罗塞塔石...

    ckllj 评论0 收藏0
  • [译]GC专家系列5-Java应用性能优化原则

    摘要:在本文中我将会介绍应用性能优化的一般原则。性能优化的流程图摘取自和合著的性能,描述了应用性能优化的处理流程。例如,对每台服务器,你面临着为单个分配堆内存和运行个并为每个分配堆内存的选择。不过位能使用堆内存最大理论值只有。 原文链接:http://www.cubrid.org/blog/dev-platform/the-principles-of-java-application-per...

    lufficc 评论0 收藏0
  • UCloud云服务器机型与CPU平台

    摘要:机型机型云主机根据应用场景将主机区分为快杰型通用型高主频型型总计种机型。若希望使用现有镜像创建快杰型云主机,请联系技术支持。不同平台的云主机价格相同。此文档适合于2019年5月后新上线的新版主机创建页,重新定义了大部分机型的概念,这些新概念被聚合为主机机型概念2.0。若您仍然使用旧版本的主机创建页,机型概念请参照主机概念1.0的文档机型与规格;若您希望了解2.0概念与1.0概念相比发生了哪些...

    Astrian 评论0 收藏0
  • UCloud云主机云服务器机型与规格

    摘要:注意年月上线新版主机创建页后,主机机型概念已升级到版本。请参照机型与平台机型与平台进行选型。以下为版主机概念的文档规格族简述规格族简述云主机根据应用场景将主机区分为标准型高型高主频型型总计种规格族,并支持总计个系列的种机型。注意:2019年5月上线新版主机创建页后,主机机型概念已升级到2.0版本。此文档描述的1.0版本概念将不再沿用。请参照 机型与CPU平台 进行选型。控制台列表展示的机型也...

    Labradors 评论0 收藏0

发表评论

0条评论

ISherry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<