仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 921|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA教程之Java利用“指针”疾速对照字节仓酷云

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。怎样才干疾速对照两个字节数组呢?我将成绩形貌成上面的接口:

  • publicintcompareTo(byte[]b1,ints1,intl1,byte[]b2,ints2,intl2);
最直不雅的做法是同时遍历两个数组,两两对照。

  • publicintcompareTo(byte[]buffer1,intoffset1,intlength1,
  • byte[]buffer2,intoffset2,intlength2){
  • //Shortcircuitequalcase
  • if(buffer1==buffer2&&offset1==offset2
  • &&length1==length2){
  • return0;
  • }
  • //BringWritableComparatorcodelocal
  • intend1=offset1+length1;
  • intend2=offset2+length2;
  • for(inti=offset1,j=offset2;i<end1&&j<end2;i++,j++){
  • inta=(buffer1&0xff);
  • intb=(buffer2[j]&0xff);
  • if(a!=b){
  • returna-b;
  • }
  • }
  • returnlength1-length2;
  • }
假如事变这么复杂就停止了,就没成心思了。
假如要提拔功能,能够做轮回睁开等等优化,但这些优化应当依附JVM来做,新的JVM能够做的很好。那另有甚么举措能够进步功能呢?
能够将字节数组兼并!!下面的例子中,每一个byte自愿转型成了int,再对照。实在我们能够将8个byte转换成一个long,在对照long,如许效果会不会好些?用甚么办法转换才是最优的?

  • longsun.misc.Unsafe.getLong(Objecto,intoffset)
Java供应了一个当地办法,能够最快最恶化换byte与long。该函数是间接会见一个对象的内存,内存地点是对象指针加偏移量,前往该地点指向的值。有人说Java很平安,不成以操纵指针,以是有的时分功能也不高。实在不合错误,有了这个Unsafe类,Java一样也不平安。以是Unsafe类中的办法都不是public的,不外不妨,我们有反射。言回正传,上面是利用这类手艺手腕的完成代码。

  • publicintcompareTo(byte[]buffer1,intoffset1,intlength1,
  • byte[]buffer2,intoffset2,intlength2){
  • //Shortcircuitequalcase
  • if(buffer1==buffer2&&offset1==offset2
  • &&length1==length2){
  • return0;
  • }
  • intminLength=Math.min(length1,length2);
  • intminWords=minLength/Longs.BYTES;
  • intoffset1Adj=offset1+BYTE_ARRAY_BASE_OFFSET;
  • intoffset2Adj=offset2+BYTE_ARRAY_BASE_OFFSET;

  • /*
  • *Compare8bytesatatime.Benchmarkingshowscomparing8
  • *bytesatatimeisnoslowerthancomparing4bytesatatime
  • *evenon32-bit.Ontheotherhand,itissubstantiallyfaster
  • *on64-bit.
  • */
  • for(inti=0;i<minWords*Longs.BYTES;i+=Longs.BYTES){
  • longlw=theUnsafe.getLong(buffer1,offset1Adj+(long)i);
  • longrw=theUnsafe.getLong(buffer2,offset2Adj+(long)i);
  • longdiff=lw^rw;

  • if(diff!=0){
  • if(!littleEndian){
  • return(lw+Long.MIN_VALUE)<(rw+Long.MIN_VALUE)?-1
  • :1;
  • }

  • //Usebinarysearch,一下省略多少代码
  • .....
  • return(int)(((lw>>>n)&0xFFL)-((rw>>>n)&0xFFL));
  • }
  • }

  • //Theepiloguetocoverthelast(minLength%elements.
  • for(inti=minWords*Longs.BYTES;i<minLength;i++){
  • intresult=UnsignedBytes.compare(buffer1[offset1+i],
  • buffer2[offset2+i]);
  • if(result!=0){
  • returnresult;
  • }
  • }
  • returnlength1-length2;
  • }
完成比本来庞大了一些。但此次一次能够对照8个字节了。这类getLong函数和体系的字节序是牢牢相干的,假如是小端序操纵起来有点贫苦,代码先省略失落。如许操纵实践效果怎样?我们必要对照测试下。对照两个1M的字节数组,假如利用第一个版本,每次对照均匀必要2.5499ms,假如利用第二个版本,必要0.8359ms,提拔了3倍。对应这类CPU麋集型的操纵,如许的提拔但是很可不雅的。
假如要提拔功能,利用Unsafe间接会见内存也是不错的选择。

由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,
第二个灵魂 该用户已被删除
沙发
 楼主| 发表于 2015-4-9 15:39:00 | 显示全部楼层
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-13 09:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表