2010-01-21 16 views
7

मैंने एक डब्ल्यूसीएफ सेवा लिखी है जो NetTcpBinding में स्ट्रीम किए गए ट्रांसफरमोड का उपयोग करके फ़ाइलों के किसी भी आकार को बदलना चाहिए, और System.IO.Stream ऑब्जेक्ट।डब्ल्यूसीएफ नेट टीसीपी बाइंडिंग बुफर्ड बनाम स्ट्रीमिंग प्रदर्शन समस्याएं

प्रदर्शन परीक्षण चलाते समय, मुझे महत्वपूर्ण प्रदर्शन समस्या मिली। फिर मैंने इसे बुफर्ड ट्रांसफरमोड के साथ परीक्षण करने का फैसला किया और देखा कि प्रदर्शन दो गुना तेज है!

क्योंकि मेरी सेवा बड़ी फ़ाइलों को स्थानांतरित करनी चाहिए, इसलिए मैं सर्वर और क्लाइंट साइड पर बड़ी फ़ाइलों पर स्मृति प्रबंधन ओवरहेड की वजह से बस बुफर्ड ट्रांसफरमोड में नहीं रह सकता।

स्ट्रीम किए गए ट्रांसफरमोड को बुफर्ड ट्रांसफरमोड से धीमा क्यों किया जाता है? स्ट्रेम्ड प्रदर्शन को बेहतर बनाने के लिए मैं क्या कर सकता हूं?

+0

वास्तव में आप क्या माप था पढ़ा था? संदेश का परिवहन? ग्राहक से जवाब के साथ क्लाइंट से सर्वर तक एक राउंड ट्रिप? – GaussZ

+0

मैं सर्वर पर कॉल को मापता हूं और स्ट्रीम को वापस करने के लिए प्रतीक्षा करता हूं, फिर ब्लॉक का उपयोग करने में 64k बफर के साथ पूरी स्ट्रीम पढ़ता हूं। – DxCK

+0

@DxCK: अब आपकी राय क्या है? किसका इस्तेमाल किया जाना चाहिए? मेरे पास स्थानांतरित होने के लिए डेटा के बड़े और छोटे आकार दोनों हैं। – Sreekumar

उत्तर

6

आपके द्वारा स्ट्रीम किए जा रहे भाग कितने बड़े हैं? आप विभिन्न खंड आकारों और विभिन्न रणनीतियों के साथ प्रयोग कर सकते हैं।
साथ ही, बफर को स्थानांतरित करने के लिए, या स्थानांतरण के बाद Asynch IO का उपयोग करने पर विचार करें।

मैं क्या मतलब, अगर आपके स्ट्रीमिंग एल्गोरिथ्म धारावाहिक है, इसलिए जैसे:

1. Fill a chunk 
2. send the chunk 
3. get confirmation 
4. more chunks? Go to step 1 

... तो आप अनावश्यक देरी का एक बहुत कुछ है। यदि आप भाग भर सकते हैं और समानांतर में भाग भेज सकते हैं, तो आप प्रतीक्षा को कम करने में सक्षम होंगे। Async IO ऐसा करने का एक तरीका है। आपके पास दो समांतर वर्कस्ट्रीम हो रहे होंगे। वैचारिक रूप से, यह इस प्रकार दिखाई देंगे:

Filling Chunks        Sending Chunks 
    1. call BeginRead       1. get next chunk 
    2. wait for callback      2. send it 
    3. more to read? yes -> go to step 1  3. await confirmation 
    4. done          4. more? go to step 1 

लेकिन Async आईओ का उपयोग कर, ये वास्तव में एक ही धागे से प्रेरित किया जा सकता है।

ध्यान में रखें:

alt text http://i45.tinypic.com/t82r92.jpg

आप MS's article on the topic of large data streaming in WCF?

+0

मेरे परीक्षण में डब्ल्यूसीएफ की तुलना में अन्य आईओ नहीं है। स्थानांतरित स्ट्रीम में यादृच्छिक बाइट्स शामिल हैं जो Random.NextBytes() विधि के साथ बनाए गए हैं। वैसे भी, वही कोड कॉन्फ़िगरेशन परिवर्तन के साथ बस "Buffered" के साथ तेजी से काम करता है। – DxCK

+0

"IO" को मेरी टिप्पणियों में "Random.NextBytes()" के साथ बदलें और सिद्धांत अभी भी मान्य है। आपके मामले में, क्या आप एक समय में एक छोटे से हिस्से पर एक Random.NextBytes() करते हैं? यदि ऐसा है, तो संचालन के क्रमिकरण को खत्म करने के लिए एसिंक्रोन का उपयोग करने पर विचार करें। – Cheeso

+0

मैंने विभिन्न आकारों पर Random.NextBytes() का प्रदर्शन किया: 64k, 350k, 512k, 1MB, 2MB, 5MB, 10MB, फिर मेमोरीस्ट्रीम बनाया और स्ट्रीम को डब्ल्यूसीएफ को दिया। डब्ल्यूसीएफ बाकी सब कुछ करता है (पढ़ता है आदि) दूसरी तरफ (सर्वर या क्लाइंट) स्ट्रीम पढ़ रहा है, वहां मैंने विभिन्न बफर आकारों के बीच कोई प्रदर्शन अंतर नहीं देखा। परिणाम उन सभी विभिन्न आकारों के समान हैं: बुफर्ड स्ट्रीम की तुलना में 2 गुना तेज है। – DxCK

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