2012-05-16 21 views
5

Theo https://www.ruby-toolbox.com/categories/JSON_Parsers, tôi nên tăng tốc độ điên khi sử dụng Oj. Tôi đã cài đặt gem mới nhất, bao gồm nó trong Gemfile của tôi, chạy bó cài đặt, và có thể xác nhận rằng nó đang được sử dụng. How can _know_ which JSON renderer is active in my Rails 3 app? Tuy nhiên, hoàn toàn không có sự tăng tốc trong việc hiển thị phản hồi JSON.Không thể nhận được các cải thiện hiệu suất bằng cách sử dụng trình phân tích cú pháp JSON Oj

Trong thư viện, tôi truy vấn cơ sở dữ liệu MySQL cũ với mô-đun mysql của Ruby. Tôi chuyển đổi chuỗi thành giá trị và trả về một mảng băm. Điều này hoạt động tốt và mất khoảng 1,5 đến 2 giây. Nó nên, có một đoạn dữ liệu được lấy ra ở đây.

CONTROLLER

@data = Gina.points(params[:project], params[:test], 
    session[:username], session[:password]) 
respond_to do |format| 
    format.html { render :text => @data } 
    format.json { render :json => @data } # :text => MultiJson.engine 
end 

THƯ VIỆN

dbh = Mysql.real_connect(@@host, u, p) 
res = dbh.query("SELECT * FROM #{d}.#{t}") 
    @data = [] 
    res.each_hash do |row| 
    obj = {} 
     row.each_pair do |k, v| 
      v.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? obj[k] = v : obj[k] = v.to_f 
     end 
    @data << obj 
end 

Vấn đề của tôi là với 'render: json' phần. Đối với khoảng 1,5 MB dữ liệu, điều này có thể mất khoảng 8 hoặc 9 giây. Trên các tập dữ liệu lớn hơn (3,5 - 4 MB), nó có thể mất 25 hoặc 30. Tôi đã viết xung quanh bằng cách sử dụng JSON ở tất cả bằng cách tạo chuỗi ký tự cùng với các bộ phân tách "nhân tạo" trong thư viện, bằng cách sử dụng đồng bằng .get từ jQuery trong khung nhìn , và sau đó phân tích chuỗi thành một băm trong JS trong trình duyệt. Tôi xuống đến 1,4 giây trên các bộ nhỏ hơn, và 5 giây trên những cái lớn hơn.

Phương pháp JSON là rõ ràng và dễ hiểu và phù hợp với cách mọi thứ được thiết kế để hoạt động. Cách tiếp cận phân tích cú pháp chuỗi là một hack bẩn, và tôi không thích nó, nhưng đó là SIX TIMES nhanh hơn. Điều hấp dẫn tôi đã học được khi so sánh hai phương pháp tiếp cận là "serializing" chuỗi hacky của tôi với JSON chỉ nhanh như "dựng hình" văn bản (như không có gì để làm, thực sự). Phần chuyên sâu của quá trình này là thực sự serializing một hash, nhưng điều này là chính xác loại điều tôi mong đợi một thư viện JSON "nhanh hơn" để làm tốt hơn.

Tôi có hiểu lầm cơ bản về việc Oj nên làm gì cho tôi hay tôi chỉ làm điều gì đó sai?

Trả lời

2

Như this blog post chỉ ra, Rails buộc json phương pháp mã hóa to_json sử dụng thực hiện mã hóa riêng của mình. Điều này ảnh hưởng đến các lớp cơ sở như Array, Hash và Integer.

Điều này có nghĩa là đa_json và oj không được sử dụng theo mặc định trong quá trình mã hóa json, đó là lý do tại sao bạn cảm thấy nó chậm.

Bạn có thể sử dụng thủ công Oj để mã hóa như @yujingz đã chỉ ra.

Thay vào đó, tôi sử dụng bài đăng trên blog để tạo a patch gem để sử dụng MultiJson thay thế, sẽ tự động sử dụng Oj để mã hóa.

2

Bạn hiện không sử dụng Oj! Nó sẽ không có hiệu lực tự động cho đến khi bạn gọi nó một cách rõ ràng. Thay JSON ban đầu của bạn render với

Oj.dump(args) 
Các vấn đề liên quan