c語言計算程序的運行時間
⑴ c語言 如何顯示時間精確到毫秒
在C語言編程中,有人可能會疑惑為何不直接使用time函數來顯示時間,而選擇使用clock函數。其實,這是因為在標准C庫中,time函數只能提供秒級別的精度,而無法達到毫秒級別的精確度。相比之下,clock函數可以返回更精確的時間值,它以系統時鍾的時基為單位返回一個計數值,可以精確到毫秒甚至更小的時間間隔。
值得注意的是,clock函數返回的是一個計數值,而非實際的時間。這個計數值是以系統時鍾的時基為單位,表示程序執行時間的長短,而非實際的系統時間。在大多數操作系統中,這個時基為一個固定的單位,比如納秒,因此可以被用來計算程序的執行時間。
為了獲取實際的時間信息並精確到毫秒,可以結合time函數與ctime函數使用。time函數返回一個時間戳,表示自紀元以來的秒數。ctime函數可以將這個時間戳轉換為一個易讀的格式,但同樣只能精確到秒。因此,如果我們想獲取毫秒級別的精度,需要結合使用這兩個函數,並進行適當的轉換。
例如,可以使用time函數獲取當前時間的秒數,然後使用clock函數獲取程序執行的時間,最後將這兩個值結合,以毫秒為單位來表示時間。這需要進行一定的數學運算,但相比直接使用clock函數,這種方法可以提供更准確的時間信息。
總之,盡管clock函數能夠提供更高的時間精度,但在某些情況下,我們可能需要使用time和ctime函數來獲取精確到毫秒的時間信息。這取決於具體的應用場景和需求。總的來說,選擇哪種函數取決於我們想要獲取的時間信息的具體精度。
⑵ 關於C語言程序設計的計時器
C語言中的頭文件time.h中定義了庫函數clock(),
它返回的是從程序運行開始算起的時間,一時鍾周期為單位,
time.h還定義了符號:CLOCKS_PER_SEC,
即一秒鍾的時鍾周期。這樣就簡單了,
在頭文件中加入#include<time.h>,在程序main()主函數的開頭定義long now=0;
並給把clock()賦值給now,即now=clock();記錄程序開始時的時間,clock()會繼續增加,
但now已經確定為開始那一時刻clock()的值,
在程序結尾,算式clock()-now就是程序執行所需的時間,
但是是以時鍾周期為單位的,
如果想得到以秒為單位的時間只要輸出(clock()-now)/CLOCKS_PER_SEC就是了,
即在程序結尾添加
printf("%f",(clock()-now)/CLOCKS_PER_SEC);就可以了。
⑶ 單片機c語言程序執行時間
一個機器周期=12個時鍾周期=12*(1/(12*10^6))=1*10^-6 s即一個機器周期既是1微秒
如果用的是定時器或匯編語言 可以很精確的計算 單周期指令執行一次即1微秒
如果用C語言 只能估算也可以用keil模擬計算
大概是105微秒左右吧
⑷ c語言 時間函數
c語言時間函數:
1、獲得日歷時間函數:
可以通過time()函數來獲得日歷時間(Calendar Time),其原型為:time_t time(time_t * timer);
如果已經聲明了參數timer,可以從參數timer返回現在的日歷時間,同時也可以通過返回值返回現在的日歷時間,即從一個時間點(例如:1970年1月1日0時0分0秒)到現在此時的秒數。如果參數為空(NUL),函數將只通過返回值返回現在的日歷時間,比如下面這個例子用來顯示當前的日歷時間:
2、獲得日期和時間函數:
這里說的日期和時間就是平時所說的年、月、日、時、分、秒等信息。從第2節我們已經知道這些信息都保存在一個名為tm的結構體中,那麼如何將一個日歷時間保存為一個tm結構的對象呢?
其中可以使用的函數是gmtime()和localtime(),這兩個函數的原型為:
struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);
其中gmtime()函數是將日歷時間轉化為世界標准時間(即格林尼治時間),並返回一個tm結構體來保存這個時間,而localtime()函數是將日歷時間轉化為本地時間。比如現在用gmtime()函數獲得的世界標准時間是2005年7月30日7點18分20秒,那麼用localtime()函數在中國地區獲得的本地時間會比世界標准時間晚8個小時,即2005年7月30日15點18分20秒。
⑸ c語言計算時間總是為0
clock() 獲取毫秒。程序執行太快,時間差為0
這是用clock() 的例子:
void example_dt_ms()
{
clock_t tick1,tick2;
int i,j,k;
double dt;
tick1=clock(); //ms
//for (i=0;i<1000;i++) for (j=0;j<1000;j++) for (k=0;k<100;k++) {};
wait_ms(2000);
tick2=clock();
dt = (double) (tick2 - tick1);
printf("==============\nexample_dt_ms:\n");
printf("dt = %lf ms\n",dt);
}
精確計時間差:
用QueryPerformanceCounter()函數返回當時時鍾讀數,計時開始用它得啟改到開猜核始讀數,計時結束用它得到結束讀數,兩個數相減是時間差讀數。讀數轉換為時間,要用QueryPerformanceFrequency()函數獲得時鍾頻率,讀數除以時鍾頻率,得穗旁掘時間,單位是秒。乘1000得毫秒。據說,這種方法比較精確。
void accurate_dt_ms()
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
int executionTime;
double dt,d_freq,d_begin_t,d_end_t;
// Start of time interval
QueryPerformanceFrequency(&nFreq);
d_freq = (double) nFreq.QuadPart;
QueryPerformanceCounter(&nBeginTime);
// Any code
// ...
wait_ms(2000);
// End of time interval
QueryPerformanceCounter(&nEndTime);
// time interval in ms
executionTime = (nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / nFreq.QuadPart;
dt = (double) ((nEndTime.QuadPart - nBeginTime.QuadPart) * 1000) / d_freq;
printf("==============\naccurate_dt_ms:\n");
printf("dt=%d in ms or dt=%lf ms\n", executionTime,dt);
}
還有一種方法是用Pentium晶元匯編指令 0x0F 和 0x31,讀取時鍾計數圖章,類似QueryPerformanceCounter()函數,計時開始和結束分別調用一次,得讀數差,並扣除執行一次調用函數消耗的額外時間。讀數差怎樣轉化成時間是個問題,如果知道CPU速度可以算得時間,如果知道時間,可以估算CPU速度。子程序 get_CPU_speed() 計算CPU的速度,單位 百萬赫。
// Pentium instruction "Read Time Stamp Counter".
__forceinline unsigned _int64 My_clock(void)
{
_asm _emit 0x0F
_asm _emit 0x31
}
unsigned _int64 Start(void) { return My_clock();}
unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
{return My_clock()-m_start - m_overhead; }
void get_CPU_speed()
{
unsigned _int64 m_start=0, m_overhead=0;
unsigned int CPUSpeedMHz;
m_start = My_clock();
m_overhead = My_clock() - m_start - m_overhead;
printf("overhead for calling My_clock=%I64d\n", m_overhead);
m_start = My_clock();
wait_ms(2000);
CPUSpeedMHz=(unsigned int) ( (My_clock()- m_start - m_overhead) / 2000000);
printf("CPU_Speed_MHz: %u\n",CPUSpeedMHz);
}