You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by il...@apache.org on 2020/12/28 10:07:19 UTC

[ignite] branch master updated: IGNITE-13856 Linear performance for DirectByteBufferStreamImplV2.writeString - Fixes #8577.

This is an automated email from the ASF dual-hosted git repository.

ilyak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new ff203b2  IGNITE-13856 Linear performance for DirectByteBufferStreamImplV2.writeString - Fixes #8577.
ff203b2 is described below

commit ff203b2ee8e8a05f0783b440f2da8f6fbc4beb8d
Author: Ilya Kazakov <ka...@gmail.com>
AuthorDate: Mon Dec 28 13:06:18 2020 +0300

    IGNITE-13856 Linear performance for DirectByteBufferStreamImplV2.writeString - Fixes #8577.
    
    Signed-off-by: Ilya Kasnacheev <il...@gmail.com>
---
 .../stream/v2/DirectByteBufferStreamImplV2.java    | 15 ++++++-
 ...ectByteBufferStreamImplV2ByteOrderSelfTest.java | 47 ++++++++++++++++++++++
 2 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2.java
index ef6e01f..50380ea 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2.java
@@ -301,6 +301,9 @@ public class DirectByteBufferStreamImplV2 implements DirectByteBufferStream {
     /** */
     protected boolean lastFinished;
 
+    /** byte-array representation of string */
+    private byte[] curStrBackingArr;
+
     /**
      * @param msgFactory Message factory.
      */
@@ -584,7 +587,17 @@ public class DirectByteBufferStreamImplV2 implements DirectByteBufferStream {
 
     /** {@inheritDoc} */
     @Override public void writeString(String val) {
-        writeByteArray(val != null ? val.getBytes() : null);
+        if (val != null) {
+            if (curStrBackingArr == null)
+                curStrBackingArr = val.getBytes();
+
+            writeByteArray(curStrBackingArr);
+
+            if (lastFinished)
+                curStrBackingArr = null;
+        }
+        else
+            writeByteArray(null);
     }
 
     /** {@inheritDoc} */
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2ByteOrderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2ByteOrderSelfTest.java
index 795fc63..a2c6daa 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2ByteOrderSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/v2/DirectByteBufferStreamImplV2ByteOrderSelfTest.java
@@ -22,6 +22,7 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.direct.stream.DirectByteBufferStream;
 import org.apache.ignite.internal.util.GridUnsafe;
@@ -340,6 +341,52 @@ public class DirectByteBufferStreamImplV2ByteOrderSelfTest {
     }
 
     /**
+     * tests linear performance for writeString method
+     * */
+    @Test
+    public void testNonSuperLinearPerformanceForWriteString() {
+        int len = 400_000;
+
+        int trues = 0;
+        for (int i = 0; i < 10; i++) {
+            long t1 = getWriteStringExecutionTime(len);
+            long t2 = getWriteStringExecutionTime(len * 10);
+            long t3 = getWriteStringExecutionTime(len * 100);
+
+            if (t2 <= t1 * 10)
+                trues++;
+
+            if (t3 <= t1 * 100)
+                trues++;
+        }
+
+        assertTrue(trues > 0);
+    }
+
+    /**
+     * execution time
+     * @param len string length
+     * @return writing time
+     * */
+    private long getWriteStringExecutionTime(int len) {
+        String s = StringUtils.leftPad("1", len, "_");
+
+        buff.rewind();
+
+        DirectByteBufferStreamImplV2 stream = createStream(buff);
+
+        long d1 = System.currentTimeMillis();
+        while (!stream.lastFinished()) {
+            stream.writeString(s);
+
+            buff.rewind();
+        }
+        long d2 = System.currentTimeMillis();
+
+        return d2 - d1;
+    }
+
+    /**
      * @param srcArr Source array.
      * @param writeBigEndian If {@code true}, then write in big-endian mode.
      * @param readBigEndian If {@code true}, then read in big-endian mode.