2013-06-22 37 views
6

Web'de arama yaptım, ancak bunu yapmanın bir yolunu buldum, ancak bu sayede milisaniye yerine saniyeler içinde dönüyor.C cinsinden saniye cinsinden geçen süre nasıl alınır? (Windows)

My kodudur:

#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; 
} 

cevap

20

Çapraz platform yolu ftime kullanmaktır. Burada

Windows'a özel bağlantı: Aşağıdaki http://msdn.microsoft.com/en-us/library/aa297926(v=vs.60).aspx

örneği.

#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; 
} 

Ben yukarıdaki kodu koştum ve VS2008 kullanarak içinden takip ve aslında pencereler GetSystemTimeAsFileTime işlevini çağırır gördü.

Her neyse, ftime size milisaniye hassasiyeti verecektir.

+0

() kullanılmıyor. Belki daha iyi bir çapraz platform çözümü ['std :: chrono'] (http://en.cppreference.com/w/cpp/chrono) kütüphanesini kullanmak olabilir. – erobertc

+4

@erobertc OP'nin "C" için değil "C++" için bir çözüme ihtiyacı var. Öneriniz 'C++' gerektirir. – rbaleksandar

1

GetSystemTime() mili saniyelik çözünürlüğü sağlar yapı SYSTEMTIME kullanır.

More on this here.

1

Windows için GetSystemTime() ne istiyor. POSIX için, gettimeofday().

9

Aşağıdaki çözüm bana uygun görünüyor. Ne düşünüyorsun?

#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; 
} 

Referans: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.15.html#clock

+0

"timediff" i bu satırda kullanamazsınız: 'dize = timediff (t1, t2);' doğru üstbilgi dosyası tanımlanmadıkça. Sadece 't2-t1 'iyi çalışacaktır. – inckka

+1

@inckka, 'timediff()', ana() 'nin üstünde tanımlanmıştır. Başlık dosyası gerekli değildir. Ve 't2-t1' size milisaniye cinsinden cevap vermez. – mcrisc

+0

Haklısınız. Dikkatsiz yanlış anlaşılma için özür dilerim. – inckka

0

Bu kod parçası çalışır. Bu Angus Comber gelen cevap dayanmaktadır: http://man7.org/linux/man-pages/man3/ftime.3.html, filt z göre

#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 
} 
İlgili konular