भाषाओं में समान फीचर-सेट हैं। प्रदर्शन अंतर इस तथ्य से आता है कि फोर्ट्रान का कहना है कि एलियासिंग की अनुमति नहीं है, जब तक कि एक EQUIVALENCE कथन का उपयोग नहीं किया जाता है। कोई भी कोड जिसमें अलियासिंग है, वह फोरट्रान मान्य नहीं है, लेकिन यह प्रोग्रामर पर निर्भर है और इन त्रुटियों का पता लगाने के लिए कंपाइलर नहीं है। इस प्रकार फोरट्रान संकलक मेमोरी पॉइंटर्स के संभावित एलियासिंग को अनदेखा करते हैं और उन्हें अधिक कुशल कोड उत्पन्न करने की अनुमति देते हैं। C में इस छोटे से उदाहरण पर एक नज़र डालें:
void transform (float *output, float const * input, float const * matrix, int *n)
{
int i;
for (i=0; i<*n; i++)
{
float x = input[i*2+0];
float y = input[i*2+1];
output[i*2+0] = matrix[0] * x + matrix[1] * y;
output[i*2+1] = matrix[2] * x + matrix[3] * y;
}
}
यह फ़ंक्शन अनुकूलन के बाद फोरट्रान समकक्ष की तुलना में धीमी गति से चलेगा। ऐसा क्यों? यदि आप आउटपुट सरणी में मान लिखते हैं, तो आप मैट्रिक्स के मूल्यों को बदल सकते हैं। आखिरकार, पॉइंटर्स ओवरलैप कर सकते हैं और मेमोरी के उसी चंक को इंगित कर सकते हैं ( int
पॉइंटर सहित !)। सी कंपाइलर को सभी अभिकलन के लिए चार मैट्रिक्स मान को मेमोरी से पुनः लोड करने के लिए मजबूर किया जाता है।
फोरट्रान में कंपाइलर मैट्रिक्स मूल्यों को एक बार लोड कर सकते हैं और उन्हें रजिस्टरों में संग्रहीत कर सकते हैं। ऐसा इसलिए कर सकते हैं क्योंकि फोरट्रान कंपाइलर पॉइंटर्स / एरियर्स को मेमोरी में ओवरलैप नहीं करता है।
सौभाग्य से, restrict
कीवर्ड और सख्त-अलियासिंग को इस समस्या को हल करने के लिए C99 मानक के लिए पेश किया गया है। यह इन दिनों के साथ-साथ अधिकांश C ++ कंपाइलरों में भी समर्थित है। कीवर्ड आपको कंपाइलर को एक संकेत देने की अनुमति देता है कि प्रोग्रामर वादा करता है कि एक पॉइंटर किसी अन्य पॉइंटर के साथ नहीं करता है। सख्त अलियासिंग का मतलब है कि प्रोग्रामर वादों कि विभिन्न प्रकार के संकेत दिए होगा कभी नहीं ओवरलैप है, उदाहरण के लिए एक के लिए double*
नहीं होगा ओवरलैप के साथ एक int*
(विशिष्ट अपवाद के रूप char*
और void*
कुछ भी साथ ओवरलैप कर सकते हैं)।
यदि आप उनका उपयोग करते हैं तो आपको C और फोरट्रान से समान गति मिलेगी। हालांकि, restrict
प्रदर्शन महत्वपूर्ण कार्यों के साथ ही कीवर्ड का उपयोग करने की क्षमता का मतलब है कि C (और C ++) प्रोग्राम बहुत सुरक्षित और लिखने में आसान हैं। उदाहरण के लिए, अमान्य फोरट्रान कोड पर विचार करें: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
जो कि अधिकांश फोरट्रान संकलक बिना किसी चेतावनी के खुशी से संकलित करेंगे, लेकिन एक बग का परिचय देंगे जो केवल कुछ संकलक पर, कुछ हार्डवेयर पर और कुछ अनुकूलन विकल्पों के साथ दिखाता है।