2012-07-12 9 views
7

पृष्ठभूमिक्या हम जिस तरीके से हमारी वेबसाइट का परिणाम प्रदर्शन के मुद्दों में अनुवाद करते हैं?

हमारी साइट एक प्रेस साइट है और दुनिया भर के कई लोगों द्वारा देखी जाती है। जाहिर है इसका मतलब है कि हम जितनी संभव हो उतनी भाषाओं में साइट को स्थानांतरित कर देंगे। प्रत्येक भाषा के लिए एक पेशेवर अनुवादक को किराए पर लिया जाएगा।

कैसे हमारी साइट वर्तमान में

काम करता है जिस तरह से हम यह करने के लिए योजना बनाई है डेटाबेस एक Guid से जुड़े हुए में पेज के प्रत्येक तत्व के लिए एक अनुवाद भंडारण के द्वारा है। तो जब पेज लोड होता है तो ग्रिड और उपयोगकर्ता की भाषा प्राथमिकताओं का उपयोग करके स्ट्रिंग को डेटाबेस से बाहर खींच लिया जाता है।

हमारे पास हमारे प्रोजेक्ट में कई दस्तावेज़ हैं जिनमें अंग्रेजी अनुवाद शामिल हैं। इस जैसे:

public class StandardButtonToken : LocalisationToken 
{ 
    protected StandardButtonToken(string defaultText, Guid key) : base(defaultText, key) 
    { 
    } 

    public static readonly LocalisationToken Update = new StandardButtonToken("Update", Guid.Parse("8a999f5b-7ca1-466d-93ca-377321e6de00")); 
    public static readonly LocalisationToken Go = new StandardButtonToken("Go", Guid.Parse("7a013ecc-0772-4f87-9f1f-da6a878a3c99")); 
    public static readonly LocalisationToken Edit = new StandardButtonToken("Edit", Guid.Parse("c31be427-5016-475d-997a-96fa5ff8b51f")); 
    public static readonly LocalisationToken New = new StandardButtonToken("New", Guid.Parse("f72d365c-b18f-4f01-a6e4-b0cd930dc730")); 
    public static readonly LocalisationToken More = new StandardButtonToken("More", Guid.Parse("bd4da7df-afd2-481e-b6b6-b4a989324758")); 
    public static readonly LocalisationToken Delete = new StandardButtonToken("Delete", Guid.Parse("ab00ec14-4414-4cda-a8e2-4f03c9e7c5a8")); 
    public static readonly LocalisationToken Add = new StandardButtonToken("Add", Guid.Parse("01e44600-a556-4a07-8a2a-e69a1ea79629")); 
    public static readonly LocalisationToken Confirm = new StandardButtonToken("Confirm", Guid.Parse("4c50e91e-3e2f-42fa-97aa-9f1f6f077f09")); 
    public static readonly LocalisationToken Send = new StandardButtonToken("Send", Guid.Parse("24121766-f424-4d73-ac58-76f90d58b95c")); 
    public static readonly LocalisationToken Continue = new StandardButtonToken("Continue", Guid.Parse("dd2ca0e5-8a35-4128-b2e8-db68a64a6fe5")); 
    public static readonly LocalisationToken OK = new StandardButtonToken("OK", Guid.Parse("9a359f93-7c23-44ad-b863-e53c5eadce90")); 
    public static readonly LocalisationToken Accept = new StandardButtonToken("Accept", Guid.Parse("3206a76b-1cd7-4dc3-9fff-61dfb0992c75")); 
    public static readonly LocalisationToken Reject = new StandardButtonToken("Reject", Guid.Parse("f99c6a9c-6a55-4f55-ac4b-9581e56d18d3")); 
    public static readonly LocalisationToken RequestMoreInfo = new StandardButtonToken("Request more info", Guid.Parse("19f3d76b-dafa-47ae-8416-b7d61546b03d")); 
    public static readonly LocalisationToken Cancel = new StandardButtonToken("Cancel", Guid.Parse("75617287-5418-466b-9373-cc36f8298859")); 
    public static readonly LocalisationToken Publish = new StandardButtonToken("Publish", Guid.Parse("efd87fd4-e7f1-4071-9d26-a622320c366b")); 
    public static readonly LocalisationToken Remove = new StandardButtonToken("Remove", Guid.Parse("f7db5d81-5af8-42bf-990f-778df609948e")); 
} 

हर हम एक पृष्ठ बनाने के हम यह सुनिश्चित करना बटन मैन्युअल पाठ लिखने के बजाय इन टोकन का उपयोग करें। इसलिए यदि हम तय करते हैं कि हमें एक नया बटन चाहिए तो हम नीचे दी गई फ़ाइल में एक नया टोकन जोड़ देंगे और जब साइट पहली बार चलती है तो यह जांच करेगी कि यह डेटाबेस में मौजूद है या नहीं और यदि नहीं बनाया जाएगा।

तो जब अनुवाद की बात आती है तो हम इन टोकन को अनुवादकों को भेज देंगे और वे केवल पाठ को बदल देंगे। इसके बाद इसे प्रासंगिक भाषा में साइट में जोड़ा जाएगा और पृष्ठ चयनित भाषा पर निर्भर अनुवाद को सही कॉल करेगा।

समस्या/प्रश्न

हमारे अनुवाद टोकन स्ट्रिंग के रूप में सामान्य टेक्स्ट है, लेकिन मैं चिंतित सर्वर शुरू अप पर स्मृति में इन पाठ स्ट्रिंग्स के सभी लोड करने के लिए है कि कर रहा हूँ। वे वास्तव में कभी भी डीबी में अनुवाद को संग्रहीत करने के लिए उपयोग किए जाते हैं और कभी भी कोड में अन्यथा उपयोग नहीं किए जाते हैं, इसलिए मेरा मानना ​​है कि यह थोड़ा अपर्याप्त हो सकता है। इसके बजाए मेरा मानना ​​है कि जब आवश्यक हो तो हम इन अनुवादों को अलग-अलग कॉल कर सकते हैं, शायद किसी प्रकार की लुक-अप तालिका से जो स्मृति में नहीं है।

तो सवाल यह है। क्या हम वर्तमान में प्रदर्शन के मुद्दों का कारण बन रहे हैं?

यदि कोई भी बेहतर समाधान सुझा सकता है?

कुल मिलाकर हमारे साइट में इनमें से 1000 टोकन हैं।

Google इस अवसर पर मेरे लिए बहुत उपयोगी नहीं रहा है इसलिए किसी भी सलाह की सराहना की जाएगी। मैंने कड़ी मेहनत की है क्योंकि मैं इसे शब्द देने के लिए कर सकता हूं ताकि यह समझ में आता है। यह समझाने के लिए एक आसान नहीं है।

किसी भी मदद के लिए लोगों को अग्रिम धन्यवाद।

+2

आप ** संसाधन ** फ़ाइलों का उपयोग क्यों नहीं करते हैं ... यह देखें (http://msdn.microsoft.com/en-us/magazine/cc163566.aspx) – Yasser

+0

दुर्भाग्य से संसाधन फ़ाइलें एक विकल्प नहीं हैं हमें फ्लाई पर सामान बदलने में सक्षम होना चाहिए और उसे फिर से कंपाइल करना नहीं है। –

+0

जैसा कि मैं समझता हूं कि मैंने पढ़ा है ... आपको बटन के लिए स्थानीयकरण की आवश्यकता है? – Yasser

उत्तर

3

मैं वर्तमान में एक ऐसी परियोजना पर एक टीम के साथ काम कर रहा हूं जिसमें हमारी एक समान स्थिति थी। हमारी परियोजना एक ग्राहक/सर्वर आधारित आवेदन है। हमारे अनुवादों वाला डेटाबेस सर्वर पर रहता है और हमारे सभी नियंत्रणों में डिफ़ॉल्ट अंग्रेजी मान होते हैं। मूल रूप से जब कोई नई विंडो खोला गया तो हमने डेटाबेस पढ़ा और किसी भी आवश्यक अनुवाद को नीचे खींच लिया और नियंत्रणों का अनुवाद किया। इस तरह केवल उन्हीं मानों की हमें आवश्यकता होती है जहां स्मृति में और केवल तब तक जब तक खिड़की की आवश्यकता होती थी। जब खिड़की बंद हो गई तो स्मृति को कचरा संग्रह का उपयोग करके पुनः दावा किया जाएगा।

हमने जो भी खोजा है, वह भी हर बटन, लेबल, कॉलम हेडर इत्यादि के लिए सभी अनुवादों के साथ था ... क्योंकि पूरे सिस्टम को स्मृति में लोड किया गया था, जहां हम केवल दो सौ के साथ काम करते थे। अंत में हमने क्या किया था:

  1. उपयोगकर्ता के लॉग पर:
    • वे अंग्रेजी के अलावा एक डेटा तालिका स्मृति में स्थापित किया और सर्वर से अपनी प्रणाली में सभी उपयोगकर्ता नियंत्रण से अनुवाद के साथ से भर जाता है किसी अन्य भाषा के लिए डिफ़ॉल्ट है।
    • इस डेटा तालिका को इसके खिलाफ प्रश्नों को बेहतर बनाने में मदद करने के लिए प्राथमिक कुंजी दी गई है। जब तक ऐप खुला होता है तब तक यह डेटा तालिका मौजूद होती है।
    • किसी भी समय उपयोगकर्ता नियंत्रण को तत्काल एक विधि चलाता है जो अनुवाद को देखता है और इसे लागू करता है।

समय उस में उपयोगकर्ता वृद्धि की थी, लेकिन केवल औसतन कुछ मिलीसेकेंड से प्रवेश करने के लिए ले लिया।

यह सब कहकर मुझे आश्चर्य हुआ कि क्या आप एक समान डिजाइन का उपयोग कर सकते हैं। यह विचार सर्वर को प्रति सत्र अनुवाद ट्रैक करने से रोक देगा। यह सिर्फ पृष्ठ को उपयोगकर्ता को खिलाएगा।

  1. उपयोगकर्ता लॉग में:
    • एक datatable वस्तु सभी साइट के लिए अनुवाद के साथ से भर जाता है
    • WriteXml() कहा जाता है
    • जिसके परिणामस्वरूप एक्सएमएल ग्राहक
  2. को भेजा जाता है
  3. जब उपयोगकर्ता किसी नए पृष्ठ पर जाता है:
    • क्लाइंट साइड स्क्रिप्ट को एक्सएमएल का उपयोग किया जाता है क्लाइंट मशीन पर पेज का अनुवाद करने के लिए।

तुम इतनी है कि XML केवल बदल दिया जाता है जब आपकी साइट अद्यतन किया जाता है या यदि आप बस प्रत्येक उपयोगकर्ता एक्सएमएल पर लॉग में हर बार डाउनलोड किया जा सकता था कुछ कैशिंग जोड़ सकते हैं। किसी भी तरह से यह सर्वर से लोड लेता है।

+0

एक दिलचस्प विकल्प, मुझे इस बारे में एक विचार होगा, धन्यवाद क्रिस! –

+0

हालांकि मैंने यह निर्णय लिया है कि इस उत्तर का उपयोग करना है या नहीं, यह दोनों में से सर्वश्रेष्ठ है और इसलिए आपको बक्षीस मिल सकता है। –

3

अन्य कार्यान्वयनों को अनदेखा करना और आपके द्वारा उपयोग किए जा रहे सेटअप पर ध्यान केंद्रित करना, उत्तर "हां" और "नहीं" है।

हां, आने वाले अनुरोधों की संख्या बढ़ने पर और विशेष रूप से टोकन की संख्या बढ़ने पर विधि के साथ प्रदर्शन समस्याएं हो सकती हैं। इस संबंध को आसानी से समझाया जा सकता है "जितने अधिक अनुरोध आते हैं, सर्वर को जितना अधिक काम करना पड़ता है। अधिक टोकन मौजूद हैं, सर्वर को जितना अधिक काम करना है। यदि दोनों अनुरोध और टोकन बढ़ते हैं, तो आप विस्फोट कर रहे हैं सर्वर को काम करने की मात्रा की मात्रा है।"

आपके वर्तमान समाधान में जोड़कर" नहीं "पूरा किया जा सकता है। आप अपने सेटअप में एक कैश जोड़ सकते हैं जो अनुवादित पृष्ठों को सहेज लेगा ताकि सर्वर को डेटाबेस से पूछताछ करने या प्रति पृष्ठ प्रत्येक पृष्ठ का अनुवाद करने की आवश्यकता न हो। अनुरोध। उदाहरण के लिए, यदि आपके पास एक पृष्ठ mypage.aspx है जिसमें 20 अनुवाद करने योग्य टोकन हैं - सर्वर को पहली बार अनुवाद करने दें और फिर अनुवादित फ़ाइल को कहें, /localized/mypage.EN.html और सभी भावी अनुरोधों (यदि मूल पृष्ठ संशोधित नहीं किया गया है) या नए टोकन जोड़े नहीं गए हैं) प्रत्येक बार फिर से अनुवाद करने के बजाय कैश किए गए पृष्ठ को भेजा जाएगा।

इसके अतिरिक्त, जब आप पृष्ठ अपडेट होते हैं या टोकन अपडेट होने के बजाय अद्यतन होते हैं तो सर्वर सभी अनुवाद उत्पन्न कर सकता है के लिए क्लाइंट-अनुरोध आने के लिए।

+0

यह पहले से ही कैश करता है इसलिए यह समाधान ठीक है –

+0

यदि यह कैश करता है, तो कोई उत्कृष्ट प्रदर्शन समस्या नहीं होनी चाहिए - यह एक बार-अनुवाद होगा (प्रत्येक समय, इसे निश्चित रूप से अद्यतन करने की आवश्यकता है)। इसके अतिरिक्त, यदि कोई ध्यान देने योग्य अंतराल एक पृष्ठ लोड हो रहा है जिसे पहले ही कैश किया जाना चाहिए, तो समस्या अनुरोध-प्रसंस्करण विधियों के साथ होगी, न कि स्थानीयकरण कोड। – newfurniturey

+0

डॉटट्रेस, बस ट्रेस या इसी तरह का प्रयास करें मेमोरी प्रोफाइल टूल। यह आपको जवाब बताएगा और उन तरीकों को भी इंगित करेगा जो "हॉट" हैं (यानी, आपको प्रदर्शन बढ़ाने के लिए काम करने की आवश्यकता है)। – turtlepick

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