ฉันพยายามเปรียบเทียบประสิทธิภาพของภาษาแอสเซมบลีแบบอินไลน์และรหัส 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 ++ และลืมภาษาแอสเซมบลี