2012-05-05 10 views
5

परिचय
मेरे पास बैकबोनजेएस और एक रेल बैकएंड के साथ बनाया गया एक (अधिकतर) एकल पृष्ठ application है।सिंगल पेज एप्लिकेशन के प्रदर्शन में सुधार कैसे करें?

क्योंकि अधिकांश बातचीत वेबपैप के एक पृष्ठ पर होती है, जब उपयोगकर्ता पहले पृष्ठ पर जाता है तो मुझे मूल रूप से एक बड़ी गहरी क्वेरी में डेटाबेस से जानकारी का एक टन खींचना पड़ता है।

इससे मुझे इस पृष्ठ पर कुछ अधिक चरम भार का कारण बन रहा है।

load times

NewRelic मुझे बता दिया जाना चाहिए कि अपनी समस्याओं के सबसे वजह से 457 व्यक्ति तेजी से विधि कॉल कर रहे हैं प्रकट होता है।

fast methid calls

अब मैं सब उत्सुक लोड हो रहा है मैं क्या कर सकते हैं किया है (मैं 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 लेकिन अगर मैं पेज आबादी वाले लोड और फिर डेटा लाने शायद उपयोगकर्ता लगेगा चीजें तेजी से हो रही हैं जैसे बिना पेज की सेवा के लिए।

इंडेक्स
मुझे यह सुनिश्चित करना चाहिए कि मेरे पास मेरी सभी विदेशी कुंजी पर अनुक्रमणिका हो। मुझे उन स्थानों के बारे में सोचने की भी कोशिश करनी चाहिए जहां यह इंडेक्स (जैसे पसंदीदा?) रखने में मदद करेगी और उन्हें जोड़ें।

ले जाएँ विधि डीबी
में कॉल शायद मैं यात्रा मैं डीबी में मेरे विचार परत में क्या के परिणामों में से कुछ को कैश कर सकते हैं और उन्हें बाहर के बजाय उन्हें कंप्यूटिंग की खींच।या मैं पढ़ने के बजाए चीजों को लिखने के बजाय सिंक कर सकता हूं।

प्रश्न
किसी को भी क्या मैं पर मेरे समय खर्च किया जाना चाहिए के बारे में कोई सुझाव हैं?

उत्तर

1

वास्तविक उपयोगकर्ता इंटरफ़ेस को देखने में सक्षम होने के बिना उत्तर देने का यह एक कठिन सवाल है, लेकिन मैं प्रारंभिक इंटरफ़ेस को प्रदर्शित करने के लिए जितना आवश्यक डेटा लोड करने पर ध्यान केंद्रित करता हूं। उदाहरण के लिए, यदि उपयोगकर्ता को आपके द्वारा पेश किए जा रहे कुछ डेटा देखने के लिए नीचे ड्रिल करना है, तो आप प्रारंभिक पेलोड के हिस्से के रूप में इसे लोड करने के बजाय उस डेटा को मांग पर लोड कर सकते हैं। आप उल्लेख करते हैं कि एक खोज में 100 "अवधारणाएं" हो सकती हैं, हो सकता है कि आपको शुरुआत में उन सभी अवधारणाओं को लाने की आवश्यकता न हो?

नीचे की रेखा, ऐसा लगता है कि आपकी समस्या वास्तव में ग्राहक पक्ष पर नहीं है - ऐसा लगता है जैसे आपका सर्वर-साइड कोड चीजों को धीमा कर रहा है, इसलिए मैं पता लगाऊंगा कि आप कम डेटा लाने के लिए क्या कर सकते हैं, या जटिल प्रश्नों को तब तक स्थगित करने के लिए जब तक उन्हें निश्चित रूप से आवश्यक न हो।

1

मैं आपके जेएस कोड-बेस को उन मॉड्यूल में अलग करने की अनुशंसा करता हूं जो RequireJS जैसे किसी परिसंपत्ति लोडर का उपयोग करके गतिशील रूप से लोड किए जाते हैं। इस तरह आपके पास लोड समय पर इतने सारे एक्सएचआर फायरिंग नहीं होंगे।

जब कोई विशिष्ट मॉड्यूल की आवश्यकता होती है तो यह प्रत्येक पृष्ठ लोड के बजाय उचित समय पर लोड और प्रारंभ कर सकती है।

यदि आप अपने कोड को थोड़ा जटिल करते हैं, तो प्रत्येक मॉड्यूल प्रारंभ और बंद करने में सक्षम होना चाहिए। इसलिए, यदि आपके पास कोई होता है या जटिल कोड निष्पादित होता है तो आप मॉड्यूल को प्रदर्शन बढ़ाने और नेटवर्क लोड को कम करने के लिए रोक सकते हैं।

+0

जबकि मैं मानता हूं कि संपत्ति वितरण को अनुकूलित करना प्रदर्शन बढ़ाने में एक महत्वपूर्ण कदम है, मुझे नहीं लगता कि यह मुख्य मुद्दा है जो मैं यहां कर रहा हूं। ऐप में जेएस का जला हुआ होने पर, यह gzipped, minified और ~ 100kb पर आता है। इसे क्लाइंट साइड पर भी कैश किया जाना चाहिए ताकि लोड करने की लागत दोहराने वाले आगंतुकों के लिए कम हो। –

संबंधित मुद्दे