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

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fury.git


The following commit(s) were added to refs/heads/main by this push:
     new f4865f09 perf(java): optimize object array copy perf (#1770)
f4865f09 is described below

commit f4865f097d1c21777c12fb326c139d48beb65855
Author: Shawn Yang <[email protected]>
AuthorDate: Sat Jul 27 17:08:04 2024 +0800

    perf(java): optimize object array copy perf (#1770)
    
    ## What does this PR do?
    
    optimize object array copy perf
    
    ## Related issues
    
    Closes #1749
    
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/fury/issues/new/choose) describing the
    need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    
    ## Benchmark
    
    ```
    Benchmark                             (bufferType)  (references)   Mode  
Cnt        Score         Error  Units
    CopyBenchmark.fury_copy_object_array         array         false  thrpt    
3  3738130.731 ± 2558439.249  ops/s
    CopyBenchmark.kryo_copy_object_array         array         false  thrpt    
3  1840856.001 ± 3577628.201  ops/s
    
    Benchmark                             (bufferType)  (references)   Mode  
Cnt        Score         Error  Units
    CopyBenchmark.fury_copy_object_array         array         false  thrpt    
3  8025674.789 ± 7659990.718  ops/s
    CopyBenchmark.kryo_copy_object_array         array         false  thrpt    
3  1167037.754 ± 1372076.679  ops/s
    ```
---
 .../java/org/apache/fury/benchmark/CopyBenchmark.java     | 10 ++++++++++
 .../main/java/org/apache/fury/benchmark/data/Data.java    |  2 ++
 .../java/org/apache/fury/benchmark/state/KryoState.java   |  3 +++
 .../java/org/apache/fury/serializer/ArraySerializers.java | 15 +++++++++++++--
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git 
a/java/benchmark/src/main/java/org/apache/fury/benchmark/CopyBenchmark.java 
b/java/benchmark/src/main/java/org/apache/fury/benchmark/CopyBenchmark.java
index 42309674..9ff340be 100644
--- a/java/benchmark/src/main/java/org/apache/fury/benchmark/CopyBenchmark.java
+++ b/java/benchmark/src/main/java/org/apache/fury/benchmark/CopyBenchmark.java
@@ -72,6 +72,16 @@ public class CopyBenchmark {
     return state.kryo.copy(state.data.intList);
   }
 
+  @Benchmark
+  public Object fury_copy_object_array(FuryState.DataState state) {
+    return state.fury.copy(state.data.objectArray);
+  }
+
+  @Benchmark
+  public Object kryo_copy_object_array(KryoState.DataState state) {
+    return state.kryo.copy(state.data.objectArray);
+  }
+
   public static void main(String[] args) throws IOException {
     if (args.length == 0) {
       String commandLine =
diff --git 
a/java/benchmark/src/main/java/org/apache/fury/benchmark/data/Data.java 
b/java/benchmark/src/main/java/org/apache/fury/benchmark/data/Data.java
index b66309ae..d57a1a92 100644
--- a/java/benchmark/src/main/java/org/apache/fury/benchmark/data/Data.java
+++ b/java/benchmark/src/main/java/org/apache/fury/benchmark/data/Data.java
@@ -100,12 +100,14 @@ public class Data {
 
   public List<String> stringList = new ArrayList<>();
   public List<Integer> intList = new ArrayList<>();
+  public Object[] objectArray = new Integer[20];
   public Map<String, String> stringMap = new HashMap<>();
   public Map<Integer, Integer> intMap = new HashMap<>();
 
   {
     for (int i = 0; i < 20; i++) {
       stringList.add("hello, " + i);
+      objectArray[i] = i;
       intList.add(i);
       stringMap.put("key" + i, "value" + i);
       intMap.put(i, i * 2);
diff --git 
a/java/benchmark/src/main/java/org/apache/fury/benchmark/state/KryoState.java 
b/java/benchmark/src/main/java/org/apache/fury/benchmark/state/KryoState.java
index 83678772..ab2942da 100644
--- 
a/java/benchmark/src/main/java/org/apache/fury/benchmark/state/KryoState.java
+++ 
b/java/benchmark/src/main/java/org/apache/fury/benchmark/state/KryoState.java
@@ -86,6 +86,9 @@ public class KryoState {
       kryo.setRegistrationRequired(registerClass);
       kryo.register(int[].class);
       kryo.register(long[].class);
+      kryo.register(Object[].class);
+      kryo.register(Integer[].class);
+      kryo.register(String[].class);
       kryo.register(ArrayList.class);
       kryo.register(HashMap.class);
     }
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java 
b/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
index edae8c16..6ac83a2e 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
@@ -113,8 +113,19 @@ public class ArraySerializers {
     public T[] copy(T[] originArray) {
       int length = originArray.length;
       Object[] newArray = newArray(length);
-      for (int i = 0; i < length; i++) {
-        newArray[i] = fury.copyObject(originArray[i]);
+      Serializer componentSerializer = this.componentTypeSerializer;
+      if (componentSerializer != null) {
+        if (componentSerializer.isImmutable()) {
+          System.arraycopy(originArray, 0, newArray, 0, length);
+        } else {
+          for (int i = 0; i < length; i++) {
+            newArray[i] = componentSerializer.copy(originArray[i]);
+          }
+        }
+      } else {
+        for (int i = 0; i < length; i++) {
+          newArray[i] = fury.copyObject(originArray[i]);
+        }
       }
       return (T[]) newArray;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to