2014-02-21 83 views
2

我正在做我的第一個程序在C++和彙編代碼。我已經知道如何用C++編程,但是當我嘗試使用匯編代碼進行編程時,遇到了很多問題。 我想做一個合成基準,這如何實現綜合基準?

「旨在模仿工作量的組件或系統上的特定類型。綜合測試由強加在組件上的工作量特別創建的程序做到這一點「。(維基百科)

例如,如果我要計算的long fact = pow(3.0, 2000)階乘,我怎樣才能測量在C++中的部件的性能? (而不是整個系統的性能)。

其餘的代碼(事實的計算)在彙編代碼中完成。

+0

除非我記錯了,你會簡單地從一個循環內使重複調用'pow',通過迭代次數除以循環時間。除非您使用的是非多任務操作系統,否則在每次運行時都應該使用相同的時間,從而使平均循環變得冗餘。 – enhzflep

回答

0

以下是使用匯編代碼的我的一個基準測試程序(適用於Linux)的一部分,可以進行重複計算而不用擔心過度優化。你需要使用一個高分辨率的定時器和一個基於彙編的循環,這個定時足夠長,以保證合理的執行時間您可能需要在循環中重複計算來填充管道。

這個重複20M加10次找到最大速度。 IntCount1值在年底作爲一個簡單的完整性檢查檢查

C Code 

    intCount1 = 0; 
    max = 0; 
    for (i=0; i<10; i++) 
    { 
     count = intCount1; 
     start_time(); 
     _mips1Reg(); 
     end_time(); 
     count = intCount1 - count;  
     mips = (int)((double)count/1000000.0/secs + 0.5); 
     if(mips > max) max = mips; 
    }  
    mipsReg[0] = max; 
    printf(" 1 Register %7d 32 Bit Integer MIPS\n", mipsReg[0]); 

######################################################## 

Hi-Res Timer Used 

clock_gettime(CLOCK_REALTIME, &tp1); 
theseSecs = tp1.tv_sec + tp1.tv_nsec/1e9;   

######################################################## 

    Assembly Code 

    global _mips1Reg  
    _mips1Reg: 
     push eax 
     push ebx 
     push ecx 
     push edx 
     push edi 
     mov edi, 1000000 
     mov eax, [intCount1] 
     align 8 
    dlp:add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 1 
     add eax, 3 
     dec edi 
     jnz dlp 
     mov [intCount1], eax 
     pop edi 
     pop edx 
     pop ecx 
     pop ebx 
     pop eax 
     ret