मैंने हाल ही में डिफ़ॉल्ट I18n बैकएंड से अपने I18n के लिए रेडिस बैकएंड में स्विच किया है। मैंने ऐसा किया है ताकि अनुवादों को संभालने में हमारे लिए आसान हो, लेकिन मुझे पता चला है कि प्रत्येक पृष्ठ पर काफी प्रदर्शन हुआ था।रेल उत्पादन I18n के लिए रेडिस बहुत धीमी है?
मैंने अपने एमबीपी पर प्रदर्शित करने के लिए रेल 3.2 और रेडिस 2.6.4 के साथ कुछ बेंचमार्क चलाए हैं। मैं अपने क्लाइंट के रूप में hiredis-rb का उपयोग कर रहा हूं।
दो अलग-अलग बैकएंड का उपयोग करते समय यह एक बहुत स्पष्ट अंतर है। सरल बैकएंड के साथ वहाँ पहली कॉल पर एक संक्षिप्त देरी है - मुझे लगता है अनुवाद मेमोरी में लोड किया जा रहा है - उसके बाद और फिर शानदार प्रदर्शन:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.143246
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.00415
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004153
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004056
Redis बैकएंड लगातार धीमी है:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122448
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.263564
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.232637
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122304
यह मुझे पूर्ण समझ में आता है कि यह I18n के लिए धीमा क्यों है ... मैं अपने कोड बेस में दर्जनों I18n कॉलों को कतारबद्ध कर रहा हूं। अगर मैं बैच सकता है उन्हें एक साथ सामने मैं अच्छी हालत में हो जाएगा:
pry(main)> keys = $redis.keys[0..500]
pry(main)> Benchmark.realtime { $redis.mget keys }
=> 0.04264
लेकिन मैं वास्तव में मौजूदा I18n बैकेंड से किसी के साथ ऐसा करने के लिए एक साफ रास्ता नहीं दिख रहा। क्या किसी ने इस समस्या का सामना किया है?
संपादित
मैं क्रिस Heald के सुझाव लिया और Memoization के साथ एक बैकेंड एक सरल कैश बस्ट बनाया। सार यहाँ है:
https://gist.github.com/wheeyls/5650947
मैं कुछ दिनों के लिए इस बाहर की कोशिश और फिर इसे एक मणि में बदल जाएगा।
अद्यतन
मेरे समाधान अब एक रत्न के रूप में उपलब्ध है:
https://github.com/wheeyls/cached_key_value_store
और मैं भी इस समस्या के बारे में ब्लॉग:
http://about.g2crowd.com/faster-i18nredis-on-rails/
इन बेंचमार्क को चलाने वाले बॉक्स के संबंध में आपका रेडिस सर्वर कहां है? – deefour
ये दौड़ मेरी स्थानीय मशीन पर हैं। मैं स्पष्ट करने के लिए अपना प्रश्न संपादित करूंगा। – Wheeyls