Skip to content

Commit 20bcf81

Browse files
committed
perf(java): bind ipc debug log to config, use sonic for protocol json
The Java IPC protocol unconditionally enabled debug logging on the reader and writer, causing each of the ~2.5k messages per parse to trigger a full JSON dump to stderr. Bind SetDebug to the existing JavaParserServer config so debug output is off by default. Switch the protocol layer to sonic for the four Unmarshal sites and one Marshal site. encoding/json was the dominant cost on the Go side (38% of CPU, 2s of unmarshal time on a 2k-class repo); sonic cuts the ReadMessage path by ~75%. Combined effect on travel-business (2153 java files): wall 61.0s -> 53.4s (-12.5%) user 6:37 -> 5:30 Go CPU 8.48% -> 5.83%
1 parent 3f048df commit 20bcf81

2 files changed

Lines changed: 10 additions & 9 deletions

File tree

lang/java/ipc/protocol.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"io"
2424
"log"
2525

26+
"github.com/bytedance/sonic"
2627
"github.com/cloudwego/abcoder/lang/java/pb"
2728
)
2829

@@ -133,7 +134,7 @@ func (pr *ProtocolReader) ReadMessage() (*pb.Message, error) {
133134
Payload json.RawMessage `json:"payload,omitempty"`
134135
}
135136
var raw rawMessage
136-
if err := json.Unmarshal(pr.buf, &raw); err != nil {
137+
if err := sonic.Unmarshal(pr.buf, &raw); err != nil {
137138
if pr.debug {
138139
log.Printf("[Protocol] <<< Failed to unmarshal: %v", err)
139140
}
@@ -156,7 +157,7 @@ func (pr *ProtocolReader) ReadMessage() (*pb.Message, error) {
156157
Payload json.RawMessage `json:"payload"`
157158
}
158159
var arRaw rawAnalyzeResponse
159-
if err := json.Unmarshal(raw.Payload, &arRaw); err != nil {
160+
if err := sonic.Unmarshal(raw.Payload, &arRaw); err != nil {
160161
return nil, fmt.Errorf("failed to unmarshal analyze_response payload: %w", err)
161162
}
162163

@@ -183,7 +184,7 @@ func (pr *ProtocolReader) ReadMessage() (*pb.Message, error) {
183184
if rm, ok := payload.(json.RawMessage); ok {
184185
ar.Payload = rm
185186
} else {
186-
if err := json.Unmarshal(arRaw.Payload, payload); err != nil {
187+
if err := sonic.Unmarshal(arRaw.Payload, payload); err != nil {
187188
return nil, fmt.Errorf("failed to unmarshal analyze_response inner payload (%s): %w", arRaw.PayloadType, err)
188189
}
189190
ar.Payload = payload
@@ -192,21 +193,21 @@ func (pr *ProtocolReader) ReadMessage() (*pb.Message, error) {
192193

193194
case pb.TYPE_ANALYZE_REQUEST:
194195
var req pb.AnalyzeRequest
195-
if err := json.Unmarshal(raw.Payload, &req); err != nil {
196+
if err := sonic.Unmarshal(raw.Payload, &req); err != nil {
196197
return nil, fmt.Errorf("failed to unmarshal analyze_request payload: %w", err)
197198
}
198199
msg.Payload = &req
199200

200201
case pb.TYPE_STOP_REQUEST:
201202
var stop pb.StopRequest
202-
if err := json.Unmarshal(raw.Payload, &stop); err != nil {
203+
if err := sonic.Unmarshal(raw.Payload, &stop); err != nil {
203204
return nil, fmt.Errorf("failed to unmarshal stop_request payload: %w", err)
204205
}
205206
msg.Payload = &stop
206207

207208
case pb.TYPE_HEARTBEAT:
208209
var hb pb.Heartbeat
209-
if err := json.Unmarshal(raw.Payload, &hb); err != nil {
210+
if err := sonic.Unmarshal(raw.Payload, &hb); err != nil {
210211
return nil, fmt.Errorf("failed to unmarshal heartbeat payload: %w", err)
211212
}
212213
msg.Payload = &hb
@@ -247,7 +248,7 @@ func (pw *ProtocolWriter) SetDebug(enabled bool) {
247248

248249
// WriteMessage writes a length-prefixed JSON Message.
249250
func (pw *ProtocolWriter) WriteMessage(msg *pb.Message) error {
250-
data, err := json.Marshal(msg)
251+
data, err := sonic.Marshal(msg)
251252
if err != nil {
252253
return fmt.Errorf("failed to marshal JSON message: %w", err)
253254
}

lang/java/ipc/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func (s *JavaParserServer) sendAnalyzeRequest(repoPath string, config *pb.Analyz
245245
}
246246

247247
writer := NewProtocolWriter(s.conn)
248-
writer.SetDebug(true) // Enable debug logging for sent messages
248+
writer.SetDebug(s.config.Debug)
249249
if err := writer.WriteRequest(request); err != nil {
250250
return fmt.Errorf("failed to write analyze request: %w", err)
251251
}
@@ -261,7 +261,7 @@ func (s *JavaParserServer) readResponses(ctx context.Context, responseChan chan<
261261
defer s.cleanup()
262262

263263
reader := NewProtocolReader(s.conn)
264-
reader.SetDebug(true) // Enable debug logging for received messages
264+
reader.SetDebug(s.config.Debug)
265265

266266
for {
267267
select {

0 commit comments

Comments
 (0)