2009-10-22 26 views
9

को देखने के लिए जो डाली तेजी से (आवश्यक बेहतर नहीं है) की कोशिश: नई C++ मामले या पुराने फैशन सी शैली डाली। कोई विचार?जो डाली तेजी static_cast <int>() या पूर्णांक है()

+1

आप हमेशा एक बेंचमार्क स्क्रिप्ट लिख सकते हैं। बस 10 मिलियन static_cast और 10 मिलियन int cast डालें, और देखें कि कौन सा समय लेता है। मेरा * अनुमान * यह है कि वे एक ही असेंबली निर्देश को संकलित करेंगे। – Kip

+12

इस तथ्य को खारिज करते हुए कि वे लगभग सभी संकलकों पर निश्चित रूप से संकलित करते हैं, यह क्यों महत्वपूर्ण होगा? जब तक आप प्रदर्शन के मुद्दों को नहीं जानते हैं, तो आप स्पष्ट होने के लिए लिखते हैं और हार्ड-टू-रीड माइक्रोप्टाइमाइजेशन से बचते हैं जो शायद वैसे भी व्यर्थ हैं। Static_cast () का उपयोग करें। –

+3

सी शैली के कलाकारों को सी ++ स्टाइल कास्ट के संदर्भ में परिभाषित किया गया है (और सी स्टाइल कास्ट निजी आधार पर जा सकते हैं ...)। तो वे वास्तव में काफी समकक्ष हैं। किसी के पास किसी दूसरे पर प्रदर्शन वृद्धि नहीं है। –

उत्तर

33

int() से समतुल्यstatic_cast<int>() की कार्यक्षमता की तुलना में कोई अंतर नहीं होना चाहिए।

का उपयोग VC2008:

double d = 10.5; 
013A13EE fld   qword ptr [[email protected] (13A5840h)] 
013A13F4 fstp  qword ptr [d] 
    int x = int(d); 
013A13F7 fld   qword ptr [d] 
013A13FA call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A13FF mov   dword ptr [x],eax 
    int y = static_cast<int>(d); 
013A1402 fld   qword ptr [d] 
013A1405 call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A140A mov   dword ptr [y],eax 

जाहिर है, यह 100% ही है!

+8

+1। विधानसभा हमेशा ऐसी चीजों के लिए अच्छा है। – Joey

+0

यह मेरे लिए सेक्सी नहीं दिखता :) एक सेक्सी एक एफएसयू को शामिल किए बिना एसएसई निर्देशों का उपयोग करेगा :) (मैंने सोचा था कि एसएसई का उपयोग पहले ही वीसी में डिफ़ॉल्ट रूप से किया गया था)। – AnT

+0

@AndreyT यह करता है :) उत्तर में कोड डिबगिंग मोड में बनाया गया था। यदि आप इसे अनुकूलन के साथ संकलित करने का प्रयास करते हैं, तो यह एसएसई निर्देशों का उपयोग करता है। – AraK

2

प्रत्येक विधि का उपयोग करके असेंबली पर एक नज़र डालें। यदि यह एक प्रोफाइलर का उपयोग अलग है।

1

वे वही हैं जैसे संकलित समय के दौरान इसे हल किया गया है और कोई रनटाइम ओवरहेड नहीं है। यहां तक ​​कि यदि कुछ अंतर था तो भी मैं वास्तव में इन छोटे (सूक्ष्म नहीं) अनुकूलन के बारे में बहुत परेशान नहीं होगा।

3

कोई फर्क नहीं पड़ता।

जब एक ही कलाकार के रूप में ऐसी मूल संरचनाओं की बात आती है, तो एक बार दो संरचनाओं का अर्थ समान अर्थ होता है, तो उनका प्रदर्शन पूरी तरह से समान होगा, और इन संरचनाओं के लिए उत्पन्न मशीन कोड समान होगा।

-2

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

+0

आप क्यों मानेंगे कि int (...) अधिक परिचित होगा, यद्यपि? यह वास्तव में सी में मान्य नहीं है, शायद सी ++ के "छद्म-निर्माता" कॉल के रूप में। - इसके अलावा, कलाकारों के प्रकार के बारे में स्पष्ट नहीं होने के कारण, इसे कोड को समझने में आसान क्यों होना चाहिए? – UncleBens

+0

कास्ट खिलौने के लिए कुछ भी नहीं हैं और इसलिए स्पॉट करना आसान होना चाहिए। सी ++ - शैली कास्ट यही है। संकलन-समय जांच का उल्लेख करने के लिए – foraidt

3

मुझे विश्वास है कि वास्तविक परिणाम कार्यान्वयन परिभाषित किया गया है। आपको इसे कंपाइलर के अपने संस्करण में देखना चाहिए। लेकिन मेरा मानना ​​है कि यह सबसे आधुनिक कंपाइलरों में एक ही परिणाम देगा। और सी ++ में आपको सी-कास्ट का उपयोग नहीं करना चाहिए, इसके बजाय C++ casts का उपयोग करें - यह आपको संकलन समय पर त्रुटियों को खोजने की अनुमति देगा।

+0

+1 – foraidt

+0

प्रदर्शन समस्याएं कार्यान्वयन-परिभाषित नहीं हैं (वास्तव में मानक कंटेनर संचालन के लिए बड़े-ओ के अलावा किसी भी प्रदर्शन को अनिवार्य नहीं है) –

0
के रूप में ज्यादातर लोगों का कहना है कि एक को उम्मीद है कि ये वही गति होना चाहिए, यद्यपि आप अपने संकलक की दया पर हो ... और कहा कि हमेशा एक बहुत खुश स्थिति नहीं है

। युद्ध कहानियों के लिए पढ़ें।

अपने संकलक और प्रोसेसर कोर के विशेष मॉडल जो कार्यक्रम float f; int i(f);, float f; int i = (int)f; और float f; int i = static_cast<int>(f); और उनके जैसे लोग (, डबल लंबी और अहस्ताक्षरित प्रकार को शामिल रूपों सहित) की गति पर निष्पादित करता है पर निर्भर करता है atrociously धीमी गति से हो सकता है - के आदेश आप अपेक्षा से भी बदतर परिमाण। संकलक आंतरिक प्रोसेसर मोड को बदलने वाले निर्देशों को उत्सर्जित कर सकता है जिससे निर्देश पाइपलाइनों को फेंक दिया जा सकता है। यह वास्तव में, कंपाइलर के अनुकूलन तत्व में एक बग है। मैंने उन मामलों को देखा है जहां this analysis में उल्लिखित 40-घड़ी-चक्र लागतों को पीड़ित किया गया है, जिस बिंदु पर आप AFAIK के साथ पूरी तरह से प्रसन्न, मजबूत, सामान्य समाधान के साथ एक प्रमुख, अप्रत्याशित और परेशान प्रदर्शन बाधा डालते हैं। असेंबलर को शामिल करने वाले विकल्प हैं लेकिन AFAIK वे फ़्लोटिंग पॉइंट को गोलियों के समान तरीके से पूर्ण करने के लिए नहीं करते हैं। अगर कोई भी बेहतर जानता है तो मुझे रूचि है। मुझे उम्मीद है कि यह मुद्दा जल्द ही विरासत कंपाइलर्स/हार्डवेयर तक ही सीमित होगा लेकिन आपको अपने बारे में अपनी इच्छाओं की आवश्यकता है।

पीएस मैं उस लिंक तक नहीं पहुंच सकता क्योंकि मेरा फ़ायरवॉल इसे गेम से संबंधित के रूप में अवरुद्ध करता है लेकिन a Google cache of it यह दिखाने के लिए पर्याप्त है कि इसके लेखक इसके बारे में और अधिक जानते हैं।

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