FORTRAN gaya lama mensyaratkan bahwa seorang programmer yang ingin membuat bagian dari array tersedia untuk fungsi yang diperlukan untuk meneruskan referensi ke seluruh array, bersama dengan satu atau lebih nilai integer yang menentukan subscript awal dan juga subscript akhir atau jumlah item . C memungkinkan untuk menyederhanakan ini dengan melewatkan pointer ke awal bagian bunga bersama dengan jumlah elemen. Dalam istilah langsung, ini akan membuat segalanya lebih cepat (melewati dua hal daripada tiga). Namun, secara tidak langsung, ini mungkin memperlambat segalanya dengan membatasi jenis pengoptimalan yang dapat dilakukan oleh kompiler.
Pertimbangkan fungsinya:
void diff(float dest[], float src1[], float src2[], int n)
{
for (int i=0; i<n; i++)
dest[i] = src1[i] - src2[i];
}
jika kompilator tahu bahwa masing-masing pointer akan mengidentifikasi awal array, itu dapat menghasilkan kode yang akan bertindak atas elemen-elemen array secara paralel, atau dalam urutan apa pun, karena untuk setiap x! = y, operasi pada dest [x ] tidak akan memengaruhi src1 [y] atau src2 [y]. Sebagai contoh, pada beberapa sistem kompiler dapat mengambil manfaat dari menghasilkan kode yang setara dengan:
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
}
Perhatikan bahwa setiap operasi yang memuat atau menghitung nilai memiliki setidaknya satu operasi lagi di antara itu dan operasi berikutnya yang menggunakan nilai itu. Beberapa prosesor dapat tumpang tindih pemrosesan operasi yang berbeda ketika kondisi tersebut terpenuhi, sehingga meningkatkan kinerja. Perhatikan, bagaimanapun, bahwa karena kompiler C tidak memiliki cara untuk mengetahui bahwa kode tidak akan melewati pointer ke sebagian- daerah tumpang tindih array umum, kompiler C tidak dapat melakukan transformasi di atas. Kompiler FORTRAN yang diberikan kode yang setara, bagaimanapun, dapat dan memang melakukan transformasi seperti itu.
Sementara seorang programmer C dapat mencoba untuk mencapai kinerja yang sebanding dengan secara eksplisit menulis kode yang membuka gulungan dan tumpang tindih operasi pass yang berdekatan, kode tersebut dapat dengan mudah menurunkan kinerja jika menggunakan begitu banyak variabel otomatis sehingga kompiler harus "menumpahkan" mereka untuk Penyimpanan. Pengoptimal kompiler FORTRAN kemungkinan akan tahu lebih banyak daripada seorang programmer tentang bentuk interleaving apa yang akan menghasilkan kinerja optimal dalam skenario tertentu, dan keputusan seperti itu sering kali lebih baik diserahkan kepada kompiler seperti itu. Sementara C99 berusaha memperbaiki situasi C agak dengan menambahkan restrict
kualifikasi, yang hanya bisa digunakan di sini jika dest[]
adalah array yang terpisah dari keduanya src1[]
dan src2[]
, atau jika programmer menambahkan versi loop yang terpisah untuk menangani kasus-kasus di mana semua dest
terlepas darisrc1
dan src2
, di mana src1[]
dan dest
sama dan src2
terpisah, di mana src2[]
dan dest[]
sama dan src1
terpisah, dan di mana ketiga array sama. FORTRAN, sebaliknya, dapat menangani keempat kasus tanpa kesulitan menggunakan kode sumber yang sama dan kode mesin yang sama.