|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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, |
|