Skip to content

Commit 2d5f930

Browse files
Copilotmarci4
andcommitted
Fix performance issues: SimpleDateFormat, LinkedList, String concat, ByteBuffer allocation
Co-authored-by: marci4 <[email protected]>
1 parent fd0d26d commit 2d5f930

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

src/main/java/org/java_websocket/drafts/Draft_6455.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
import java.security.MessageDigest;
3131
import java.security.NoSuchAlgorithmException;
3232
import java.security.SecureRandom;
33-
import java.text.SimpleDateFormat;
33+
import java.time.ZonedDateTime;
34+
import java.time.ZoneId;
35+
import java.time.format.DateTimeFormatter;
3436
import java.util.ArrayList;
35-
import java.util.Calendar;
3637
import java.util.Collections;
3738
import java.util.LinkedList;
3839
import java.util.List;
3940
import java.util.Locale;
40-
import java.util.TimeZone;
4141
import org.java_websocket.WebSocketImpl;
4242
import org.java_websocket.enums.CloseHandshakeType;
4343
import org.java_websocket.enums.HandshakeState;
@@ -105,6 +105,13 @@ public class Draft_6455 extends Draft {
105105
*/
106106
private static final String CONNECTION = "Connection";
107107

108+
/**
109+
* DateTimeFormatter for HTTP date format (thread-safe)
110+
*/
111+
private static final DateTimeFormatter HTTP_DATE_FORMAT =
112+
DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.US)
113+
.withZone(ZoneId.of("GMT"));
114+
108115
/**
109116
* Logger instance
110117
*
@@ -723,7 +730,7 @@ private int getSizeBytes(ByteBuffer mes) {
723730
@Override
724731
public List<Framedata> translateFrame(ByteBuffer buffer) throws InvalidDataException {
725732
while (true) {
726-
List<Framedata> frames = new LinkedList<>();
733+
List<Framedata> frames = new ArrayList<>();
727734
Framedata cur;
728735
if (incompleteframe != null) {
729736
// complete an incomplete frame
@@ -816,11 +823,7 @@ public void reset() {
816823
* @return the server time
817824
*/
818825
private String getServerTime() {
819-
Calendar calendar = Calendar.getInstance();
820-
SimpleDateFormat dateFormat = new SimpleDateFormat(
821-
"EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
822-
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
823-
return dateFormat.format(calendar.getTime());
826+
return HTTP_DATE_FORMAT.format(ZonedDateTime.now());
824827
}
825828

826829
/**
@@ -1114,15 +1117,15 @@ public CloseHandshakeType getCloseHandshakeType() {
11141117

11151118
@Override
11161119
public String toString() {
1117-
String result = super.toString();
1120+
StringBuilder result = new StringBuilder(super.toString());
11181121
if (getExtension() != null) {
1119-
result += " extension: " + getExtension().toString();
1122+
result.append(" extension: ").append(getExtension().toString());
11201123
}
11211124
if (getProtocol() != null) {
1122-
result += " protocol: " + getProtocol().toString();
1125+
result.append(" protocol: ").append(getProtocol().toString());
11231126
}
1124-
result += " max frame size: " + this.maxFrameSize;
1125-
return result;
1127+
result.append(" max frame size: ").append(this.maxFrameSize);
1128+
return result.toString();
11261129
}
11271130

11281131
@Override

src/main/java/org/java_websocket/util/ByteBufferUtils.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
*/
3333
public class ByteBufferUtils {
3434

35+
/**
36+
* Shared empty ByteBuffer to avoid repeated allocations
37+
*/
38+
private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.allocate(0);
39+
3540
/**
3641
* Private constructor for static class
3742
*/
@@ -52,10 +57,12 @@ public static int transferByteBuffer(ByteBuffer source, ByteBuffer dest) {
5257
int fremain = source.remaining();
5358
int toremain = dest.remaining();
5459
if (fremain > toremain) {
55-
int limit = Math.min(fremain, toremain);
56-
source.limit(limit);
60+
// We know fremain > toremain, so no need for Math.min
61+
int originalLimit = source.limit();
62+
source.limit(source.position() + toremain);
5763
dest.put(source);
58-
return limit;
64+
source.limit(originalLimit);
65+
return toremain;
5966
} else {
6067
dest.put(source);
6168
return fremain;
@@ -68,6 +75,6 @@ public static int transferByteBuffer(ByteBuffer source, ByteBuffer dest) {
6875
* @return empty ByteBuffer
6976
*/
7077
public static ByteBuffer getEmptyByteBuffer() {
71-
return ByteBuffer.allocate(0);
78+
return EMPTY_BYTE_BUFFER.duplicate();
7279
}
7380
}

0 commit comments

Comments
 (0)