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

Improve JSON.parse() performance #345

Closed
wants to merge 1 commit into from

Commits on May 27, 2018

  1. Use frozen string for hash key

    When use non-frozen string for hash key with `rb_hash_aset()`, it will duplicate and freeze it internally.
    To avoid duplicate and freeze, this patch will give a frozen string in `rb_hash_aset()`.
    
    ## Before
    ```
    Warming up --------------------------------------
                    json    14.000  i/100ms
    Calculating -------------------------------------
                    json    148.844  (± 1.3%) i/s -    756.000  in   5.079969s
    ```
    
    ### After
    ```
    Warming up --------------------------------------
                    json    16.000  i/100ms
    Calculating -------------------------------------
                    json    165.608  (± 1.8%) i/s -    832.000  in   5.025367s
    ```
    
    ### Test code
    ```
    require 'json'
    require 'securerandom'
    require 'benchmark/ips'
    
    obj = []
    
    1000.times do |i|
      obj << {
        "id": i,
        "uuid": SecureRandom.uuid,
        "created_at": Time.now
      }
    end
    
    json = obj.to_json
    
    Benchmark.ips do |x|
      x.report "json" do |iter|
        count = 0
        while count < iter
          JSON.parse(json)
          count += 1
        end
      end
    end
    ```
    Watson1978 committed May 27, 2018
    Configuration menu
    Copy the full SHA
    20e9946 View commit details
    Browse the repository at this point in the history