2008-09-26 13 views
14

मैंक्या inc (i) और i: = i + 1 डेल्फी में एक प्रदर्शन अंतर है?

i := i +1; 
उस में

का एक बहुत के साथ एक प्रक्रिया है और मुझे लगता है कि

inc(i); 

एक बहुत बेहतर लग रहा है। क्या कोई प्रदर्शन अंतर है या फ़ंक्शन कॉल केवल कंपाइलर द्वारा रेखांकित किया जाता है? मुझे पता है कि शायद यह मेरे ऐप पर कोई फर्क नहीं पड़ता, मैं सिर्फ उत्सुक हूँ।

संपादित करें: मैंने प्रदर्शन का कुछ अनुमान लगाया और अंतर को बहुत छोटा पाया, वास्तव में 5.1222741794670901427682121946224e-8 के रूप में छोटा! तो यह वास्तव में कोई फर्क नहीं पड़ता। और अनुकूलन विकल्पों ने वास्तव में परिणाम को बहुत अधिक नहीं बदला है। सभी सुझावों और सुझावों के लिए धन्यवाद!

+0

"5.1222741794670901427682121946224e-8" ?? "5.12e-8" के साथ क्या गलत है? :-) मैं किसी भी व्यावहारिक अनुप्रयोग के बारे में नहीं सोच सकता जिसके लिए 32 महत्वपूर्ण अंक की आवश्यकता होती है, न ही उनमें से आधे से भी कोई माप सही है। "एक गणितज्ञ पीआई से 1 अरब अंक चाहता है, एक इंजीनियर पाई के बराबर 3.14" – stevenvh

+0

हेहे, ठीक है, मैंने एक परीक्षण चलाया और परिणामस्वरूप मैंने बस इसे काट दिया और चिपकाया, इसलिए अंकों की बड़ी संख्या :) –

उत्तर

7

आधुनिक कंपाइलर कोड अनुकूलित करते हैं।
inc (i) और i: = i + 1; बहुत ज्यादा वही हैं।

जो भी आप चाहें उसका उपयोग करें।

संपादित करें: जैसा कि जिम मैककेथ ने सही किया: ओवरफ्लो जांच के साथ एक अंतर है। इंक एक रेंज जांच नहीं करता है।

+3

गलत! रेंज चेकिंग या ओवरफ्लो चेकिंग चालू करें और डिस्सेप्लर को देखें! –

3

डीबगिंग के दौरान आप इसे सीपीयू विंडो में सत्यापित कर सकते हैं। जेनरेट किए गए सीपीयू निर्देश दोनों मामलों के लिए समान हैं।

मैं सहमत हूं Inc(I); बेहतर दिखता है हालांकि यह व्यक्तिपरक हो सकता है।

सुधार: मैं सिर्फ इंक के लिए दस्तावेज में यह पाया: "। कुछ प्लेटफार्मों पर, इंक अनुकूलित कोड, तंग छोरों में विशेष रूप से उपयोगी उत्पन्न हो सकता है"

तो यह शायद इंक

+0

इंक छोड़ने की रेंज चेकिंग –

1

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

आम तौर पर, मैं inc (i) का उपयोग करता हूं, जहां भी यह स्पष्ट रूप से किसी प्रकार के लूप/इंडेक्स के रूप में उपयोग किया जा रहा है, और +1 जहां भी 1 कोड बनाए रखने के लिए आसान बना देगा (यानी, यह कल्पनाशील परिवर्तन हो सकता है भविष्य में एक और पूर्णांक के लिए) या एक एल्गोरिदम/spec बिंदु दृश्य से अधिक पढ़ने योग्य।

+0

inc (i, 1) inc (i, 2) में बदलने के लिए स्पष्ट और आसान है? – Argalatyr

0

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

6

यह सब "i" के प्रकार पर निर्भर करता है। डेल्फी में, एक आम तौर पर लूप-वेरिएबल्स को "आई: इंटीगर" के रूप में घोषित करता है, लेकिन यह "i: PChar" भी हो सकता है जो डेल्फी 200 9 और एफपीसी (मैं अनुमान लगा रहा हूं) के नीचे पेंसिचर को हल करता हूं, और पीडब्ल्यूडब्ल्यूएच पर डेल्फी 200 9 और डेल्फी.NET (अनुमान लगाने)।

चूंकि डेल्फी 200 पॉइंटर-गणित कर सकता है, इंक (i) टाइप किए गए पॉइंटर्स पर भी किया जा सकता है (यदि उन्हें POINTER_MATH चालू किया गया है)।

उदाहरण के लिए:

type 
    PSomeRecord = ^RSomeRecord; 
    RSomeRecord = record 
    Value1: Integer; 
    Value2: Double; 
    end; 

var 
    i: PSomeRecord; 

procedure Test; 
begin 
    Inc(i); // This line increases i with SizeOf(RSomeRecord) bytes, thanks to POINTER_MATH ! 
end; 

अन्य anwsers जैसा कि पहले ही कहा: यह देखने के लिए खोलने के क्या संकलक अपने कोड से बना अपेक्षाकृत आसान है:

दृश्य> डीबग विंडोज> सीपीयू विंडोज > Disassembly

नोट, अनुकूलन की तरह है कि संकलक विकल्प, OVERFLOW_CHECKS और RANGE_CHECKS अंतिम परिणाम को प्रभावित कर सकते हैं, तो आप shoul डी अपनी पसंद के अनुसार सेटिंग्स रखने के लिए ख्याल रखना।

इस पर एक टिप: प्रत्येक इकाई में, $ एक फ़ाइल शामिल करें जो कंपाइलर विकल्पों को चलाता है, इस तरह, जब आप अपने .bdsproj या .dproj को किसी तरह क्षतिग्रस्त करते हैं तो आप सेटिंग को नहीं हटाएंगे। (इस पर एक अच्छे उदाहरण के लिए जेसीएल के स्रोत कोड को देखें)

16

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

यदि वे विकल्प बंद हैं, तो कोई अंतर नहीं है। अंगूठे का नियम, जब आप किसी रेंज जांच विफलता की परवाह नहीं करते हैं तो इंक का उपयोग करें (क्योंकि आपको अपवाद नहीं मिलेगा!)।

+0

+1 जानना बहुत अच्छा है! – SOUser

+1

यह सच नहीं लगता है। इंक() ** यह विकल्प चालू होने पर ** अतिप्रवाह जांच करता है। डी 2007 और एक्सई 8 में परीक्षण किया गया। तो 'इंक (i) 'और' i: = i + 1' के बीच बिल्कुल कोई अंतर नहीं है। –

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