परिचय
मेरे पास बैकबोनजेएस और एक रेल बैकएंड के साथ बनाया गया एक (अधिकतर) एकल पृष्ठ application है।सिंगल पेज एप्लिकेशन के प्रदर्शन में सुधार कैसे करें?
क्योंकि अधिकांश बातचीत वेबपैप के एक पृष्ठ पर होती है, जब उपयोगकर्ता पहले पृष्ठ पर जाता है तो मुझे मूल रूप से एक बड़ी गहरी क्वेरी में डेटाबेस से जानकारी का एक टन खींचना पड़ता है।
इससे मुझे इस पृष्ठ पर कुछ अधिक चरम भार का कारण बन रहा है।
NewRelic मुझे बता दिया जाना चाहिए कि अपनी समस्याओं के सबसे वजह से 457 व्यक्ति तेजी से विधि कॉल कर रहे हैं प्रकट होता है।
अब मैं सब उत्सुक लोड हो रहा है मैं क्या कर सकते हैं किया है (मैं Bullet gem के साथ की जाँच) और मैं अभी भी एक समस्या है।
ये विधि कॉल मेरे Rabl धारावाहिक में अधिकतर संभावना है जो मैं बैकबोन प्रारंभ करने के लिए पृष्ठ में एम्बेड करने के लिए JSON का एक समूह क्रमबद्ध करने के लिए उपयोग करता हूं। आपको यह सब समझने की आवश्यकता नहीं है लेकिन कहने के लिए पर्याप्त है कि यह 457 विधि कॉल तक जोड़ सकता है।
object @search
attributes :id, :name, :subscription_limit
# NOTE: Include a list of the members of this search.
child :searchers => :searchers do
attributes :id, :name, :gravatar_icon
end
# Each search has many concepts (there could be over 100 of them).
child :concepts do |search|
attributes :id, :title, :search_id, :created_at
# The person who suggested each concept.
child :suggester => :suggester do
attributes :id, :name, :gravatar_icon
end
# Each concept has many suggestions (approx. 4 each).
node :suggestions do |concept|
# Here I'm scoping suggestions to only ones which meet certain conditions.
partial "suggestions/show", object: concept.active_suggestions
end
# Add a boolean flag to tell if the concept is a favourite or not.
node :favourite_id do |concept|
# Another method call which occurs for each concept.
concept.favourite_id_for(current_user)
end
end
# Each search has subscriptions to certain services (approx. 4).
child :service_subscriptions do
# This contains a few attributes and 2 fairly innocuous method calls.
extends "service_subscriptions/show"
end
तो ऐसा लगता है कि मैं इस बारे में कुछ करने की जरूरत है, लेकिन मुझे यकीन है कि क्या तरीका अपनाने नहीं हूँ। यहां संभावित विचारों मेरे पास है की एक सूची है:
प्रदर्शन सुधार विचारों
बेवकूफ नीचे इंटरफ़ेस
शायद मैं तरीके उपयोगकर्ता जो वास्तविक आवश्यकता नहीं है के लिए जानकारी पेश करने के लिए साथ आने कर सकते हैं डेटा मौजूद होना चाहिए। मुझे नहीं लगता कि मुझे ऐसा करने की पूरी आवश्यकता क्यों है, हालांकि Trello जैसे अन्य सिंगल-पेज ऐप्स अविश्वसनीय रूप से जटिल इंटरफेस हैं।
अवधारणा अंकन
यदि मैं अवधारणाओं को कम करता हूं तो यह प्रत्येक बार डेटाबेस से निकाले गए डेटा की मात्रा को कम कर देगा। हालांकि उत्पाद एक निम्न उपयोगकर्ता इंटरफ़ेस होगा।
कैशिंग
फिलहाल, पृष्ठ को रीफ्रेश करने से बस पूरी खोज डीबी से बाहर निकल जाती है। शायद मैं डीबी हिट को कम करने के लिए ऐप के कुछ हिस्सों को कैश कर सकता हूं। यह गन्दा लगता है यद्यपि मैं जिस डेटा से निपट रहा हूं, वह स्थिर नहीं है।
से अधिक अनुरोध
यह तकनीकी रूप से खराब है पृष्ठ में JSON embedding लेकिन अगर मैं पेज आबादी वाले लोड और फिर डेटा लाने शायद उपयोगकर्ता लगेगा चीजें तेजी से हो रही हैं जैसे बिना पेज की सेवा के लिए।
इंडेक्स
मुझे यह सुनिश्चित करना चाहिए कि मेरे पास मेरी सभी विदेशी कुंजी पर अनुक्रमणिका हो। मुझे उन स्थानों के बारे में सोचने की भी कोशिश करनी चाहिए जहां यह इंडेक्स (जैसे पसंदीदा?) रखने में मदद करेगी और उन्हें जोड़ें।
ले जाएँ विधि डीबी
में कॉल शायद मैं यात्रा मैं डीबी में मेरे विचार परत में क्या के परिणामों में से कुछ को कैश कर सकते हैं और उन्हें बाहर के बजाय उन्हें कंप्यूटिंग की खींच।या मैं पढ़ने के बजाए चीजों को लिखने के बजाय सिंक कर सकता हूं।
प्रश्न
किसी को भी क्या मैं पर मेरे समय खर्च किया जाना चाहिए के बारे में कोई सुझाव हैं?
जबकि मैं मानता हूं कि संपत्ति वितरण को अनुकूलित करना प्रदर्शन बढ़ाने में एक महत्वपूर्ण कदम है, मुझे नहीं लगता कि यह मुख्य मुद्दा है जो मैं यहां कर रहा हूं। ऐप में जेएस का जला हुआ होने पर, यह gzipped, minified और ~ 100kb पर आता है। इसे क्लाइंट साइड पर भी कैश किया जाना चाहिए ताकि लोड करने की लागत दोहराने वाले आगंतुकों के लिए कम हो। –