Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use memcpy() to dump true/false/null #736

Merged
merged 1 commit into from Jan 14, 2022
Merged

Commits on Jan 14, 2022

  1. Use memcpy() to dump true/false/null

    Maybe, the standard C library may use SIMD instructions,
    so it is faster than our own code.
    
    Similar:
    - ohler55#734
    - ohler55#674
    
    −               | before | after  | result
    --               | --     | --     | --
    Oj.dump (macOS)  | 1.699M | 2.020M | 1.189x
    Oj.dump (Linux)  | 1.849M | 2.260M | 1.222x
    
    ### Environment
    - macOS
      - macOS 12.1
      - Apple M1 Max
      - Apple clang version 13.0.0 (clang-1300.0.29.30)
      - Ruby 3.1.0
    - Linux
      - Zorin OS 16
      - AMD Ryzen 7 5700G
      - gcc version 11.1.0
      - Ruby 3.1.0
    
    ### macOS
    #### Before
    ```
    Warming up --------------------------------------
                 Oj.dump   169.730k i/100ms
    Calculating -------------------------------------
                 Oj.dump      1.699M (± 0.7%) i/s -     25.629M in  15.089624s
    ```
    
    #### After
    ```
    Warming up --------------------------------------
                 Oj.dump   201.206k i/100ms
    Calculating -------------------------------------
                 Oj.dump      2.020M (± 0.9%) i/s -     30.382M in  15.044372s
    ```
    
    ### Linux
    #### Before
    ```
    Warming up --------------------------------------
                 Oj.dump   180.943k i/100ms
    Calculating -------------------------------------
                 Oj.dump      1.849M (± 1.1%) i/s -     27.865M in  15.072276s
    ```
    
    #### After
    ```
    Warming up --------------------------------------
                 Oj.dump   224.695k i/100ms
    Calculating -------------------------------------
                 Oj.dump      2.260M (± 1.4%) i/s -     33.929M in  15.012352s
    ```
    
    ### Test code
    ```ruby
    require 'benchmark/ips'
    require 'oj'
    
    data = {
      true: (0..10).map { true },
      false: (0..10).map { false },
      null: (0..10).map { nil },
    }
    
    Benchmark.ips do |x|
      x.time = 15
    
      x.report('Oj.dump') { Oj.dump(data) }
    end
    ```
    Watson1978 committed Jan 14, 2022
    Configuration menu
    Copy the full SHA
    9a18fa1 View commit details
    Browse the repository at this point in the history