पुरानी शैली की FORTRAN के लिए आवश्यक है कि एक प्रोग्रामर जो एक अरै का एक फंक्शन का हिस्सा बनाना चाहता था, जो पूरे अरै को रेफर करने के लिए आवश्यक हो, साथ ही एक या एक से अधिक पूर्णांक मानों के साथ शुरुआती सबस्क्रिप्ट और या तो सब्स्क्रिप्शन या आइटमों की संख्या को निर्दिष्ट करता है। । सी तत्वों की संख्या के साथ ब्याज के हिस्से की शुरुआत के लिए एक पॉइंटर को पारित करने के लिए इसे सरल बनाना संभव बनाता है । सीधे शब्दों में, यह चीजों को तेज करेगा (तीन के बजाय दो चीजों को पारित करना)। परोक्ष रूप से, हालांकि, यह एक कंपाइलर प्रदर्शन कर सकते हैं अनुकूलन के प्रकार को सीमित करके चीजों को धीमा कर सकता है।
फ़ंक्शन पर विचार करें:
void diff(float dest[], float src1[], float src2[], int n)
{
for (int i=0; i<n; i++)
dest[i] = src1[i] - src2[i];
}
यदि एक संकलक जानता था कि प्रत्येक बिंदु एक सरणी की शुरुआत की पहचान करेगा, तो यह कोड उत्पन्न कर सकता है जो समानांतर में सरणी के तत्वों पर या किसी भी क्रम में कार्य करेगा, क्योंकि किसी भी x =! y के लिए, गंतव्य पर संचालन [x! ] src1 [y] और न ही src2 [y] को प्रभावित नहीं करेगा। उदाहरण के लिए, कुछ प्रणालियों पर एक कंपाइलर कोड के बराबर उत्पन्न करने से लाभान्वित हो सकता है:
void dif(float dest[], float src1[], float src2[], int n)
{
int i=0;
float t1a,t1b,t2a,t2b,tsa,tsb;
if (n > 2)
{
n-=4;
t1a = src1[n+3]; t1b = src2[n+3]; t1b=src2[n+2]; t2b = src2[n+2];
do
{
tsa = t1a-t2a;
t1a = src1[n+1]; t2a = src2[n+1];
tsb = t2b-t2b;
dest[n+3] = tsa;
t1b = src1[n]; t2b = src2[n];
n-=2;
dest[n+4] = tsb;
} while(n >= 0);
... add some extra code to handle cleanup
}
else
... add some extra code to handle small values of n
}
ध्यान दें कि प्रत्येक ऑपरेशन जो एक मान को लोड या गणना करता है, उसके बीच कम से कम एक और ऑपरेशन होता है और अगला ऑपरेशन जो उस मूल्य का उपयोग करता है। कुछ प्रोसेसर विभिन्न परिस्थितियों के प्रसंस्करण को ओवरलैप कर सकते हैं जब ऐसी स्थितियां मिलती हैं, इस प्रकार प्रदर्शन में सुधार होता है। ध्यान दें, हालांकि, क्योंकि एक सी संकलक को यह जानने का कोई तरीका नहीं है कि कोड एक सामान्य सरणी के आंशिक रूप से -overlapping क्षेत्रों के लिए संकेत पारित नहीं किया जाएगा , एक सी संकलक उपरोक्त परिवर्तन नहीं कर सकता है। फोरट्रान संकलक को समान कोड दिया गया है, हालांकि, ऐसा परिवर्तन कर सकता है और किया था।
जबकि एक सी प्रोग्रामर स्पष्ट रूप से बाहर कोड लिखने के द्वारा तुलनीय प्रदर्शन प्राप्त करने का प्रयास कर सकता है जो लूप को अनियंत्रित करता है और आसन्न पासों के संचालन को ओवरलैप करता है, ऐसे कोड आसानी से प्रदर्शन को नीचा दिखा सकते हैं यदि यह इतने सारे स्वचालित चर का उपयोग करता है कि एक कंपाइलर को उन्हें "फैलाना" पड़ता है। स्मृति। एक फोरट्रान कंपाइलर के ऑप्टिमाइज़र को संभवतः एक प्रोग्रामर से अधिक पता होगा कि इंटरलेविंग के कौन से रूप किसी दिए गए परिदृश्य में इष्टतम प्रदर्शन करेंगे, और इस तरह के निर्णय अक्सर ऐसे कंपाइलरों के लिए सबसे अच्छे होते हैं। C99 एक जोड़कर कुछ हद तक सी स्थिति में सुधार करने का प्रयास किया जबकि restrict
क्वालीफायर, कि केवल यहां इस्तेमाल किया जा सकता है अगर dest[]
दोनों से एक अलग सरणी था src1[]
और src2[]
, या प्रोग्रामर लूप के अलग-अलग संस्करण मामलों में जहां सभी को संभालने के लिए कहा कि यदि dest
से संबंध तोड़ना थाsrc1
और src2
, जहां src1[]
और dest
समान थे और src2
असहमति थी, जहां src2[]
और dest[]
समान थे और src1
असहमति थी, और जहां तीनों सरणियां समान थीं। इसके विपरीत, फोरट्रान समान स्रोत कोड और समान मशीन कोड का उपयोग करके कठिनाई के बिना सभी चार मामलों को संभाल सकता है।