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

He-Pin pushed a commit to branch perf/arrays-copyOf
in repository https://gitbox.apache.org/repos/asf/pekko.git

commit eb444567d05124c5965783eb04ccfbd9799ec4a1
Author: θ™ŽιΈ£ <[email protected]>
AuthorDate: Tue Jun 23 13:00:16 2026 +0800

    perf: use Arrays.copyOf/copyOfRange instead of manual new Array + arraycopy
    
    Motivation:
    Several places allocate a new array then immediately copy from an
    existing array using System.arraycopy. java.util.Arrays.copyOf and
    copyOfRange combine allocation and copy in a single call that the JIT
    can intrinsify more effectively.
    
    Modification:
    - ByteString.scala: 3 sites β€” clearTemp, resizeTemp, fromArray
      replace new Array[Byte] + System.arraycopy with
      java.util.Arrays.copyOf / copyOfRange
    - ImmutableLongMap.scala: replace full array copy with values.clone()
    - SnapshotSerializer.scala: replace partial copy with
      java.util.Arrays.copyOfRange
    
    Result:
    Fewer lines, potentially faster due to JIT intrinsification of the
    combined allocate+copy operation. ByteString builder operations
    benefit most as they are in frequently-called paths.
    
    Tests:
    sbt "actor/compile" "remote/compile" "persistence/compile" β€” passed
    
    References:
    Refs #3136
---
 actor/src/main/scala/org/apache/pekko/util/ByteString.scala      | 9 +++------
 .../pekko/persistence/serialization/SnapshotSerializer.scala     | 3 +--
 .../scala/org/apache/pekko/remote/artery/ImmutableLongMap.scala  | 3 +--
 3 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/actor/src/main/scala/org/apache/pekko/util/ByteString.scala 
b/actor/src/main/scala/org/apache/pekko/util/ByteString.scala
index 57c7762ef4..9fbc0127ae 100644
--- a/actor/src/main/scala/org/apache/pekko/util/ByteString.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/ByteString.scala
@@ -2728,8 +2728,7 @@ object CompactByteString {
     val copyLength = Math.max(Math.min(array.length - copyOffset, length), 0)
     if (copyLength == 0) empty
     else {
-      val copyArray = new Array[Byte](copyLength)
-      System.arraycopy(array, copyOffset, copyArray, 0, copyLength)
+      val copyArray = java.util.Arrays.copyOfRange(array, copyOffset, 
copyOffset + copyLength)
       ByteString.ByteString1C(copyArray)
     }
   }
@@ -2789,16 +2788,14 @@ final class ByteStringBuilder extends Builder[Byte, 
ByteString] {
 
   private def clearTemp(): Unit = {
     if (_tempLength > 0) {
-      val arr = new Array[Byte](_tempLength)
-      System.arraycopy(_temp, 0, arr, 0, _tempLength)
+      val arr = java.util.Arrays.copyOf(_temp, _tempLength)
       _builder += ByteString1(arr)
       _tempLength = 0
     }
   }
 
   private def resizeTemp(size: Int): Unit = {
-    val newtemp = new Array[Byte](size)
-    if (_tempLength > 0) System.arraycopy(_temp, 0, newtemp, 0, _tempLength)
+    val newtemp = java.util.Arrays.copyOf(_temp, size)
     _temp = newtemp
     _tempCapacity = _temp.length
   }
diff --git 
a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
 
b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
index d60b314a62..0e022575de 100644
--- 
a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
+++ 
b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
@@ -106,8 +106,7 @@ class SnapshotSerializer(val system: ExtendedActorSystem) 
extends BaseSerializer
     val manifest =
       if (remaining == 0) ""
       else {
-        val manifestBytes = new Array[Byte](remaining)
-        System.arraycopy(bytes, 4, manifestBytes, 0, remaining)
+        val manifestBytes = java.util.Arrays.copyOfRange(bytes, 4, 4 + 
remaining)
         migrateManifestToPekkoIfNecessary(new String(manifestBytes, UTF_8))
       }
     (serializerId, manifest)
diff --git 
a/remote/src/main/scala/org/apache/pekko/remote/artery/ImmutableLongMap.scala 
b/remote/src/main/scala/org/apache/pekko/remote/artery/ImmutableLongMap.scala
index 2b3d7f70ac..2d9eaa410f 100644
--- 
a/remote/src/main/scala/org/apache/pekko/remote/artery/ImmutableLongMap.scala
+++ 
b/remote/src/main/scala/org/apache/pekko/remote/artery/ImmutableLongMap.scala
@@ -69,8 +69,7 @@ private[pekko] class ImmutableLongMap[A >: Null] private 
(private val keys: Arra
       val i = Arrays.binarySearch(keys, key)
       if (i >= 0) {
         // existing key, replace value
-        val newValues = new Array[A](values.length)
-        System.arraycopy(values, 0, newValues, 0, values.length)
+        val newValues = values.clone()
         newValues(i) = value
         new ImmutableLongMap(keys, newValues)
       } else {


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

Reply via email to