FORTRAN แบบเก่าต้องการให้โปรแกรมเมอร์ที่ต้องการให้เป็นส่วนหนึ่งของอาร์เรย์ที่มีอยู่ในฟังก์ชั่นที่จำเป็นในการส่งการอ้างอิงไปยังอาร์เรย์ทั้งหมดพร้อมกับค่าจำนวนเต็มตั้งแต่หนึ่งค่าขึ้นไปที่ระบุตัวห้อยเริ่มต้นและตัวห้อยสิ้นสุดหรือจำนวนรายการ . C ทำให้เป็นไปได้ที่จะทำให้สิ่งนี้ง่ายขึ้นในการส่งตัวชี้ไปยังจุดเริ่มต้นของส่วนที่สนใจพร้อมกับจำนวนองค์ประกอบ ในแง่ตรงนี้จะทำให้สิ่งต่าง ๆ เร็วขึ้น (ผ่านสองสิ่งมากกว่าสาม) อย่างไรก็ตามทางอ้อมอาจทำให้การทำงานช้าลงโดย จำกัด ประเภทของการเพิ่มประสิทธิภาพที่คอมไพเลอร์สามารถทำได้
พิจารณาฟังก์ชั่น:
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 การดำเนินการบน dest [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
}
โปรดทราบว่าทุกการดำเนินการที่โหลดหรือคำนวณค่าจะมีการดำเนินการอย่างน้อยหนึ่งครั้งระหว่างการดำเนินการกับการดำเนินการถัดไปที่ใช้ค่านั้น โปรเซสเซอร์บางตัวสามารถซ้อนการประมวลผลของการดำเนินการที่แตกต่างกันเมื่อตรงตามเงื่อนไขดังกล่าวซึ่งเป็นการปรับปรุงประสิทธิภาพ อย่างไรก็ตามโปรดทราบว่าเนื่องจากคอมไพเลอร์ C ไม่มีทางรู้ได้ว่าโค้ดจะไม่ถูกส่งผ่านพอยน์เตอร์ไปยังส่วนที่ทับซ้อนกันของอาร์เรย์ทั่วไปบางส่วนคอมไพเลอร์ C ไม่สามารถทำการแปลงข้างต้นได้ คอมไพเลอร์ของ FORTRAN ให้รหัสเทียบเท่า แต่สามารถและทำการเปลี่ยนแปลงดังกล่าวได้
ในขณะที่โปรแกรมเมอร์ C สามารถพยายามที่จะบรรลุผลการเปรียบเทียบโดยการเขียนโค้ดที่คลี่ลูปและทำการซ้อนทับการทำงานของการส่งผ่านที่อยู่ติดกันอย่างชัดเจนรหัสดังกล่าวสามารถลดประสิทธิภาพได้หากใช้ตัวแปรอัตโนมัติจำนวนมากที่คอมไพเลอร์ หน่วยความจำ เครื่องมือเพิ่มประสิทธิภาพของคอมไพเลอร์ FORTRAN น่าจะรู้มากกว่าโปรแกรมเมอร์เกี่ยวกับรูปแบบของการแทรกสอดที่จะให้ประสิทธิภาพที่ดีที่สุดในสถานการณ์ที่กำหนดและการตัดสินใจดังกล่าวมักจะดีที่สุดสำหรับคอมไพเลอร์ดังกล่าว ในขณะที่ C99 พยายามที่จะปรับปรุงสถานการณ์ของ C โดยการเพิ่มrestrict
qualifier ซึ่งสามารถใช้ที่นี่ได้ถ้าdest[]
เป็น array ที่แยกจากทั้งสองsrc1[]
และsrc2[]
หรือถ้าโปรแกรมเมอร์เพิ่ม loop แยกรุ่นของ loop เพื่อจัดการกับกรณีที่dest
ถูกแยกจากกันsrc1
และsrc2
ที่ไหนsrc1[]
และdest
เท่ากันและsrc2
เป็น disjoint ที่src2[]
และdest[]
เท่ากันและsrc1
ถูก disjoint และที่ทั้งสามอาร์เรย์มีค่าเท่ากัน ในทางตรงกันข้าม FORTRAN สามารถจัดการกับทั้งสี่กรณีได้อย่างง่ายดายโดยใช้รหัสต้นฉบับเดียวกันและรหัสเครื่องเดียวกัน