Changeset 7816 for trunk/legacy/jvmlink


Ignore:
Timestamp:
11/24/11 15:38:09 (8 years ago)
Author:
mario
Message:

significantly speed up socket writing by using byte-writer method (probably the code is a bit ugly, though)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/legacy/jvmlink/src/main/java/loci/jvmlink/ConnThread.java

    r7815 r7816  
    476476      if (insideType == INT_TYPE) { 
    477477        writeInt(4); 
    478         int[] intArray = (int[]) theArray; 
    479         for (int i=0; i<arrayLen; i++) { 
    480           writeInt(intArray[i]); 
    481         } 
    482         if (arrayLen > 10000) { 
    483           debug("Last two elements are " + 
    484             intArray[arrayLen-1] + " and " + intArray[arrayLen-2]); 
    485         } 
     478        int[] iArray = (int[]) theArray; 
     479        byte[] bArray = new byte[4*arrayLen]; 
     480        int j=0; 
     481        if (little) { 
     482          for (int i=0; i<arrayLen; i++) { 
     483            int val = iArray[i]; 
     484            bArray[j++] = (byte)( val        & 0xff); 
     485            bArray[j++] = (byte)((val >>  8) & 0xff); 
     486            bArray[j++] = (byte)((val >> 16) & 0xff); 
     487            bArray[j++] = (byte)((val >> 24) & 0xff); 
     488          } 
     489        } else { 
     490          for (int i=0; i<arrayLen; i++) { 
     491            int val = iArray[i]; 
     492            bArray[j++] = (byte)((val >> 24) & 0xff); 
     493            bArray[j++] = (byte)((val >> 16) & 0xff); 
     494            bArray[j++] = (byte)((val >>  8) & 0xff); 
     495            bArray[j++] = (byte)( val        & 0xff); 
     496          } 
     497        } 
     498        out.write(bArray); 
    486499      } 
    487500      else if (insideType == STRING_TYPE) { 
     
    493506        writeInt(1); 
    494507        byte[] bArray = (byte[]) theArray; 
    495         for (int i=0; i<arrayLen; i++) out.writeByte(bArray[i]); 
     508        out.write(bArray); 
    496509      } 
    497510      else if (insideType == CHAR_TYPE) { 
    498511        writeInt(1); 
    499512        char[] cArray = (char[]) theArray; 
    500         for (int i=0; i<arrayLen; i++) out.writeByte((byte) cArray[i]); 
     513        byte[] bArray = new byte[arrayLen]; 
     514        for (int i=0; i<arrayLen; i++) bArray[i] = (byte) cArray[i]; 
     515        out.write(bArray); 
    501516      } 
    502517      else if (insideType == FLOAT_TYPE) { 
    503518        writeInt(4); 
    504519        float[] fArray = (float[]) theArray; 
    505         for (int i=0; i<arrayLen; i++) { 
    506           int intBits = Float.floatToIntBits(fArray[i]); 
    507           writeInt(intBits); 
    508         } 
     520        byte[] bArray = new byte[4*arrayLen]; 
     521        int j=0; 
     522        if (little) { 
     523          for (int i=0; i<arrayLen; i++) { 
     524            int val = Float.floatToIntBits(fArray[i]); 
     525            bArray[j++] = (byte)( val        & 0xff); 
     526            bArray[j++] = (byte)((val >>  8) & 0xff); 
     527            bArray[j++] = (byte)((val >> 16) & 0xff); 
     528            bArray[j++] = (byte)((val >> 24) & 0xff); 
     529          } 
     530        } else { 
     531          for (int i=0; i<arrayLen; i++) { 
     532            int val = Float.floatToIntBits(fArray[i]); 
     533            bArray[j++] = (byte)((val >> 24) & 0xff); 
     534            bArray[j++] = (byte)((val >> 16) & 0xff); 
     535            bArray[j++] = (byte)((val >>  8) & 0xff); 
     536            bArray[j++] = (byte)( val        & 0xff); 
     537          } 
     538        } 
     539        out.write(bArray); 
    509540      } 
    510541      else if (insideType == BOOLEAN_TYPE) { 
    511542        writeInt(1); 
    512         boolean[] bArray = (boolean[]) theArray; 
    513         for (int i=0; i<arrayLen; i++) out.writeBoolean(bArray[i]); 
     543        boolean[] BArray = (boolean[]) theArray; 
     544        byte[] bArray = new byte[arrayLen]; 
     545        for (int i=0; i<arrayLen; i++) bArray[i] = (byte) (BArray[i]?1:0); 
     546        out.write(bArray); 
    514547      } 
    515548      else if (insideType == DOUBLE_TYPE) { 
    516549        writeInt(8); 
    517550        double[] dArray = (double[]) theArray; 
    518         for (int i=0; i<arrayLen; i++) { 
    519           writeLong(Double.doubleToLongBits(dArray[i])); 
    520         } 
     551        byte[] bArray = new byte[8*arrayLen]; 
     552        int j=0; 
     553        if (little) { 
     554          for (int i=0; i<arrayLen; i++) { 
     555            long val = Double.doubleToLongBits(dArray[i]); 
     556            bArray[j++] = (byte)( val        & 0xff); 
     557            bArray[j++] = (byte)((val >>  8) & 0xff); 
     558            bArray[j++] = (byte)((val >> 16) & 0xff); 
     559            bArray[j++] = (byte)((val >> 24) & 0xff); 
     560            bArray[j++] = (byte)((val >> 32) & 0xff); 
     561            bArray[j++] = (byte)((val >> 40) & 0xff); 
     562            bArray[j++] = (byte)((val >> 48) & 0xff); 
     563            bArray[j++] = (byte)((val >> 56) & 0xff); 
     564          } 
     565        } else { 
     566          for (int i=0; i<arrayLen; i++) { 
     567            long val = Double.doubleToLongBits(dArray[i]); 
     568            bArray[j++] = (byte)((val >> 56) & 0xff); 
     569            bArray[j++] = (byte)((val >> 48) & 0xff); 
     570            bArray[j++] = (byte)((val >> 40) & 0xff); 
     571            bArray[j++] = (byte)((val >> 32) & 0xff); 
     572            bArray[j++] = (byte)((val >> 24) & 0xff); 
     573            bArray[j++] = (byte)((val >> 16) & 0xff); 
     574            bArray[j++] = (byte)((val >>  8) & 0xff); 
     575            bArray[j++] = (byte)( val        & 0xff); 
     576          } 
     577        } 
     578        out.write(bArray); 
    521579      } 
    522580      else if (insideType == LONG_TYPE) { 
    523581        writeInt(8); 
    524582        long[] lArray = (long[]) theArray; 
    525         for (int i=0; i<arrayLen; i++) writeLong(lArray[i]); 
     583        byte[] bArray = new byte[8*arrayLen]; 
     584        int j=0; 
     585        if (little) { 
     586          for (int i=0; i<arrayLen; i++) { 
     587            long val = lArray[i]; 
     588            bArray[j++] = (byte)( val        & 0xff); 
     589            bArray[j++] = (byte)((val >>  8) & 0xff); 
     590            bArray[j++] = (byte)((val >> 16) & 0xff); 
     591            bArray[j++] = (byte)((val >> 24) & 0xff); 
     592            bArray[j++] = (byte)((val >> 32) & 0xff); 
     593            bArray[j++] = (byte)((val >> 40) & 0xff); 
     594            bArray[j++] = (byte)((val >> 48) & 0xff); 
     595            bArray[j++] = (byte)((val >> 56) & 0xff); 
     596          } 
     597        } else { 
     598          for (int i=0; i<arrayLen; i++) { 
     599            long val = lArray[i]; 
     600            bArray[j++] = (byte)((val >> 56) & 0xff); 
     601            bArray[j++] = (byte)((val >> 48) & 0xff); 
     602            bArray[j++] = (byte)((val >> 40) & 0xff); 
     603            bArray[j++] = (byte)((val >> 32) & 0xff); 
     604            bArray[j++] = (byte)((val >> 24) & 0xff); 
     605            bArray[j++] = (byte)((val >> 16) & 0xff); 
     606            bArray[j++] = (byte)((val >>  8) & 0xff); 
     607            bArray[j++] = (byte)( val        & 0xff); 
     608          } 
     609        } 
     610        out.write(bArray); 
    526611      } 
    527612      else if (insideType == SHORT_TYPE) { 
    528613        writeInt(2); 
    529614        short[] sArray = (short[]) theArray; 
    530         for (int i=0; i<arrayLen; i++) writeShort(sArray[i]); 
     615        byte[] bArray = new byte[2*arrayLen]; 
     616        int j=0; 
     617        if (little) { 
     618          for (int i=0; i<arrayLen; i++) { 
     619            short val = sArray[i]; 
     620            bArray[j++] = (byte)( val       & 0xff); 
     621            bArray[j++] = (byte)((val >> 8) & 0xff); 
     622          } 
     623        } else { 
     624          for (int i=0; i<arrayLen; i++) { 
     625            short val = sArray[i]; 
     626            bArray[j++] = (byte)((val >> 8) & 0xff); 
     627            bArray[j++] = (byte)( val       & 0xff); 
     628          } 
     629        } 
     630        out.write(bArray); 
    531631      } 
    532632    } 
Note: See TracChangeset for help on using the changeset viewer.