Việc phân tích cú pháp dữ liệu JSON lớn dường như chậm hơn mức bình thường. Sẽ rất đáng để xác định nguyên nhân và gửi bản vá cho các tác giả cờ vây.
Trong khi đó, nếu bạn có thể tránh JSON và sử dụng định dạng nhị phân, bạn sẽ không chỉ tránh được vấn đề này; bạn cũng sẽ có được thời gian mã của bạn hiện đang dùng để phân tích cú pháp các biểu diễn thập phân ASCII của các số thành các số tương đương IEEE 754 nhị phân của chúng (và có thể gây ra lỗi làm tròn khi làm như vậy.)
Nếu cả người gửi và người nhận của bạn đều được viết bằng Go, tôi khuyên bạn nên sử dụng định dạng nhị phân của Go: gob .
Thực hiện một bài kiểm tra nhanh, tạo một bản đồ với 2000 mục nhập, mỗi lát có 1050 lần nổi đơn giản, mang lại cho tôi 20 MB JSON, mất 1,16 giây để phân tích cú pháp trên máy của tôi.
Đối với các điểm chuẩn nhanh này, tôi thực hiện tốt nhất trong ba lần chạy, nhưng tôi đảm bảo chỉ đo thời gian phân tích cú pháp thực tế, với t0 := time.Now()
trước cuộc gọi Unmarshal và in time.Now().Sub(t0)
sau nó.
Sử dụng GOB, cùng một bản đồ dẫn đến 18 MB dữ liệu, mất 115 mili giây để phân tích cú pháp:
một phần mười thời gian .
Kết quả của bạn sẽ khác nhau tùy thuộc vào số lượng phao thực tế bạn có ở đó. Nếu float của bạn có nhiều chữ số có nghĩa, xứng đáng là đại diện cho float64 của chúng, thì 20 MB JSON sẽ chứa ít hơn nhiều so với hai triệu float của tôi. Trong trường hợp đó, sự khác biệt giữa JSON và GOB sẽ ngày càng nghiêm trọng hơn.
BTW, điều này chứng minh rằng vấn đề thực sự nằm ở trình phân tích cú pháp JSON, không phải ở lượng dữ liệu cần phân tích cú pháp, cũng không nằm trong cấu trúc bộ nhớ để tạo (bởi vì cả hai bài kiểm tra đều phân tích cú pháp ~ 20 MB dữ liệu và tạo lại các phần nổi giống nhau). Việc thay thế tất cả các float bằng các chuỗi trong JSON mang lại cho tôi thời gian phân tích cú pháp là 1,02 giây, xác nhận rằng việc chuyển đổi từ biểu diễn chuỗi thành các float nhị phân mất một thời gian nhất định (so với việc chỉ di chuyển các byte xung quanh) nhưng không phải là thủ phạm chính.
Nếu người gửi và trình phân tích cú pháp đều không phải là Go hoặc nếu bạn muốn tăng hiệu suất hơn nữa GOB, bạn nên sử dụng định dạng nhị phân tùy chỉnh của riêng mình, sử dụng Bộ đệm giao thức hoặc theo cách thủ công với "mã hóa / nhị phân" và bạn bè.