C程序输出分析

C程序输出分析,c,winapi,C,Winapi,在windows 10上运行的简单C程序。(Visual Studio 2013) 有些行为0.000000,有些行为15.000000-17.000000 这些输出可能与第二次运行的输出不完全相同。但是在第二次/第三次。。运行时,必须有一些行包含0.000000ms和15.000000-17.000000ms 0毫秒到16毫秒(是否用于处理CPU时间?)。请你解释一下真正的原因是什么 如果我想避免这种更改并获得统一的输出,比如0-1ms,那么如何更改代码呢。(循环运行50次,但如果我运行100

在windows 10上运行的简单C程序。(Visual Studio 2013)

有些行为0.000000,有些行为15.000000-17.000000

这些输出可能与第二次运行的输出不完全相同。但是在第二次/第三次。。运行时,必须有一些行包含0.000000ms和15.000000-17.000000ms

  • 0毫秒到16毫秒(是否用于处理CPU时间?)。请你解释一下真正的原因是什么

  • 如果我想避免这种更改并获得统一的输出,比如0-1ms,那么如何更改代码呢。(循环运行50次,但如果我运行100或1000次,则时间效果很容易理解。)


  • 您的代码太短,
    clock()
    没有精确测量执行时间所需的精度。加上执行时钟测量的系统开销,您会得到随机结果

    为了获得更好的度量,在函数上循环100万次,然后时钟&除以100万得到平均执行时间


    对于更复杂的程序,使用代码探查器可能是一个更好的解决方案(它专门用于函数的精细计时&测量当前函数指令的执行时间,而不是一项简单的任务)

    您的代码太短,
    clock()
    没有精确测量执行时间所需的精度。加上执行时钟测量的系统开销,您会得到随机结果

    为了获得更好的度量,在函数上循环100万次,然后时钟&除以100万得到平均执行时间

    对于更复杂的程序,使用代码探查器可能是一个更好的解决方案(它专门用于函数的精细计时&测量当前函数指令的执行时间,而不是一项简单的任务)

    1) 这是由于过程的频率不是恒定的

    因此,当您通过循环打印时,它直接取决于处理器的频率

    2) 为了避免这种行为,您可以检查时钟值是否正好大于1毫秒或1秒,以便在此时准确打印。(在无限循环中)

    1) 这是由于过程的频率不是恒定的

    因此,当您通过循环打印时,它直接取决于处理器的频率


    2) 为了避免这种行为,您可以检查时钟值是否正好大于1毫秒或1秒,以便在此时准确打印。(无限循环)

    我同意让·弗朗索瓦·法布和本杰明·奥德特的观点


    您可以使用来对某段代码的性能进行基准测试。它将执行一个循环,以说明运行时差异。将显示偏差的平均值

    我同意让·弗朗索瓦·法布和本杰明·奥德特的观点


    您可以使用来对某段代码的性能进行基准测试。它将执行一个循环,以说明运行时差异。将显示偏差的平均值

    可能的副本。Windows时间戳和计时器的分辨率为16ms,除非使用
    timeBeginPeriod(1)
    。对于计时,无论如何都应该使用
    QueryPerformanceCounter
    。如果您使用的是Windows 8或更高版本,并且需要精确的当前时间,请使用
    GetSystemTimePreciseSFileTime
    。我认为
    clock()
    不是很精确。请尝试
    struct/time.h
    在从
    printf()
    返回之前,我希望您的计算机正在执行其他内务管理任务。您的线程不会一直执行。windows会定期挂起它,以便给其他线程留出时间。结果,当线程在循环中被中断时,这个峰值出现。当他不中断运行时-您得到0毫秒感谢大家分享您的重要概念和解决方案:)可能的重复。Windows时间戳和计时器的分辨率为16ms,除非使用
    timeBeginPeriod(1)
    。对于计时,无论如何都应该使用
    QueryPerformanceCounter
    。如果您使用的是Windows 8或更高版本,并且需要精确的当前时间,请使用
    GetSystemTimePreciseSFileTime
    。我认为
    clock()
    不是很精确。请尝试
    struct/time.h
    在从
    printf()
    返回之前,我希望您的计算机正在执行其他内务管理任务。您的线程不会一直执行。windows会定期挂起它,以便给其他线程留出时间。结果,当线程在循环中被中断时,这个峰值出现。当他无中断运行时-您得到0毫秒感谢大家分享您的重要概念和解决方案:)
    #include <time.h>
    
    void hello(){
        printf("hello world");
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        clock_t t;
        for (int i = 0; i<50; i++){
            t = clock();
            hello();
            t = clock() - t;
            double time_taken = ((double)t) / CLOCKS_PER_SEC; // in seconds
    
            printf("hello() took %f ms to execute \n", time_taken * 1000);
        }
        getchar();
        return 0;
    }
    
    hello worldhello() took 0.000000 ms to execute(35times)
    hello worldhello() took 17.000000 ms to execute
    hello worldhello() took 3.000000 ms to execute
    hello worldhello() took 2.000000 ms to execute
    hello worldhello() took 0.000000 ms to execute(5 times)
    hello worldhello() took 15.000000 ms to execute
    hello worldhello() took 0.000000 ms to execute(4 times)
    hello worldhello() took 16.000000 ms to execute
    hello worldhello() took 0.000000 ms to execute