1. 程式人生 > >c++ 各種求min/max方法效率測試

c++ 各種求min/max方法效率測試

由於min跟max是等價的,下面只對求min進行測試
每次測試執行min 109次,記錄時間(單位:秒)
耗時以STL為參考基準

執行環境
Windows 7 32-bit on Intel Pentium G2030 @ 3.0GHz
編譯器
MinGW GCC 4.8.1 32-bit Release
附加命令
-g -Wall -Wl,-stack,100000000

int 單變數

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.121 2.106 2.090 2.106 56.2%
STL 3.744 3.744 3.744 3.744 100.0%
普通函式 3.386 3.385 3.401 3.391 90.6%
inline普通函式 3.432 3.448 3.401 3.427 91.5%
傳引用函式 3.229 3.073 3.058 3.120 83.3%
inline傳引用函式 3.447 3.401 3.400 3.416 91.2%
define 2.387 2.387 2.403 2.392 63.9%

int 表示式

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.091 2.090 2.106 2.096 30.0%
STL 7.004 6.973 6.973 6.983 100.0%
普通函式 6.178 6.178 6.178 6.178 88.5%
inline普通函式 6.162 6.162 6.162 6.162 88.2%
define 5.273 5.288 5.289 5.283 75.7%

long long 單變數

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.169 2.090 2.106 2.122 51.6%
STL 4.118 4.103 4.103 4.108 100.0%
普通函式 5.507 5.476 5.491 5.491 133.7%
inline普通函式 5.491 5.491 5.507 5.496 133.8%
傳引用函式 3.853 3.837 3.853 3.848 93.7%
inline傳引用函式 3.838 3.838 3.838 3.838 93.4%
define 2.075 2.044 2.090 2.070 50.4%

long long 表示式

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.090 2.121 2.106 2.106 11.0%
STL 19.188 19.142 19.157 19.162 100.0%
普通函式 20.358 20.046 20.062 20.155 105.2%
inline普通函式 20.265 20.233 20.109 20.202 105.4%
define 16.224 16.224 16.208 16.219 84.6%

double 單變數

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.074 2.091 2.091 2.085 60.7%
STL 3.448 3.447 3.416 3.437 100.0%
普通函式 10.920 10.936 10.905 10.920 317.7%
inline普通函式 10.873 10.982 10.873 10.909 317.4%
傳引用函式 3.230 3.230 3.229 3.230 94.0%
inline傳引用函式 4.321 4.352 4.337 4.337 126.2%
define 2.402 2.402 2.434 2.413 70.2%

double 表示式

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.278 2.122 2.122 2.174 47.8%
STL 4.555 4.555 4.539 4.550 100.0%
普通函式 11.606 11.591 11.591 11.596 254.9%
inline普通函式 11.654 11.591 11.654 11.633 255.7%
define 2.637 2.621 2.621 2.626 57.7%

包含適量變數的struct 單變數

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.153 2.121 2.106 2.127 17.2%
STL 12.621 12.246 12.231 12.366 100.0%
普通函式 26.863 26.271 26.286 26.473 214.1%
inline普通函式 26.317 26.302 26.349 26.323 212.9%
傳引用函式 17.800 17.862 17.799 17.820 144.1%
inline傳引用函式 17.831 17.753 17.769 17.784 143.8%
define 10.078 10.031 10.046 10.052 81.3%

包含適量變數的struct 表示式

測試次數 Test 1 Test 2 Test 3 Avg 百分比
for迴圈 2.247 2.121 2.106 2.158 3.8%
STL 57.330 57.268 57.627 57.408 100.0%
普通函式 70.824 71.527 71.776 71.376 124.3%
inline普通函式 70.887 71.324 71.183 71.131 123.9%
define 78.110 77.205 77.985 77.767 135.5%

總結

  • STL最穩定
  • define在大部分情況是最快的
  • define主要耗時在計算表示式上
  • 如果建立當前型別的代價過高,傳引用的函式相對不傳的有明顯優勢
  • 只要不去卡常數,用STL自帶的就行了

原始碼

#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <windows.h>
using namespace std;
#define N 1010
#define PLL 9999999999999937LL
#define P 999999937
#define foru(i,l,r) for (int i=l; i<=r; i++)
#define ford(i,r,l) for (int i=r; i>=l; i--)
#define read(x) (x=getint())
#define minorz(a,b) ((a)<(b)?(a):(b))
typedef long long LL;
struct stt
{
    int x;
    double z;
    LL e;
    char f;
    bool operator < (const stt a) const
    {
        return x<a.x;
    }
    stt operator + (stt a)
    {
        stt r=a;
        r.x+=x;
        return r;
    }
    stt operator * (stt a)
    {
        stt r=a;
        r.x+=x;
        return r;
    }
};
typedef int integer;

integer a[1000],b,c,d,y,z;
int x;

integer minfuc(integer a, integer b)
{
    return a<b?a:b;
}
integer minfuc2(integer &a, integer &b)
{
    return a<b?a:b;
}
inline integer inlminfuc(integer a, integer b)
{
    return a<b?a:b;
}
inline integer inlminfuc2(integer &a, integer &b)
{
    return a<b?a:b;
}
//#define val1 (a[233]*a[2]+a[666])%P
//#define val2 (a[666]*a[4]+a[233])%P
//#define val1 (a[233]*a[2]+a[666])
//#define val2 (a[666]*a[4]+a[233])
#define val1 a[233]
#define val2 a[666]
int main()
{
    a[233]=233333333<<8, a[666]=666666666<<7;
//  a[233].=233333333<<8, a[666].x=666666666<<7;
//  a[233]+=a[666]+=0.321;
//  printf("%.3lf %.3lf\n",a[233],a[666]);
    foru(i,1,100) a[i]=i;
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {   
    }
    printf("for cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=min(val1,val2);       
    }
    printf("STL cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=minfuc(val1,val2);
    }
    printf("function cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=inlminfuc(val1,val2); 
    }
    printf("inline function cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=minfuc2(val1,val2);
    }
    printf("function2 cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=inlminfuc2(val1,val2);    
    }
    printf("inline function2 cost %dms\n",GetTickCount()-x);
//  ===================================
    x=GetTickCount();
    foru(i,1,1000000000)
    {
        y=minorz(val1,val2);    
    }
    printf("define cost %dms\n",GetTickCount()-x);
    return 0;
}