This is an automated email from the ASF dual-hosted git repository.
tison pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new d9538eac916 [improve][broker] Improve performance of
`StatsOutputStream` by using `ArrayDeque` instead of `Stack` (#20808)
d9538eac916 is described below
commit d9538eac916660df6b70cf82b0a3671b0a167567
Author: Kim, Joo Hyuk <[email protected]>
AuthorDate: Sat Aug 12 12:57:01 2023 +0900
[improve][broker] Improve performance of `StatsOutputStream` by using
`ArrayDeque` instead of `Stack` (#20808)
---
.../org/apache/pulsar/utils/StatsOutputStream.java | 22 ++++++++++++----------
.../apache/pulsar/utils/StatsOutputStreamTest.java | 22 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 10 deletions(-)
diff --git
a/pulsar-broker/src/main/java/org/apache/pulsar/utils/StatsOutputStream.java
b/pulsar-broker/src/main/java/org/apache/pulsar/utils/StatsOutputStream.java
index 1cd4afa650e..f0a9bf5fc69 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/utils/StatsOutputStream.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/utils/StatsOutputStream.java
@@ -19,11 +19,12 @@
package org.apache.pulsar.utils;
import io.netty.buffer.ByteBuf;
-import java.util.Stack;
+import java.util.ArrayDeque;
+import java.util.Deque;
import org.apache.pulsar.common.util.SimpleTextOutputStream;
public class StatsOutputStream extends SimpleTextOutputStream {
- private final Stack<Boolean> separators = new Stack<>();
+ private final Deque<Boolean> separators = new ArrayDeque<>();
public StatsOutputStream(ByteBuf buffer) {
super(buffer);
@@ -31,7 +32,7 @@ public class StatsOutputStream extends SimpleTextOutputStream
{
public StatsOutputStream startObject() {
checkSeparator();
- separators.push(Boolean.FALSE);
+ separators.addLast(Boolean.FALSE);
write('{');
return this;
}
@@ -39,19 +40,19 @@ public class StatsOutputStream extends
SimpleTextOutputStream {
public StatsOutputStream startObject(String key) {
checkSeparator();
write('"').writeEncoded(key).write("\":{");
- separators.push(Boolean.FALSE);
+ separators.addLast(Boolean.FALSE);
return this;
}
public StatsOutputStream endObject() {
- separators.pop();
+ separators.removeLast();
write('}');
return this;
}
public StatsOutputStream startList() {
checkSeparator();
- separators.push(Boolean.FALSE);
+ separators.addLast(Boolean.FALSE);
write('[');
return this;
}
@@ -59,12 +60,12 @@ public class StatsOutputStream extends
SimpleTextOutputStream {
public StatsOutputStream startList(String key) {
checkSeparator();
write('"').writeEncoded(key).write("\":[");
- separators.push(Boolean.FALSE);
+ separators.addLast(Boolean.FALSE);
return this;
}
public StatsOutputStream endList() {
- separators.pop();
+ separators.removeLast();
write(']');
return this;
}
@@ -121,10 +122,11 @@ public class StatsOutputStream extends
SimpleTextOutputStream {
private void checkSeparator() {
if (separators.isEmpty()) {
return;
- } else if (separators.peek() == Boolean.TRUE) {
+ } else if (separators.peekLast() == Boolean.TRUE) {
write(",");
} else {
- separators.set(separators.size() - 1, Boolean.TRUE);
+ separators.pollLast();
+ separators.addLast(Boolean.TRUE);
}
}
}
diff --git
a/pulsar-broker/src/test/java/org/apache/pulsar/utils/StatsOutputStreamTest.java
b/pulsar-broker/src/test/java/org/apache/pulsar/utils/StatsOutputStreamTest.java
index 4e6348d1d4a..02bc4132e09 100644
---
a/pulsar-broker/src/test/java/org/apache/pulsar/utils/StatsOutputStreamTest.java
+++
b/pulsar-broker/src/test/java/org/apache/pulsar/utils/StatsOutputStreamTest.java
@@ -150,4 +150,26 @@ public class StatsOutputStreamTest {
reset();
return s;
}
+
+ @Test
+ public void testBehaviorOfStatsOutputStreamWithDeque() {
+ // Create a byte buffer for collecting output
+ ByteBuf buffer = Unpooled.buffer();
+
+ // Create an instance of StatsOutputStream using Deque
+ StatsOutputStream output = new StatsOutputStream(buffer);
+ output.startObject()
+ .writePair("name", "test")
+ .startList("items")
+ .writeItem(true)
+ .writeItem(123L)
+ .writeItem("sample")
+ .endList()
+ .endObject();
+
+ // Assert
+ assertEquals(buffer.toString(java.nio.charset.StandardCharsets.UTF_8),
+ "{\"name\":\"test\",\"items\":[true,123,\"sample\"]}");
+ }
+
}