I've been beating my head against the wall trying to figure out which
file I/O techniques work at speeds comparable to their Java SDK
counterparts, and which don't.  I've run benchmarks which indicate,
for example, that a batch operation on a memory mapped ByteBuffer runs
at 1/5 the speed of byte-at-a-time operations on an array-backed
ByteBuffer.  Byte-at-a-time I/O on random access files is more than
100 times slower than other techniques.  I've included my benchmark
method and its output (as run on a 2.8MB file on a HTC G1 with Android
1.1) below.

My primary questions are:
 1) Has anybody else worked through various I/O techniques under
Android and figured out which are usable and which are too inefficient
to bother with?
 2) Can I expect these libraries to be significantly more efficient in
Android 1.5?

Question (2) is the really important one.  I'll rewrite my apps for
efficiency if I have to, but if the issue is going to be rendered moot
in a matter of weeks, I'd rather not go to quite as much trouble.

-Beekeeper

---

  public void testReading(final RandomAccessFile in) throws
IOException {
    // Allocate files and objects outside of timing loops
    final FileChannel channel = in.getChannel();
    final int fileSize = (int)channel.size();
    final byte[] testBytes = new byte[fileSize];
    final ByteBuffer buff = ByteBuffer.allocate(fileSize);
    final byte[] buffArray = buff.array();
    final int buffBase = buff.arrayOffset();

    // Read from channel into buffer, and batch read from buffer to
byte array
    long time1 = System.currentTimeMillis();
    channel.position(0);
    channel.read(buff);
    buff.flip();
    buff.get(testBytes);
    long time2 = System.currentTimeMillis();
    System.out.println("Fast load: " + (time2 - time1) + "ms");


    // Read from channel into buffer, and batch copy from underlying
array
    time1 = System.currentTimeMillis();
    channel.position(0);
    channel.read(buff);
    buff.flip();
    System.arraycopy(buffArray, buffBase, testBytes, 0,
testBytes.length);
    time2 = System.currentTimeMillis();
    System.out.println("Another fast load: " + (time2 - time1) +
"ms");

    // Read from channel into buffer, and get bytes one-by-one from
underlying array
    time1 = System.currentTimeMillis();
    channel.position(0);
    channel.read(buff);
    buff.flip();
    for (int i = 0, j = buffBase, ni = testBytes.length; i < ni; i++, j
++)
      testBytes[i] = buffArray[j];
    time2 = System.currentTimeMillis();
    System.out.println("Fastish load: " + (time2 - time1) + "ms");

    // Read from channel into buffer, and get bytes one-by-one
    time1 = System.currentTimeMillis();
    channel.position(0);
    channel.read(buff);
    buff.flip();
    for (int i = 0, ni = testBytes.length; i < ni; i++)
      testBytes[i] = buff.get();
    buff.flip();
    time2 = System.currentTimeMillis();
    System.out.println("Medium load: " + (time2 - time1) + "ms");

    // Memory map buffer, and batch read from buffer to byte array
    time1 = System.currentTimeMillis();
    final MappedByteBuffer buff2 = channel.map(MapMode.READ_WRITE, 0,
fileSize);
    buff2.get(testBytes);
    buff2.flip();
    time2 = System.currentTimeMillis();
    System.out.println("Slow load: " + (time2 - time1) + "ms");

    // Read bytes one-by-one, directly from file
    time1 = System.currentTimeMillis();
    in.seek(0);
    for (int i = 0, ni = testBytes.length; i < ni; i++)
      testBytes[i] = (byte)in.read();
    time2 = System.currentTimeMillis();
    System.out.println("Incredibly slow load: " + (time2 - time1) +
"ms");
  }

---

I/System.out(12168): Fast load: 83ms
I/System.out(12168): Another fast load: 23ms
I/System.out(12168): Fastish load: 1497ms
I/System.out(12168): Medium load: 5507ms
I/System.out(12168): Slow load: 32165ms
D/dalvikvm(12168): GC freed 87347 objects / 2097056 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 250ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 247ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 252ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 250ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 245ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 251ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 250ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 242ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 244ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 249ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 250ms
D/dalvikvm(12168): GC freed 87367 objects / 2097144 bytes in 243ms
D/dalvikvm(12168): GC freed 87367 objects / 2097152 bytes in 251ms
I/System.out(12168): Incredibly slow load: 446546ms



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to