jbuilder建立一個包含您的數據的大散列,然後使用ActiveSupport::JSON
將它變成json。有更快的JSON體如下面的微基準測試顯示(確保你安裝了multijson和yajl-紅寶石寶石)
require 'benchmark'
require 'active_support'
require 'multi_json'
sample = {menu: {
header: "SVG Viewer",
items: [
{id: "Open"},
{id: "OpenNew", label: "Open New"},
nil,
{id: "ZoomIn", label: "Zoom In"},
{id: "ZoomOut", label: "Zoom Out"},
{id: "OriginalView", label: "Original View"},
nil,
{id: "Quality"},
{id: "Pause"},
{id: "Mute"},
nil,
{id: "Find", label: "Find..."},
{id: "FindAgain", label: "Find Again"},
{id: "Copy"},
{id: "CopyAgain", label: "Copy Again"},
{id: "CopySVG", label: "Copy SVG"},
{id: "ViewSVG", label: "View SVG"},
{id: "ViewSource", label: "View Source"},
{id: "SaveAs", label: "Save As"},
nil,
{id: "Help"},
{id: "About", label: "About Adobe CVG Viewer..."}
]
}}
MultiJson.engine = :yajl
Benchmark.bmbm(5) do |x|
x.report 'activesupport' do
1000.times {ActiveSupport::JSON.encode(sample)}
end
x.report 'yajl' do
1000.times {MultiJson.encode(sample)}
end
end
在我的機器,這產生
user system total real
activesupport 1.050000 0.010000 1.060000 ( 1.068426)
yajl 0.020000 0.000000 0.020000 ( 0.021169)
即編碼樣本對象1000次主動支持發了1秒多,MultiJson(使用yajl引擎)耗時21ms。
JBuilder被硬編碼爲使用ActiveSupport :: JSON,但是MultiJSON(允許您在json庫之間切換的gem)很簡單,並且已經是ActiveSupport的依賴關係 - 請參閱我的fork of jbuilder。我已經打開了拉取請求,但在此之前您可以嘗試使用此叉(或創建您自己的 - 這是一個換行)
切換到MultiJson似乎削減了約400ms左右60ms,我們花了一個典型的請求進行渲染。不是我所希望的巨大變化,而是一個改變,一點也不差。謝謝。 – MrTheWalrus
是的。這個。是。大。 – maletor
@Frederick:我看到鏈接中的一行改變: - https://github.com/fcheung/jbuilder/commit/a58b355f68bc39b1fddf8b178f3844c5d4f65501與rails master合併,所以我猜測我們不需要做任何改變。你能否確認我的推論是否正確。 – boddhisattva