Repository: asterixdb
Updated Branches:
  refs/heads/master dc0cf73a5 -> 1170755c9


ASTERIXDB-1746: no excessive new byte[] allocation during a record build

 - During a record write using RecordBuilder.write(), it allocates two new 
byte[]
   using toByteArray() method. We can replace it to getByteArray() method and
   this reduces a lot of new byte[] allocation.

Change-Id: Ibdbc6314abd72d2a93978da49ea406c3c38731d2
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1376
Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Reviewed-by: Ian Maxon <ima...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/1170755c
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/1170755c
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/1170755c

Branch: refs/heads/master
Commit: 1170755c9d97f6552b2f2fee73687d0be1ee8670
Parents: dc0cf73
Author: Taewoo Kim <wangs...@yahoo.com>
Authored: Tue Dec 6 13:59:45 2016 -0800
Committer: Taewoo Kim <wangs...@yahoo.com>
Committed: Tue Dec 6 15:35:24 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/asterix/builders/RecordBuilder.java     | 9 ++++-----
 .../data/std/util/ByteArrayAccessibleOutputStream.java      | 7 +++++++
 2 files changed, 11 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1170755c/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
index d247350..44181d5 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
@@ -20,7 +20,6 @@
 package org.apache.asterix.builders;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutput;
 import java.io.IOException;
@@ -59,7 +58,7 @@ public class RecordBuilder implements IARecordBuilder {
     private final IBinaryHashFunction utf8HashFunction;
     private final IBinaryComparator utf8Comparator;
 
-    private final ByteArrayOutputStream closedPartOutputStream;
+    private final ByteArrayAccessibleOutputStream closedPartOutputStream;
     private int[] closedPartOffsets;
     private int numberOfClosedFields;
     private byte[] nullBitMap;
@@ -73,7 +72,7 @@ public class RecordBuilder implements IARecordBuilder {
     private RuntimeRecordTypeInfo recTypeInfo;
 
     public RecordBuilder() {
-        this.closedPartOutputStream = new ByteArrayOutputStream();
+        this.closedPartOutputStream = new ByteArrayAccessibleOutputStream();
         this.numberOfClosedFields = 0;
 
         this.openPartOutputStream = new ByteArrayAccessibleOutputStream();
@@ -287,14 +286,14 @@ public class RecordBuilder implements IARecordBuilder {
                 for (int i = 0; i < numberOfSchemaFields; i++) {
                     out.writeInt(closedPartOffsets[i] + headerSize + 
(numberOfSchemaFields * 4));
                 }
-                out.write(closedPartOutputStream.toByteArray());
+                out.write(closedPartOutputStream.getByteArray(), 0, 
closedPartOutputStream.getLength());
             }
 
             // write the open part
             if (numberOfOpenFields > 0) {
                 out.writeInt(numberOfOpenFields);
                 out.write(openPartOffsetArray, 0, openPartOffsetArraySize);
-                out.write(openPartOutputStream.toByteArray());
+                out.write(openPartOutputStream.getByteArray(), 0, 
openPartOutputStream.getLength());
             }
         } catch (IOException e) {
             throw new HyracksDataException(e);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1170755c/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
index 370f936..c1558ba 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/ByteArrayAccessibleOutputStream.java
@@ -103,4 +103,11 @@ public class ByteArrayAccessibleOutputStream extends 
ByteArrayOutputStream {
         }
         buf = Arrays.copyOf(buf, newCapacity);
     }
+
+    /**
+     * Return the current length of this stream (not capacity).
+     */
+    public int getLength() {
+        return count;
+    }
 }

Reply via email to