ฉันพยายามเปรียบเทียบประสิทธิภาพของภาษาแอสเซมบลีแบบอินไลน์และรหัส C ++ ดังนั้นฉันจึงเขียนฟังก์ชั่นที่เพิ่มขนาด 2,000 อาร์เรย์สองอาร์เรย์เป็น 100,000 ครั้ง นี่คือรหัส:
#define TIMES 100000
void calcuC(int *x,int *y,int length)
{
for(int i = 0; i < TIMES; i++)
{
for(int j = 0; j < length; j++)
x[j] += y[j];
}
}
void calcuAsm(int *x,int *y,int lengthOfArray)
{
__asm
{
mov edi,TIMES
start:
mov esi,0
mov ecx,lengthOfArray
label:
mov edx,x
push edx
mov eax,DWORD PTR [edx + esi*4]
mov edx,y
mov ebx,DWORD PTR [edx + esi*4]
add eax,ebx
pop edx
mov [edx + esi*4],eax
inc esi
loop label
dec edi
cmp edi,0
jnz start
};
}
ที่นี่main()
:
int main() {
bool errorOccured = false;
setbuf(stdout,NULL);
int *xC,*xAsm,*yC,*yAsm;
xC = new int[2000];
xAsm = new int[2000];
yC = new int[2000];
yAsm = new int[2000];
for(int i = 0; i < 2000; i++)
{
xC[i] = 0;
xAsm[i] = 0;
yC[i] = i;
yAsm[i] = i;
}
time_t start = clock();
calcuC(xC,yC,2000);
// calcuAsm(xAsm,yAsm,2000);
// for(int i = 0; i < 2000; i++)
// {
// if(xC[i] != xAsm[i])
// {
// cout<<"xC["<<i<<"]="<<xC[i]<<" "<<"xAsm["<<i<<"]="<<xAsm[i]<<endl;
// errorOccured = true;
// break;
// }
// }
// if(errorOccured)
// cout<<"Error occurs!"<<endl;
// else
// cout<<"Works fine!"<<endl;
time_t end = clock();
// cout<<"time = "<<(float)(end - start) / CLOCKS_PER_SEC<<"\n";
cout<<"time = "<<end - start<<endl;
return 0;
}
จากนั้นฉันรันโปรแกรมห้าครั้งเพื่อรับรอบของตัวประมวลผลซึ่งอาจถูกมองว่าเป็นเวลา ทุกครั้งที่ฉันเรียกใช้ฟังก์ชันใดฟังก์ชันหนึ่งที่กล่าวถึงข้างต้นเท่านั้น
และนี่คือผลลัพธ์
ฟังก์ชั่นของรุ่นประกอบ:
Debug Release
---------------
732 668
733 680
659 672
667 675
684 694
Average: 677
ฟังก์ชั่นของรุ่น C ++:
Debug Release
-----------------
1068 168
999 166
1072 231
1002 166
1114 183
Average: 182
โค้ด C ++ ในโหมดรีลีสนั้นเร็วกว่าโค้ดแอสเซมบลีเกือบ 3.7 เท่า ทำไม?
ฉันเดาว่ารหัสแอสเซมบลีที่ฉันเขียนนั้นไม่มีประสิทธิภาพเหมือนกับที่สร้างโดย GCC มันยากสำหรับโปรแกรมเมอร์ทั่วไปอย่างฉันที่จะเขียนโค้ดเร็วกว่าคู่ต่อสู้ที่สร้างโดยคอมไพเลอร์นั่นหมายความว่าฉันไม่ควรเชื่อถือประสิทธิภาพของภาษาแอสเซมบลีที่เขียนด้วยมือของฉันจดจ่อกับ C ++ และลืมภาษาแอสเซมบลี