ওল্ড স্টাইলের ফরট্রানের প্রয়োজন ছিল যে প্রোগ্রামার যিনি একটি ফাংশনটিতে অ্যারের অংশটি সরবরাহ করতে চেয়েছিলেন পুরো অ্যারেতে একটি রেফারেন্স পাস করার জন্য, এক বা একাধিক পূর্ণসংখ্যার মান সহ প্রারম্ভিক সাবস্ক্রিপ্ট এবং শেষের সাবস্ক্রিপ্ট বা আইটেমের সংখ্যা উল্লেখ করে । সি এটির সংখ্যার সাথে আগ্রহের অংশের শুরুতে একটি পয়েন্টারটি পাস করার ক্ষেত্রে এটি সহজ করে তোলে । প্রত্যক্ষ কথায়, এটি জিনিসগুলিকে দ্রুত করে তুলবে (তিনটির চেয়ে দুটি জিনিস পাস করা)। অপ্রত্যক্ষভাবে, তবে এটি কোনও সংকলক সম্পাদন করতে পারে এমন ধরণের অপ্টিমাইজেশনের সীমাবদ্ধ করে জিনিসগুলি ধীরে ধীরে শেষ করতে পারে।
ফাংশনটি বিবেচনা করুন:
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
}
মনে রাখবেন যে প্রতিটি ক্রিয়াকলাপ যা কোনও মান লোড করে বা গণনা করে তার মধ্যে এবং পরবর্তী অপারেশনের মধ্যে কমপক্ষে আরও একটি অপারেশন থাকে যা সেই মানটি ব্যবহার করে। কিছু প্রসেসর যখন এই ধরনের শর্ত পূরণ হয় তখন বিভিন্ন ক্রিয়াকলাপের প্রসেসিংকে ওভারল্যাপ করতে পারে, ফলে কর্মক্ষমতা উন্নত হয়। দ্রষ্টব্য, তবে, যেহেতু কোনও সি সংকলকটি জানার কোনও উপায় নেই যে কোডটি একটি সাধারণ অ্যারের আংশিক- ওভারল্যাপিং অঞ্চলে পয়েন্টারগুলি পাস করা হবে না , তাই কোনও সি সংকলক উপরের রূপান্তর করতে পারবেন না। ফরট্রান সংকলকগণ সমতুল্য কোডগুলি প্রদান করেছেন তবে এ জাতীয় রূপান্তর করতে পারে এবং করতে পারে।
যখন একজন সি প্রোগ্রামার লুপটি আনরোলড করে এবং সংলগ্ন পাসগুলির ক্রিয়াকলাপকে ওভারল্যাপ করে এমন কোড লিখে স্পষ্টভাবে লিখে তুলনামূলক পারফরম্যান্স অর্জনের চেষ্টা করতে পারে, তবে এই ধরনের কোড সহজেই পারফরম্যান্স হ্রাস করতে পারে যদি এটি এতগুলি স্বয়ংক্রিয় ভেরিয়েবল ব্যবহার করে যে কোনও সংকলক তাদের "স্পিল" করতে হত স্মৃতি. একটি ফরট্রেন সংকলকের অপ্টিমাইজার সম্ভবত কোনও প্রোগ্রামারের চেয়ে আরও জানতে পারে যে ইন্টারলিভিংয়ের কী কী রূপগুলি একটি নির্দিষ্ট দৃশ্যে অনুকূল পারফরম্যান্স অর্জন করবে এবং এই জাতীয় সিদ্ধান্তগুলি সাধারণত এই ধরনের সংকলককে সবচেয়ে ভাল রেখে দেওয়া হয়। সি 99 যখন restrict
কোয়ালিফায়ার যুক্ত করে সি এর পরিস্থিতি কিছুটা উন্নত করার চেষ্টা করেছিল , তবে এটি কেবল তখনই ব্যবহার করা যেতে পারে যদি dest[]
উভয় থেকে পৃথক অ্যারে src1[]
এবং src2[]
প্রোগ্রামার লুপের আলাদা সংস্করণ যুক্ত করে যেখানে মামলাগুলি সমস্ত dest
থেকে বিরত ছিল handlesrc1
এবং src2
, যেখানে src1[]
এবং dest
সমান ছিল এবং src2
অসংলগ্ন করা হয়, এটি কোথায় src2[]
এবং dest[]
সমান ছিল এবং src1
অসংলগ্ন করা ছিল, এবং যেখানে তিনটি অ্যারে সমান ছিল। বিপরীতে, ফোরট্রান একই উত্স কোড এবং একই মেশিন কোডটি ব্যবহার না করেই চারটি কেস পরিচালনা করতে পারে।