在JVM中加入CRC32 Intrinsic加速CRC校验

标签: JVM | 发表时间:2011-09-30 15:51 | 作者:changren sggggy
出处:http://rdc.taobao.com/blog/cs

问题:

在Java应用中例如在Hadoop中,经常用到CRC校验计算。对于Java开发者来说,目前可用的实现是java.util.zip类,他通过JNI调用zlib中crc32函数。这里有两个性能瓶颈。其一,JNI的调用性能很低,如果每次计算的数据量很小,比如1、2个byte,那么JNI的调用开销远远高于计算开销。其二,虽然zlib的crc32实现是查表实现,但是本身性能还有很大的提升空间。

对此,Hadoop社区目前实现了Java版本的CRC32类来克服JNI的开销,它在JIT后速度会快于通过JNI调用的Native实现。下图是通过运行PureJava CRC32作者提供的benchmark程序得出的性能数据。

横坐标是每次计算的字节大小。可见,无论计算字节大小,PureJava实现明显快于Zlib CRC实现。

淘宝的优化方法:

对于瓶颈1,虽然PureJava实现比原来快了许多,但是这远远没有达到极致。为了避免JNI调用开销,可以通过实现JVM Intrinsic来优化。Intrinsic可以在JIT过程中将相应的实现inline到JIT后的生成的目标平台(如x86)指令中,例如Math.sin。

对于瓶颈2,SSE4.2指令集提供了CRC32指令加速校验计算,这个指令的latency为3,thoughput是1,相当给力。虽然多项式是crc32c和zlib的crc32不同,但是如果没有历史数据的包袱,还是可以应用的。

优化结果:

应用了CRC32指令并实现为JVM Intrinsic后,我们看一下这个实现将有什么样的表现?

是的,您没有看错,运行同样的benchmark程序,应用CRC32指令的JVM Intrinsic实现了恐怖的完胜。在1个字节计算下,zlib JNI实现速度是13M/s,PureJava实现是93M/s,CRC32 Intrinsic是114M/s。在1K字节计算下,CRC32 Intrinsic实现是PureJava实现速度的10倍,是Zlib JNI实现的20倍,达到了6GB/s。再次强调,这都是Java程序调用的性能。

结束了?

木有,木有。这还不是极致,第一,目前的Intrinsic实现为了方便,并没有将CRC32指令直接inline到JIT后的指令中,需要通过call指令调用。第二,注意到CRC32指令的latency是3,目前实现没有利用ILP,理论上还能提高3倍性能。实际上我们已经有了再提高2.6倍的实现。是的,再提高2.6倍。

预知后事如何,敬请持续关注核心系统研发部专用计算组。

相关 [jvm crc32 intrinsic] 推荐:

在JVM中加入CRC32 Intrinsic加速CRC校验

- sggggy - 淘宝核心系统团队博客
在Java应用中例如在Hadoop中,经常用到CRC校验计算. 对于Java开发者来说,目前可用的实现是java.util.zip类,他通过JNI调用zlib中crc32函数. 其一,JNI的调用性能很低,如果每次计算的数据量很小,比如1、2个byte,那么JNI的调用开销远远高于计算开销. 其二,虽然zlib的crc32实现是查表实现,但是本身性能还有很大的提升空间.

学好数学很重要-谈CRC32碰撞的概率和可能性

- 三马 - 白菜的博客
      前段时间跟某大牛叽歪的时候,才被提到我写的一篇文章里提到的CRC32算法有误. 今天写代码,恰好需要用到这个函数,想起来了,就又回去看了下. 确认了下,原先的文章并没有错误,但是有一处描述是很有问题的.       原文是这样的,『综合以上的思路,决定采用CRC32来实现. CRC32也是一个哈希算法,和MD5类似,不过它是32位的,故更短一些,速度也更快.

JVM研究

- - 开源软件 - ITeye博客
每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢. JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中.

jvm调优

- - 互联网 - ITeye博客
printf "%x\n" 21742  找到耗时最长的进程. jstack pid | grep 54ee  定位某个类的方法. jstack 10535|grep -A 10 2a1d (最后十行). jmap 查询pid 内存线程. 附:TOP命令中需要关注的值:. (1)load average:此值反映了任务队列的平均长度;如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高.

学习JVM的References

- LightingMan - 淘宝JAVA中间件团队博客
本blog中列举了我学习JVM的references,会不断的更新,为了避免版权问题,就不在blog上提供references的下载了,感兴趣的同学可自行下载或购买,:). |— [ Hotspot GC论文 ]. |— [ 其他JVM GC ]. |— Linux内核源代码情景分析. |— Linux 内核中断内幕.

深入理解JVM

- 小伟 - ITeye论坛最新讨论
1   Java技术与Java虚拟机. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API). 图1   Java四个方面的关系. 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件).

jvm垃圾回收

- Cano - 淘宝共享数据平台 tbdata.org
在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation). 年轻代和年老代是存储动态产生的对象. 永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等. 我们这里讨论的垃圾回收主要是针对年轻代和年老代.

JVM内存分配

- - 移动开发 - ITeye博客
计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘. 那JVM的内存结构到底是如何呢. JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域.

Azul开源Zing Jvm

- - InfoQ cn
4月末,继Zing 5.2 之后,. Azul Systems宣布他们将无停顿(pauseless )的 Zing JVM提供给开源软件开发者和项目,以供开发和测试. Azul Systems 工程部副总裁和合作创始人Shyam Pillalamarri向InfoQ说明道:. 我们的部署很大一部分基于开源组件,所以我们认为:“假设我们不能将一些有价值的东西免费提供给开源项目贡献者,他们将一直受限于从Java虚拟机(JVM)视角所看到的内容”,他们将不会考虑额外的用例,或者选择其他能解决了所有内存或扩展性问题、类似Zing的系统.

JVM参数设置

- - 企业架构 - ITeye博客
-Xms768m -Xmx1280m  jvm堆的最小值和最大值设置,一般设成相同值,避免频繁分配堆空间. -XX:NewSize=128m -XX:MaxNewSize=128m  年轻代最小值和最大值设置(年轻代设定了,年老代也就定了),也可以用参数-XX:NewRatio=4,年老代和年轻代的大小比,这里128m有点小了,官方建议的是heap的3/8,差不多280m.