Skip to content

This project benchmarks the JSON decoding performance of multiple Go JSON libraries on WebSocket streams.

Notifications You must be signed in to change notification settings

Capedbitmap/json-compare

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JSON Compare Benchmark

This project benchmarks the JSON decoding performance of multiple Go JSON libraries on WebSocket streams. It compares the standard library (encoding/json), goccy/go-json, bytedance/sonic, and tidwall/gjson by simulating connections to Binance’s WebSocket endpoints.

Overview

The tool connects to Binance (or a test endpoint) and opens multiple WebSocket connections—either as individual or combined streams. It receives trade messages and uses a worker pool for each JSON library to:

  • Unmarshal trade messages to a defined structure.
  • Measure the decode time, message count, and any errors.
  • Report and compare performance at regular intervals.

The benchmark includes a warm-up period to mitigate cache or JIT effects. After warm-up, it collects statistics and prints a final summary, including the average decode times and relative speeds across libraries.

Features

  • Multiple JSON Libraries: Benchmarks encoding/json, goccy/go-json, Sonic (bytedance/sonic), and tidwall/gjson.
  • WebSocket Connections: Supports individual or combined stream connections.
  • Configurable Workers: Uses a configurable number of goroutines per JSON library.
  • Rate Limiting Considerations: Opens connections in batches to respect Binance’s rate limits.
  • Graceful Shutdown: Uses context and signal handling for smooth termination.
  • Performance Reporting: Periodically prints decode statistics and final summary.

Requirements

  • Go 1.24.1 or later
  • Internet connection to connect to the Binance WebSocket endpoint (unless using a local test server)

Installation

  1. Clone the repository:

    git clone https://github.com/your-username/json-compare.git
    cd json-compare
  2. Download dependencies:

    go mod download

Usage

Run the benchmark using the default settings:

go run main.go

Command-Line Flags

You can override default settings using various command-line flags:

  • -connections
    Number of WebSocket connections to open (default: 10, max: 300 per 5 minutes).

  • -batch
    Number of connections to open per batch (default: 5).

  • -delay
    Delay in milliseconds between connection batches (default: 1000).

  • -workers
    Number of worker goroutines per JSON library (default: number of CPU cores).

  • -random
    Boolean flag to randomize the order of library processing (default: true).

  • -combined
    Use combined WebSocket streams instead of individual connections (default: true).

  • -streams
    Number of streams per connection when using combined streams (default: 3).

  • -duration
    Total test duration (default: 15m).

Example with custom settings:

go run main.go -connections=20 -batch=10 -delay=500 -workers=4 -duration=5m

Project Structure

  • main.go
    Contains the main application logic with connection management, message distribution, worker pools for each JSON library, and performance reporting.

  • go.mod & go.sum
    Define module dependencies and versioning.

About

This project benchmarks the JSON decoding performance of multiple Go JSON libraries on WebSocket streams.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages