2008-10-01 11 views
53

मैं एक आवेदन जो तैरता की बड़ी सरणियों पढ़ता है और उन लोगों के साथ कुछ सरल संचालन करता है लिख रहा हूँ। मैं फ्लोट्स का उपयोग कर रहा हूं, क्योंकि मैंने सोचा कि यह युगल से तेज होगा, लेकिन कुछ शोध करने के बाद मुझे पता चला है कि इस विषय के बारे में कुछ भ्रम है। क्या कोई इस पर विस्तार कर सकता है?सी # में तैरने से दोगुनी तेजी से हैं?

उत्तर

63

संक्षिप्त उत्तर है, "जो भी उपयोग परिशुद्धता स्वीकार्य परिणाम के लिए आवश्यक है।"

आपका एक गारंटी नहीं है कि आपरेशन चल बिन्दु डेटा अभिव्यक्ति के कम से कम उच्चतम परिशुद्धता सदस्य से किया जाता है पर प्रदर्शन किया है। तो दो नाव गुणा के नाव के कम से कम सटीक है, और एक नाव और एक डबल कम से कम डबल परिशुद्धता के साथ किया जा होगा गुणा किया जाता है। मानक कहता है कि "[फ्लोटिंग-पॉइंट] संचालन ऑपरेशन के परिणाम प्रकार की तुलना में उच्च परिशुद्धता के साथ किया जा सकता है।"

यह देखते हुए कि नेट के लिए JIT परिशुद्धता का अनुरोध में अपनी चल बिन्दु आपरेशनों छोड़ने के लिए प्रयास करता है, हम अपने संचालन को तेज करने के लिए इंटेल से प्रलेखन पर एक नज़र ले जा सकते हैं। इंटेल प्लेटफ़ॉर्म पर आपके फ़्लोटिंग पॉइंट ऑपरेशंस 80 बिट्स के मध्यवर्ती परिशुद्धता में किए जा सकते हैं, और अनुरोध किए गए परिशुद्धता में परिवर्तित हो सकते हैं।

सेल्सियस तक ++ फ्लोटिंग सूत्री संचालन इंटेल की गाइड से (खेद केवल मृत पेड़ है), वे उल्लेख:

  • एक भी सटीक प्रकार का उपयोग करें (उदाहरण के लिए, नाव) जब तक अतिरिक्त परिशुद्धता डबल या लंबी डबल के माध्यम से प्राप्त की आवश्यकता है। ग्रेटर सटीक प्रकार मेमोरी आकार और बैंडविड्थ आवश्यकताओं को बढ़ाते हैं। ...
  • बचें मिश्रित डेटा प्रकार गणित भाव

अंतिम बिंदु you can slow yourself down with unnecessary casts to/from float and double, जो JIT'd कोड जो x87 अपने 80-बिट मध्यवर्ती प्रारूप से दूर कास्ट करने के लिए अनुरोध करता है में परिणाम के रूप में महत्वपूर्ण है कि संचालन के बीच में!

1. हां, यह सी ++ कहता है, लेकिन सी # मानक सीएलआर के ज्ञान के साथ हमें पता है कि इस उदाहरण में सी ++ के लिए जानकारी लागू होनी चाहिए।

+3

एक तरफ नोट (आपके उत्तर पर कोई असर नहीं होने पर), क्या .NET JIT x87 का उपयोग करता है? इंटेल एसएसई के पक्ष में कुछ समय के लिए इसे छोड़ने के लिए कह रहा है। –

+2

@ माइक एफ: जो मैं बता सकता हूं, वह एसएसई संचालन का चयन नहीं करता है। मुझे उस पर उद्धरण न दें, यही वह है जो मैंने अपने कोड में JIT'd को देखा है। मैं एक माइक्रोसॉफ्ट से पूछ सकता हूं और पता लगा सकता हूं। – user7116

+0

@sixlettervariables: यदि आप कभी भी एक प्राप्त करते हैं और इसे यहां पोस्ट करना पसंद करते हैं तो मुझे जवाब सुनने में बहुत दिलचस्पी होगी। –

1

यह बताता है कि तैरता युगल की तुलना में थोड़ा तेजी से कर रहे हैं: http://www.herongyang.com/cs_b/performance.html

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

+2

मुझे नहीं पता कि मैं कुछ दोस्त के बेंचमार्क पर भरोसा करता हूं जहां सटीकता एक सेकंड से भी कम हो रही है। क्यों नहीं एक बड़ा (और अधिक वास्तविक दुनिया-आश बेंचमार्क और अधिक प्रकार के परीक्षणों के साथ) और इसे कई मिनट तक चलाने दें? –

+0

मैंने इस परीक्षण की कोशिश की और रिलीज बिल्ड में, वे एक ही प्रसंस्करण समय लेते हैं। –

1

तैरता एक 32-बिट सिस्टम पर तेजी से होना चाहिए, लेकिन सुनिश्चित करें कि आप सही काम अनुकूलित कर रहे बनाने के लिए कोड प्रोफ़ाइल।

+2

@ स्टीवन ए लोवे: मुझे लगता है कि कुछ 32-बिट सिस्टमों में आंतरिक रूप से 32-बिट फ़्लोटिंग पॉइंट नंबरों की कमी है! इसलिए, समग्र प्रदर्शन में कमी। आपका कथन मेमोरी-बैंडविड्थ परिप्रेक्ष्य से सही है क्योंकि एक फ्लोट एक डबल से बेहतर है। – user7116

7

यदि लोड & स्टोर ऑपरेशन बाधाएं हैं, तो फ्लोट तेज हो जाएगा, क्योंकि वे छोटे होते हैं। यदि आप लोड और स्टोर्स के बीच बड़ी संख्या में गणना कर रहे हैं, तो यह लगभग बराबर होना चाहिए।

किसी और ने फ़्लोट & डबल, और दोनों प्रकार के संचालन का उपयोग करने वाली गणनाओं के बीच रूपांतरणों से परहेज करने का उल्लेख किया है।यह अच्छी सलाह है, और यदि आप किसी भी गणित लाइब्रेरी फ़ंक्शंस का उपयोग करते हैं जो युगल लौटाता है (उदाहरण के लिए), तो सबकुछ युगल के रूप में रखना तेजी से होगा।

+2

यह सी # के मामले में है जहां सभी गणित परिचालन युगल लौटते हैं। शाब्दिक मूल्यों के लिए, आप मूल्य के लिए एफ, आदि का उपयोग कर सकते हैं। –

19

मैंने कुछ हफ्ते पहले एक समान प्रश्न का प्रोफाइल किया था। निचली पंक्ति यह है कि x86 हार्डवेयर के लिए, फ्लोट्स बनाम युगल के प्रदर्शन में कोई महत्वपूर्ण अंतर नहीं है जब तक कि आप स्मृति बाध्य न हों, या आप कैश समस्या में चलना शुरू करें। उस स्थिति में फ्लोट्स का आम तौर पर लाभ होता है क्योंकि वे छोटे होते हैं।

वर्तमान इंटेल CPUs 80 बिट चौड़े रजिस्टरों में सभी फ़्लोटिंग पॉइंट ऑपरेशंस करते हैं, इसलिए गणना की वास्तविक गति फ्लोट्स और युगल के बीच भिन्न नहीं होनी चाहिए।

4

387 एफपीयू अंकगणितीय के साथ, फ्लो कुछ लंबे समय तक चलने वाले संचालन जैसे कि पाउ, लॉग इत्यादि के लिए केवल तेज है (और केवल तभी जब संकलक एफपीयू नियंत्रण शब्द को उचित रूप से सेट करता है)।

पैक एसएसई अंकगणितीय के साथ, हालांकि यह एक बड़ा अंतर बनाता है।

7

मैं एक रे ट्रैसर लिख रहा हूं, और मेरी रंगीन कक्षा के लिए फ्लोट्स को युगल के साथ बदलकर मुझे 5% गति प्रदान करता है। युगल के साथ वेक्टर फ्लोट्स को बदलना एक और 5% तेज है! बहुत अच्छा :)

एक कोर i7 920

+1

मुझे लगता है कि आपके कुछ कोड कास्टिंग पीछे और आगे के बीच फ्लोट-> डबल-> फ्लोट, उदा। गणित कार्यों के साथ जो डबल लौटते हैं, इसलिए कास्टिंग को खत्म करना गति के लिए ज़िम्मेदार है; जरूरी नहीं है क्योंकि युगल बहुत तेज़ हैं। – HoboBen

+7

वास्तव में, मैं इसे वापस लेता हूं। मैंने बस लूप के लिए एक साधारण के साथ परीक्षण किया, और ऐसा लगता है, किसी भी कारण से, युगल * तेज * हैं! – HoboBen

+0

प्रोसेसर अप्रासंगिक है। चाहे आप इसे धीमी या तेज पीसी पर करें ... 5% सुधार 5% सुधार है :-) – z0mbi3

1

मैं हमेशा सोचा है कि प्रोसेसर अनुकूलित किया गया है या एक ही नाव या डबल की परवाह किए बिना साथ है यही कारण है कि। मेरे गहन कंप्यूटेशंस पर ऑप्टिमाइज़ेशन की तलाश (मैट्रिक्स से बहुत सारे, दो मानों की तुलना) मुझे पता चला कि फ्लोट लगभग 13% तेज है।

यह मुझे आश्चर्यचकित करता है, लेकिन मुझे लगता है कि यह मेरी समस्या की प्रकृति के कारण है। मैं संचालन के मूल में फ्लोट और डबल के बीच कास्ट नहीं करता हूं, और मेरी गणना मुख्य रूप से जोड़ रही है, गुणा और घटाना है।

यह मेरे आई 7 9 20 पर है, जो 64-बिट ऑपरेटिंग सिस्टम चला रहा है।

19

मैं सिर्फ MCTS परीक्षा 70-536 के लिए "माइक्रोसॉफ्ट .NET फ्रेमवर्क-अनुप्रयोग विकास फाउंडेशन 2" पढ़ सकते हैं और वहाँ पेज 4 पर एक नोट (अध्याय 1) है:

नोट अनुकूलन प्रदर्शन के साथ अंतर्निहित प्रकार
रनटाइम 32-बिट पूर्णांक प्रकार (Int32 और UInt32) के प्रदर्शन को अनुकूलित करता है, इसलिए काउंटर और अन्य अक्सर एक्सेस किए गए अभिन्न चर के लिए उन प्रकारों का उपयोग करें। फ़्लोटिंग-पॉइंट ऑपरेशंस के लिए, डबल सबसे कुशल प्रकार है क्योंकि उन परिचालनों को हार्डवेयर द्वारा अनुकूलित किया जाता है।

यह टोनी नॉर्थप द्वारा लिखा गया है। मुझे नहीं पता कि वह एक अधिकार है या नहीं, लेकिन मुझे उम्मीद है कि .NET परीक्षा के लिए आधिकारिक पुस्तक में कुछ वजन होना चाहिए। यह निश्चित रूप से एक गौणिया नहीं है। मैंने सोचा कि मैं इसे इस चर्चा में जोड़ दूंगा।

4

Matthijs,

आप गलत हैं। 32-बिट 16-बिट की तुलना में कहीं अधिक कुशल है - आधुनिक प्रोसेसर में ... शायद स्मृति-आधारित नहीं, लेकिन प्रभावशीलता 32-बिट जाने का तरीका है।

आपको वास्तव में अपने प्रोफेसर को कुछ और "अद्यतित" अपडेट करना चाहिए। ;)

वैसे भी, प्रश्न का उत्तर देने के लिए; फ्लोट और डबल में वास्तव में वही प्रदर्शन होता है, कम से कम मेरे इंटेल i7 870 (सिद्धांत के रूप में) पर।

(मैं एक "एल्गोरिथ्म" है कि मैं 10,000,000 बार दोहराया बनाया है, और फिर दोहराया है कि 300 बार के लिए, और कहा कि से बाहर मैं एक औसत बनाया है।)

double 
----------------------------- 
1 core = 990 ms 
4 cores = 340 ms 
6 cores = 282 ms 
8 cores = 250 ms 

float 
----------------------------- 
1 core = 992 ms 
4 cores = 340 ms 
6 cores = 282 ms 
8 cores = 250 ms 
:

यहाँ मेरी माप कर रहे हैं

+0

हम्म, मुझे लगता है कि आप सही हैं। हो सकता है कि जिस स्रोत ने मुझे विश्वास पर विश्वास किया वह गलत था। अद्यतन को हटाने के लिए मैं अपना उत्तर अपडेट करूंगा (i.a.w. मेरा उत्तर अपडेट न करें)। –

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