2015-09-16 4 views
5

कम विलंबता HFT एप्लिकेशन में मेरे पास शेयर बाजार डेटा युक्त Byte[] संदेश प्राप्त करने वाले सॉकेट हैं।.NET में डबल रूपांतरण (बाइट [] को स्ट्रिंग करने के लिए) से बचने का तरीका?

विक्रेता प्रोटोकॉल स्टॉक मूल्य फ़ील्ड में Byte[]ASCII वर्ण अनुक्रम युक्त हैं।
आईई। बाइट अनुक्रम [51-51-46-56] एएससीआई वर्णों से मेल खाता है [3-3 -.- 8], 33.8 संख्या के बराबर है।

असल में संदेश पार्सिंग के दौरान मैं Byte[] स्ट्रिंग करने के लिए कनवर्ट करता हूं और फिर सिंगल/फ्लोट पर स्ट्रिंग करता हूं।

क्या ऐसे डबल रूपांतरण से बचने और सीधे Byte[] को एकल/फ्लोट में परिवर्तित करने का कोई तरीका है?
दूसरी बात यह है कि स्ट्रिंग प्रकार के उपयोग से बचने का कोई तरीका है जो नेट में अक्षम है (अपरिवर्तनीय-कचरा संग्रहण प्रवण)?

अग्रिम धन्यवाद।

सादर

+0

पहला, यह कौन सा प्रोटोकॉल है? उपलब्ध पुस्तकालयों में से एक का उपयोग क्यों नहीं करें उदाहरण के लिए FIX? दूसरा, क्या आप नमूना मूल्यों के बारे में निश्चित हैं? 3 के लिए ASCII कोड 51 है, 53 नहीं। # 46 डॉट है। FIX जैसे प्रोटोकॉल ASCII वर्ण भेजते हैं, आपकी सरणी * पहले से ही एक स्ट्रिंग हो सकती है। आप बीसीडी नंबर प्राप्त करने के लिए कुछ ट्रांसफॉर्म का उपयोग कर सकते हैं, उदाहरण के लिए वास्तविक अंक प्राप्त करने के लिए 48 घटाएं, फिर पूर्णांक प्राप्त करने के लिए कुछ बिट स्थानांतरण का उपयोग करें, स्केल सूचक के रूप में 46 की स्थिति का उपयोग करें। अंत में, * कभी भी * वित्तीय लेनदेन के लिए फ्लोट या डबल का उपयोग न करें - वे स्केलिंग त्रुटियों के अधीन हैं। जहां भी संभव हो वहां 'दशमलव' का प्रयोग करें –

+0

क्या आप वाकई यह रूपांतरण एक सार्थक समय लेते हैं? मुझे लगता है कि सॉकेट पढ़ने 100x महंगा है। – usr

+0

एचएफटी में @usr फाइबर मामलों की लंबाई भी। उस ने कहा, समग्र पार्सिंग प्रदर्शन अलग-अलग टोकन –

उत्तर

6
byte[] arr = new byte[] { 51, 51, 46, 56}; 
double res = 0, floatindex = 0.1; 
bool isFraction = false; 
for (int i = 0; i < arr.Length; i++) 
{ 
    if (arr[i] == 46) 
    { 
     isFraction = true; 
     continue; 
    } 

    if (!isFraction) 
     res = 10*res + arr[i] - 48; 
    else 
    { 
     res += (arr[i] - 48)*floatindex; 
     floatindex /= 10.0; 
    } 
} 
return res; 

एक संस्कृति के दृष्टिकोण से, यह मान लिया गया है तो आप हमेशा एक 'बिंदु' (उदाहरण के लिए फ्रांसीसी संस्कृति में और की तरह नहीं एक कोमा) दशमलव जुदाई चिह्नित करने के लिए है

+0

मुझे 'isLessThanZero' परिवर्तनीय नाम नहीं मिलता है, यह' isLessThanOne' नहीं होना चाहिए, या अधिक सटीक रूप से, 'israraction'' होना चाहिए? – MarioDS

+0

धन्यवाद PierrOz! आपका समाधान सरल और सुरुचिपूर्ण है। मैं डबल रूपांतरण समाधान के खिलाफ गति के लिए इसका परीक्षण करूंगा और मैं परिणाम पोस्ट करूंगा। – Platypus

+0

@MDeSchaepmeester आप बिल्कुल सही हैं।मैंने जवाब दिया है – PierrOz

1

यह संभव है । मान लीजिए कि प्रारूप हमेशा उस तरह है (अंक, अल्पविराम और दशमलव अंक):

फ्लोट वी = 0.1 एफ * (100.0 एफ * (बफ [0] - 48) + 10 * (buf [1] - 48) + (बफ [3] - 48));

या: फ्लोट वी = 0.1 एफ * (100.0 एफ * बफ [0] + 10 * बफ [1] + बफ [3] - 4800 - 480 - 48);

+0

धन्यवाद। लेकिन अंकों और दशमलव अंक निश्चित संख्या नहीं हैं। – Platypus

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