You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2018/01/22 23:06:12 UTC
[08/10] activemq-artemis git commit: ARTEMIS-1616 OpenWire
improvements
ARTEMIS-1616 OpenWire improvements
Optimized SimpleString::split because heavily used into AddressImpl::new
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/051a3cae
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/051a3cae
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/051a3cae
Branch: refs/heads/master
Commit: 051a3cae49c488314b9a5ccaa36056a358e4b9df
Parents: 54d0161
Author: Francesco Nigro <ni...@gmail.com>
Authored: Tue Jan 16 18:40:06 2018 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Jan 22 18:02:03 2018 -0500
----------------------------------------------------------------------
.../activemq/artemis/api/core/SimpleString.java | 65 ++++++++++++++++++++
1 file changed, 65 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/051a3cae/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
index dbf7468..b3af64a 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.api.core;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import io.netty.buffer.ByteBuf;
@@ -34,6 +35,7 @@ import org.apache.activemq.artemis.utils.DataConstants;
*/
public final class SimpleString implements CharSequence, Serializable, Comparable<SimpleString> {
+ private static final SimpleString EMPTY = new SimpleString("");
private static final long serialVersionUID = 4204223851422244307L;
// Attributes
@@ -323,6 +325,14 @@ public final class SimpleString implements CharSequence, Serializable, Comparabl
* @return An array of SimpleStrings
*/
public SimpleString[] split(final char delim) {
+ if (this.str != null) {
+ return splitWithCachedString(this, delim);
+ } else {
+ return splitWithoutCachedString(delim);
+ }
+ }
+
+ private SimpleString[] splitWithoutCachedString(final char delim) {
List<SimpleString> all = null;
byte low = (byte) (delim & 0xFF); // low byte
@@ -361,6 +371,58 @@ public final class SimpleString implements CharSequence, Serializable, Comparabl
}
}
+ private static SimpleString[] splitWithCachedString(final SimpleString simpleString, final int delim) {
+ final String str = simpleString.str;
+ final byte[] data = simpleString.data;
+ final int length = str.length();
+ List<SimpleString> all = null;
+ int index = 0;
+ while (index < length) {
+ final int delimIndex = str.indexOf(delim, index);
+ if (delimIndex == -1) {
+ //just need to add the last one
+ break;
+ } else {
+ all = addSimpleStringPart(all, data, index, delimIndex);
+ }
+ index = delimIndex + 1;
+ }
+ if (all == null) {
+ return new SimpleString[]{simpleString};
+ } else {
+ // Adding the last one
+ all = addSimpleStringPart(all, data, index, length);
+ // Converting it to arrays
+ final SimpleString[] parts = new SimpleString[all.size()];
+ return all.toArray(parts);
+ }
+ }
+
+ private static List<SimpleString> addSimpleStringPart(List<SimpleString> all,
+ final byte[] data,
+ final int startIndex,
+ final int endIndex) {
+ final int expectedLength = endIndex - startIndex;
+ final SimpleString ss;
+ if (expectedLength == 0) {
+ ss = EMPTY;
+ } else {
+ //extract a byte[] copy from this
+ final int ssIndex = startIndex << 1;
+ final int delIndex = endIndex << 1;
+ final byte[] bytes = Arrays.copyOfRange(data, ssIndex, delIndex);
+ ss = new SimpleString(bytes);
+ }
+ // We will create the ArrayList lazily
+ if (all == null) {
+ // There will be at least 3 strings on this case (which is the actual common usecase)
+ // For that reason I'm allocating the ArrayList with 3 already
+ all = new ArrayList<>(3);
+ }
+ all.add(ss);
+ return all;
+ }
+
/**
* checks to see if this SimpleString contains the char parameter passed in
*
@@ -368,6 +430,9 @@ public final class SimpleString implements CharSequence, Serializable, Comparabl
* @return true if the char is found, false otherwise.
*/
public boolean contains(final char c) {
+ if (this.str != null) {
+ return this.str.indexOf(c) != -1;
+ }
final byte low = (byte) (c & 0xFF); // low byte
final byte high = (byte) (c >> 8 & 0xFF); // high byte