1. linux系統 下 如何讓C語言sleep()函數等待時間小於1秒
#include <unistd.h> // 頭文件
int usleep(useconds_t usec); // 函數原型
usec -- 毫秒。整數。最大允許值:小於 1000000
返回 0 -- 表示回調用執行成功,1 -- 失敗。答
2. linux下寫個C語言程序,要求有0.5微秒以下的延時,要怎樣寫
系統沒有提供微秒級以下的延時
你可以用for循環自己做。
不過 具體for循環能延時多久
就要靠你自己試驗了。
3. linux下,記錄響應時間的腳本,精確到毫秒ms
執行前、執行後獲取兩次時間戳相減吧。
不過 Linux 貌似伺服器版、普通桌面版的時鍾精確度不是很高。
4. 如何計算linux下C程序的運行時間用time ./abc 這個得到的都是什麼時間呢
不知道你是不是學習編程的,如果不是就沒必要看了。
1.PID是進程標識號,它是一版個進程的唯一性標識。PPID是該進權程父進程的進程標識號。
2.fork和exec和pid完全就是2件事情不能混為一談。fork是一個linux庫函數。他是用來創建一個新的進程。至於exec是一個系列函數,C標准庫函數,用來改變進程上下文的。2者結合使用可以創建一個新的進程。
3.如果創建新的進程,一般是用fork,他會返回這個被創建進程的PID,你可以通過PID找到這個進程。
5. C語言中怎樣測試函數執行時間
有4種方法可以達成測算程序運行時間的目的。
它們分別是使用clock, times, gettimeofday, getrusage來實現的。
下面就來逐一介紹,並比較它們的優劣點。
系統測試環境:
VirtualBox (Ubuntu 9.10)
gcc version 4.4.1
libc6 2.10.1-0ubuntu16
Core Duo T2500 2GMHz
常式如下:
只要修改第11行的定義值,就可以使用不同的測量方法了。
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#define TEST_BY_CLOCK (char)(0x00)
#define TEST_BY_TIMES (char)(0x01)
#define TEST_BY_GETTIMEOFDAY (char)(0x02)
#define TEST_BY_GETRUSAGE (char)(0x03)
#define TEST_METHOD (TEST_BY_GETTIMEOFDAY)
#define COORDINATION_X (int)(1024)
#define COORDINATION_Y (int)(1024)
static int g_Matrix[COORDINATION_X][COORDINATION_Y];
double getTimeval()
{
struct rusage stRusage;
struct timeval stTimeval;
if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
gettimeofday(&stTimeval, NULL);
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
getrusage(RUSAGE_SELF, &stRusage);
stTimeval = stRusage.ru_utime;
}
return stTimeval.tv_sec + (double)stTimeval.tv_usec*1E-6;
}
int main()
{
int i, j;
int n = 0;
clock_t clockT1, clockT2;
double doubleT1, doubleT2;
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT1 = clock();
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(&clockT1);
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT1 = getTimeval();
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT1 = getTimeval();
}
for (i = 0; i < COORDINATION_X; i++)
{
for (j = 0; j < COORDINATION_Y; j++)
{
g_Matrix[i][j] = i * j;
}
}
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT2 = clock();
printf("Time result tested by clock = %10.30f\n",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(&clockT2);
printf("Time result tested by times = %10.30f\n", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT2 = getTimeval();
printf("Time result tested by gettimeofday = %10.30f\n",(double)(doubleT2 - doubleT1));
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT2 = getTimeval();
printf("Time result tested by getrusage = %10.70f\n", (double)(doubleT2 - doubleT1));
}
return 0;
}
1. 使用clock的方法:
clock是ANSI C的標准庫函數,關於這個函數需要說明幾點。
首先,它返回的是CPU耗費在本程序上的時間。也就是說,途中sleep的話,由於CPU資源被釋放,那段時間將不被計算在內。
其次,得到的返回值其實就是耗費在本程序上的CPU時間片的數量,也就是Clock Tick的值。該值必須除以CLOCKS_PER_SEC這個宏值,才
能最後得到ss.mmnn格式的運行時間。在POSIX兼容系統中,CLOCKS_PER_SEC的值為1,000,000的,也就是
1MHz。
最後,使用這個函數能達到的精度大約為10ms。
2. 使用times的方法:
times的用法基本和clock類似,同樣是取得CPU時間片的數量,所不同的是要除以的時間單位值為sysconf(_SC_CLK_TCK)。
3. 使用gettimeofday的方法:
用gettimeofday直接提取硬體時鍾進行運算,得到的結果的精度相比前兩種方法提高了很多。
但是也正由於它提取硬體時鍾的原因,這個方法只能計算程序開始時間和結束時間的差值。而此時系統中如果在運行其他的後台程序,可能會影響到最終結果的值。如果後台繁忙,系統dispatch過多的話,並不能完全真實反映被測量函數的運行時間。
4. 使用getrusage的方法:
getrusage得到的是程序對系統資源的佔用信息。只要指定了RUSAGE_SELF,就可以得到程序本身運行所佔用的系統時間。
6. 在linux下,怎麼統計一個代碼段的執行時間
開頭和結尾都輸出date +%s時間戳,然後相減
7. Linux下C語言獲得系統時間的方法
沒有完整程序, 不過能提供一點資料
int gettimeofday(struct timeval * tv,struct timezone *tz);
這個函數可以獲取當前時間, 貌似只要第一個結構體就行了
struct timeval
{
time_t tv_sec; //秒 [long int]
suseconds_t tv_usec; //微秒 [long int], (10E-6 second)
};
struct timeval
{
long tv_sec;
long tv_usec;
};
然後取微秒的前三位就是小數了, 之後把秒 tv_sec 轉化為 tm 格式, 參數用秒的指針就行
struct tm * gmtime(const time_t * t);
//轉換成格林威治時間。有時稱為GMT或UTC。
struct tm * localtime(const time_t *t);
//轉換成本地時間。它可以透過修改TZ環境變數來在一台機器中,不同使用者表示不同時間.
下面是tm的部分參數
int tm_sec; //tm_sec表「秒」數,在[0,61]之間,多出來的兩秒是用來處理跳秒問題用的。/* Seconds: 0-59 (K&R says 0-61?) */
int tm_min; //tm_min表「分」數,在[0,59]之間。
int tm_hour; //tm_hour表「時」數,在[0,23]之間。
int tm_mday; //tm_mday表「本月第幾日」,在[1,31]之間。
int tm_mon; //tm_mon表「本年第幾月」,在[0,11]之間。
int tm_year; //tm_year要加1900表示那一年。 /* /* 年份,其值從1900開始 */*/
int tm_wday; //tm_wday表「本周第幾日」,在[0,6]之間。 /* Days since Sunday (0-6) */ /*其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; //tm_yday表「本年第幾日」,在[0,365]之間,閏年有366日。 /*其中0代表1月1日,1代表1月2日,以此類推 */*/
int tm_isdst; //tm_isdst表是否為「日光節約時間」
------------------------------華麗麗的分割線--------------------------------------------------
由於很長時間沒編程了, 也沒有Linux環境, 我就簡單寫幾行代碼, 僅作參考
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include<unistd.h>
//這四個不一定夠用了
struct timeval tv;
struct timezone tz;
struct tm * p_tm;
//變數沒有初始化習慣不好,不要學
gettimeofday(&tv, &tz);
p_tm = gmtime( (const time_t *)&tv.tv_sec );
字元串的組裝尤其格式問題自己解決吧
年 p_tm->tm_year+ 1900
月 p_tm->tm_mon+ 1
日 p_tm->tm_mday
時 p_tm->tm_hour+ 1
分 p_tm->tm_min+ 1
秒 p_tm->tm_sec+ 1
小數點後面的部分,注意不夠三位還是前面填充0 tv.tv_sec/1000
8. Linux在終端運行C程序,怎麼計算運行的時間
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main( void )
{
long i = 10000000L;
clock_t start, finish;
double ration;
start = clock();
while( i-- );
finish = clock();
ration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "程序運行 %f 秒\n", ration );
}
9. c語言如何計時
C語言中提供了許多庫函數來實現計時功能
下面介紹一些常用的計時函數
1. time()
頭文件:.h
函數原型:time_t time(time_t * timer)
功能:返回以格林尼治時間(GMT)為標准,從1970年1月1日00:00:00到現在的時此刻所經過的秒數
用time()函數結合其他函數(如:localtime、gmtime、asctime、ctime)可以獲得當前系統時間或是標准時間。
用difftime函數可以計算兩個time_t類型的時間的差值,可以用於計時。用difftime(t2,t1)要比t2-t1更准確,因為C標准中並沒有規定time_t的單位一定是秒,而difftime會根據機器進行轉換,更可靠。
說明:C標准庫中的函數,可移植性最好,性能也很穩定,但精度太低,只能精確到秒,對於一般的事件計時還算夠用,而對運算時間的計時就明顯不夠用了。
2. clock()
頭文件:time.h
函數原型:clock_t clock(void);
功能:該函數返回值是硬體滴答數,要換算成秒,需要除以CLK_TCK或者 CLK_TCKCLOCKS_PER_SEC。比如,在VC++6.0下,這兩個量的值都是1000。
說明:可以精確到毫秒,適合一般場合的使用。
3. timeGetTime()
頭文件:Mmsystem.h引用庫: Winmm.lib
函數原型:DWORD timeGetTime(VOID);
功能:返回系統時間,以毫秒為單位。系統時間是從系統啟動到調用函數時所經過的毫秒數。注意,這個值是32位的,會在0到2^32之間循環,約49.71天。
說明:該函數的時間精度是五毫秒或更大一些,這取決於機器的性能。可用timeBeginPeriod和timeEndPeriod函數提高timeGetTime函數的精度。如果使用了,連續調用timeGetTime函數,一系列返回值的差異由timeBeginPeriod和timeEndPeriod決定。
4. GetTickCount()
頭文件:windows.h
函數原型:DWORD WINAPI GetTickCount(void);
功能:返回自設備啟動後的毫秒數(不含系統暫停時間)。
說明:精確到毫秒。對於一般的實時控制,使用GetTickCount()函數就可以滿足精度要求。
5. QueryPerformanceCounter()、QueryPerformanceFrequency()
頭文件:windows.h
函數原型:BOOLQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
功能:前者獲得的是CPU從開機以來執行的時鍾周期數。後者用於獲得你的機器一秒鍾執行多少次,就是你的時鍾周期。
補充:LARGE_INTEGER既可以是一個8位元組長的整型數,也可以是兩個4位元組長的整型數的聯合結構, 其具體用法根據編譯器是否支持64位而定:
在進行定時之前,先調用QueryPerformanceFrequency()函數獲得機器內部定時器的時鍾頻率,然後在需要嚴格定時的事件發生之前和發生之後分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差及時鍾頻率,計算出事件經歷的精確時間。
說明:這種方法的定時誤差不超過1微秒,精度與CPU等機器配置有關,一般認為精度為透微秒級。在Windows平台下進行高精度計時的時候可以考慮這種方法。
6. gettimeofday()
Linux C函數。
頭文件:sys/time.h
函數原型:int gettimeofday(struct timeval *tv,struct timezone *tz);
說明:其參數tv是保存獲取時間結果的結構體,參數tz用於保存時區結果(若不使用則傳入NULL即可)。
timeval的定義為:
structtimeval{
longtv_sec;//秒數
longtv_usec;//微秒數
}
可見該函數可用於在linux中獲得微秒精度的時間。
說明:使用這種方式計時,精度可達微秒。經驗證,在arm+linux的環境下此函數仍可使用。
10. 嵌入式Linux C語言關於clock函數返回值的單位是什麼毫秒,微秒,秒
See man page for clock() function