zoukankan      html  css  js  c++  java
  • 哪个f循环更快?实际测试

    循环想必各位都有用过,那么用哪个循环效率最高呢,现在就来实际检测

    测试代码如下

    #include<iostream>
    #include<time.h>
    
    using namespace std;
    
    #define cycs 500
    
    int main(int argc,char* argv[])
    {
        double avg = 0;
        int i = cycs;
        while (i--) {//for循环1号
            
            int f = clock();
            for (int a = 0; a < 9999999; a++);
            int s = clock();
    
            avg += ((double)s - (double)f);
            
        }
        cout << avg / cycs <<endl;
        avg = 0;
        i = cycs;
        while (i--) {//for循环2号
            
            int f = clock();
            for (int a = 1; a <= 9999999; a++);
            int s = clock();
    
            avg += ((double)s - (double)f);
            
        }
        cout << avg / cycs << endl;
        avg = 0;
        i = cycs;
        while (i--) {//while循环
            
            int f = clock();
            int a = 0;
            while (a < 9999999)  a++;
            int s = clock();
    
            avg += ((double)s - (double)f);
            
        }
        cout << avg / cycs<<endl;
        avg = 0;
        i = cycs;
        while (i--) {//dowhile循环
            
    
            int f = clock();
            int a = 0;
            do
            {
                a++;
            } while (a < 9999999);
            int s = clock();
    
            avg += ((double)s - (double)f);
        
        }
        cout << avg / cycs<<endl;
        
    
    }

    每次循环9999999次,反复运行500次取平均时间

    第一轮测试结果如下,在调试模式下执行

    17.054
    15.276
    13.15
    14.916
    ///////
    16.384
    13.72
    11.854
    13.966
    ///////
    17.194
    14.204
    11.79
    13.56
    //////
    16.644
    13.646
    12.964
    14.028

    综合while循环最快

    第二轮测试结果如下,在非调试模式下执行

    14.134
    14
    14.382
    15.09
    //////
    15.444
    17.222
    16.738
    16.222
    ///////
    15.384
    15.294
    14.366
    14.636
    //////
    13.78
    13.24
    14.568
    14.608

    综合4者,4者的速度并没有太大差别

    从汇编角度分析

    //for循环1号,3次mov,2次jmp,1次add,1次cmp,1次jge,8条指令
    mov         dword ptr [ebp-34h],0  
    jmp         main+80h (04B2EB0h)  
    mov         eax,dword ptr [ebp-34h]  
    add         eax,1  
    mov         dword ptr [ebp-34h],eax  
    cmp         dword ptr [ebp-34h],98967Fh  
    jge         main+8Bh (04B2EBBh)  
    jmp         main+77h (04B2EA7h)  
    //for循环2号,3次mov,2次jmp,1次cmp,1次jg,8条指令
    mov         dword ptr [ebp-58h],1  
    jmp         main+145h (04B2F75h)  
    mov         eax,dword ptr [ebp-58h]  
    add         eax,1  
    mov         dword ptr [ebp-58h],eax  
    cmp         dword ptr [ebp-58h],98967Fh  
    jg          main+150h (04B2F80h)  
    jmp         main+13Ch (04B2F6Ch)  
    //while循环,3次mov,1次cmp,1次jge,1次add,1次jmp,7条指令
    mov         dword ptr [ebp-7Ch],0  
    cmp         dword ptr [ebp-7Ch],98967Fh  
    jge         main+213h (04B3043h)  
    mov         eax,dword ptr [ebp-7Ch]  
    add         eax,1  
    mov         dword ptr [ebp-7Ch],eax  
    jmp         main+1FFh (04B302Fh)  
    //dowhile循环,3次mov,1次add,1次cmp,1次jl,6条指令
    mov         dword ptr [ebp-0A0h],0          
    mov         eax,dword ptr [ebp-0A0h]  
    add         eax,1  
    mov         dword ptr [ebp-0A0h],eax  
    cmp         dword ptr [ebp-0A0h],98967Fh  
    jl          main+2CEh (04B30FEh)  

    虽然for循环指令较多,但是整体时序较快,而dowhile虽然指令较少,但是时序较慢

    所以实际上,各个循环的速度并没有什么差别,虽然在调试模式下会有1~2ms的差别,但是在循环次数达到9999999的情况下

    基本可以说是没有差别,也不用担心<=比<更耗时间,怎么舒服就怎么用

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/prprpr/p/13762055.html
Copyright © 2011-2022 走看看