如何在C语言中获取经过的时间(毫秒)?(Windows)

13

我在网上搜索了,但只找到了一种方法能做到这一点,但是用这种方法返回的时间单位是秒而不是毫秒。

我的代码如下:

#include <stdio.h>
#include <assert.h>
#include <time.h>

int main(void)
{
    int solucion;

    time_t start, stop;
    clock_t ticks;
    long count;

    time(&start);
    solucion = divisores_it(92000000, 2);
    time(&stop);

    printf("Finnished in %f seconds. \n", difftime(stop, start));
    return 0;
}
6个回答

37

跨平台的方法是使用ftime。

这里是Windows特定的链接:http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

以下是示例。

#include <stdio.h>
#include <sys\timeb.h> 

int main()     
{ 
    struct timeb start, end;
    int diff;
    int i = 0;
    ftime(&start);

    while(i++ < 999) {
        /* do something which takes some time */
        printf(".");    
    }

    ftime(&end);
    diff = (int) (1000.0 * (end.time - start.time)
        + (end.millitm - start.millitm));

    printf("\nOperation took %u milliseconds\n", diff);
    return 0;
}

我运行了上面的代码,并使用VS2008跟踪调试,发现它实际上调用了Windows的GetSystemTimeAsFileTime函数。

无论如何,ftime将给您毫秒级精度。


根据http://man7.org/linux/man-pages/man3/ftime.3.html,ftime()已经过时。也许更好的跨平台解决方案是使用[`std::chrono`](http://en.cppreference.com/w/cpp/chrono)库。 - erobertc
9
楼主需要一个解决方案是针对 C 而不是 C++。你的建议需要使用 C++ - rbaleksandar

13

以下解决方案在我看来似乎还不错。你认为呢?

#include <stdio.h>
#include <time.h>

long timediff(clock_t t1, clock_t t2) {
    long elapsed;
    elapsed = ((double)t2 - t1) / CLOCKS_PER_SEC * 1000;
    return elapsed;
}

int main(void) {
    clock_t t1, t2;
    int i;
    float x = 2.7182;
    long elapsed;

    t1 = clock();
    for (i=0; i < 1000000; i++) {
           x = x * 3.1415; 
    }
    t2 = clock();

    elapsed = timediff(t1, t2);
    printf("elapsed: %ld ms\n", elapsed);


    return 0;
}

参考资料: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.15.html#clock


在这行代码中你不能使用 timediffelapsed = timediff(t1, t2);,除非定义了正确的头文件。只需要使用 t2-t1 就可以正常工作。 - inckka
1
@inckka,timediff()main()上面定义。不需要头文件。而且t2-t1不会给你毫秒级的答案。 - mcrisc
你是正确的。对于粗心的误解,我很抱歉。 - inckka
3
在多线程程序中使用clock()时应当小心,因为它返回的是“程序消耗的CPU时间”,而不是经过的时间。请注意避免混淆。 - Ameer Jewdaki

3

这段代码可行。这是基于Angus Comber的答案:

#include <sys/timeb.h>

uint64_t system_current_time_millis()
{
#if defined(_WIN32) || defined(_WIN64)
    struct _timeb timebuffer;
    _ftime(&timebuffer);
    return (uint64_t)(((timebuffer.time * 1000) + timebuffer.millitm));
#else
    struct timeb timebuffer;
    ftime(&timebuffer);
    return (uint64_t)(((timebuffer.time * 1000) + timebuffer.millitm));
#endif
}

2

对于Windows系统,GetSystemTime()是你需要的函数。对于POSIX系统,使用gettimeofday()函数。


1

0
DWORD start = GetTickCount();
executeSmth();
printf("Elapsed: %i ms", GetTickCount() - start);

顺便提一下,这种方法有一些限制。请参见GetTickCount


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接