r9659 - helma-ng/trunk/modules
[email protected] Wed, 22 Apr 2009 22:30:45 +0200 (CEST)
| Newsgroups | gmane.comp.java.helma.cvs |
|---|---|
| Message-ID | <20090422203045.A37D13D0D6@mia> |
Author: hannes
Date: 2009-04-22 22:30:45 +0200 (Wed, 22 Apr 2009)
New Revision: 9659
Modified:
helma-ng/trunk/modules/io.js
Log:
Performance tweak: only allocate ByteArrayOutputStream if content doesn't fit in the buffer.
Details at http://dev.helma.org/trac/helma/changeset/9659
Modified: helma-ng/trunk/modules/io.js
===================================================================
--- helma-ng/trunk/modules/io.js 2009-04-22 13:13:08 UTC (rev 9658)
+++ helma-ng/trunk/modules/io.js 2009-04-22 20:30:45 UTC (rev 9659)
@@ -8,48 +8,54 @@
}
IO.prototype.read = function(length, encoding) {
- var readAll = true,
+ var readAll = false,
buffer = null,
bytes = null,
- read = 0,
+ total = 0,
index = 0,
- total = 0;
-
- if (typeof length === "number") {
- readAll = false;
- buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, length);
- } else {
- bytes = new java.io.ByteArrayOutputStream();
- buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
+ read = 0;
+
+ if (typeof length !== "number") {
+ readAll = true;
+ length = 1024;
}
+ buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, length);
+
do {
- read = this.inputStream.read(buffer, index, buffer.length - index);
-
+ read = this.inputStream.read(buffer, index, length - index);
+
if (read < 0)
break;
-
- if (readAll) {
+
+ if (bytes) {
bytes.write(buffer, index, read);
- if (index >= buffer.length)
+ index = 0;
+ } else {
+ index += read;
+ if (index === buffer.length && readAll) {
+ bytes = new java.io.ByteArrayOutputStream(length * 2);
+ bytes.write(buffer, 0, length);
index = 0;
- }
- index += read;
+ }
+ }
total += read;
-
+
//print("read="+read+" index="+index+" total="+total+" length="+length+" buffers.length="+buffers.length);
-
- } while ((readAll || total < length) && read > 0);
-
+
+ } while ((readAll || total < length) && read > -1);
+
var resultBuffer, resultLength;
-
- if (readAll)
+
+ if (bytes)
resultBuffer = bytes.toByteArray();
+ else if (total < buffer.length)
+ resultBuffer = java.util.Arrays.copyOf(buffer, total);
else
resultBuffer = buffer;
-
+
resultLength = resultBuffer.length;
-
+
if (total != resultLength || total !== resultBuffer.length)
throw new Error("IO.read sanity check failed: total="+total+" resultLength="+resultLength+" resultBuffer.length="+resultBuffer.length);