|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解成绩:
在Java使用中比方在Hadoop中,常常用到CRC校验盘算。关于Java开辟者来讲,今朝可用的完成是java.util.zip类,他经由过程JNI挪用zlib中crc32函数。这里有两本性能瓶颈。其一,JNI的挪用功能很低,假如每次盘算的数据量很小,好比1、2个byte,那末JNI的挪用开支远远高于盘算开支。其二,固然zlib的crc32完成是查表完成,可是自己功能另有很年夜的提拔空间。
对此,Hadoop社区今朝完成了Java版本的CRC32类来克制JNI的开支,它在JIT后速率会快于经由过程JNI挪用的Native完成。下图是经由过程运转PureJavaCRC32作者供应的benchmark程序得出的功能数据。
<br>
横坐标是每次盘算的字节巨细。可见,不管盘算字节巨细,PureJava完成分明快于ZlibCRC完成。
淘宝的优化办法:
关于瓶颈1,固然PureJava完成比本来快了很多,可是这远远没有到达极致。为了不JNI挪用开支,能够经由过程完成JVMIntrinsic来优化。Intrinsic能够在JIT过程当中将响应的完成inline到JIT后的天生的方针平台(如x86)指令中,比方Math.sin。
关于瓶颈2,SSE4.2指令集供应了CRC32指令减速校验盘算,这个指令的latency为3,thoughput是1,相称给力。固然多项式是crc32c和zlib的crc32分歧,可是假如没有汗青数据的累赘,仍是能够使用的。
优化了局:
使用了CRC32指令并完成为JVMIntrinsic后,我们看一下这个完成将有甚么样的体现?
<br>
是的,您没有看错,运转一样的benchmark程序,使用CRC32指令的JVMIntrinsic完成了可怕的完胜。在1个字节盘算下,zlibJNI完成速率是13M/s,PureJava完成是93M/s,CRC32Intrinsic是114M/s。在1K字节盘算下,CRC32Intrinsic完成是PureJava完成速率的10倍,是ZlibJNI完成的20倍,到达了6GB/s。再次夸大,这都是Java程序挪用的功能。
停止了?
木有,木有。这还不是极致,第一,今朝的Intrinsic完成为了便利,并未将CRC32指令间接inline到JIT后的指令中,必要经由过程call指令挪用。第二,注重到CRC32指令的latency是3,今朝完成没有益用ILP,实际上还能进步3倍功能。实践上我们已有了再进步2.6倍的完成。是的,再进步2.6倍。
预知后事怎样,敬请延续存眷中心体系研发部公用盘算组。
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难 |
|