在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【經驗分享】使用gettimeofday為你的程序運行時間做統計

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-12-07 09:00 ? 次閱讀

C語言進階】使用gettimeofday為你的程序運行時間做統計

有時候在編程調試的時候,會遇到個別性能問題需要調試,這時候我們需要比較精確地統計每段代碼的耗時情況,這種情況下,你是怎么做的呢?本文介紹一種方法來實現此功能。

1 需求背景

2 簡要分析

2.1 算法分析

2.2 gettimeofday簡介

3 源碼實現

3.1 參考代碼

3.2 代碼簡介

3.3 代碼測試

4 小小總結

5 更多分享

1 需求背景

在項目編程中,如果遇到調試代碼性能的時候,慢慢需要加時戳來觀察,找出那些耗時的操作。這種情況大部分需要人工干涉,如果我們需要程序自動幫忙完成耗時分析呢?我們可以怎么做呢?

本文就這個場景問題,提供一種解決方案,歡迎大家參考。

2 簡要分析

2.1 算法分析

根據我們的常識,我們知道,要想知道一個操作的耗時,一般的做法就是在操作前取一個時間,然后操作后取一個時間;最后兩個時間相減,得到的就是這段操作的耗時。

根據這里方法論,我們可以比較快地實現邏輯代碼,但是我們應該用哪個函數取當前時間點呢?

2.2 gettimeofday簡介

Linux C語言編程中,我們很容易會想到gettimeofday這個函數,下面我們將簡單介紹一下這個函數。

參考Linux下的man說明,如下:

GETTIMEOFDAY(2) Linux Programmer's Manual GETTIMEOFDAY(2)

NAME

** gettimeofday, settimeofday - get / set time**

SYNOPSIS

** #include **

int gettimeofday(struct timeval *tv, struct timezone *tz);
 ?
 int settimeofday(const struct timeval *tv, const struct timezone *tz);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

settimeofday():
     Since glibc 2.19:
         _DEFAULT_SOURCE
     Glibc 2.19 and earlier:
         _BSD_SOURCE

DESCRIPTION

** The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.**

The tv argument is a struct timeval (as specified in ):
 ?
     struct timeval {
         time_t      tv_sec;     /* seconds */
         suseconds_t tv_usec;    /* microseconds */
     };
 ?
 and gives the number of seconds and microseconds since the Epoch (see time(2)).
 ?
 The tz argument is a struct timezone:
 ?
     struct timezone {
         int tz_minuteswest;     /* minutes west of Greenwich */
         int tz_dsttime;         /* type of DST correction */
     };
 ?
 If either tv or tz is NULL, the corresponding structure is not set or returned.  (However, compilation warnings will result if tv is NULL.)
 ?
 The use of the timezone structure is obsolete; the tz argument should normally be specified as NULL.  (See NOTES below.)
 ?
 Under  Linux,  there are some peculiar "warp clock" semantics associated with the settimeofday() system call if on the very first call (after booting) that has a non-NULL tz argument,
 the tv argument is NULL and the tz_minuteswest field is nonzero.  (The tz_dsttime field should be zero for this case.)  In such a case it is assumed that the CMOS clock  is  on  local
 time, and that it has to be incremented by this amount to get UTC system time.  No doubt it is a bad idea to use this feature.

RETURN VALUE

** gettimeofday() and settimeofday() return 0 for success, or -1 for failure (in which case errno is set appropriately).**

從這里我們可以知道,gettimeofday用于獲取當前的時間是非常容易的,它會將時間結果存儲在這個結構體中:

struct timeval {

** time_t tv_sec; /* seconds */

** suseconds_t tv_usec; /* microseconds / *

** };

struct timeval 結構體中有 tv_sec 秒參數 和 tv_usec 微妙參數,非常有利于我們做時間的加減計算。

下面我們就用這個函數來實現下本期的功能。

3 源碼實現

3.1 參考代碼

本例給出一個參考代碼如下:

#include 
 #include 
 #include 
 #include 
 ?
 static int get_cur_time_ms(void)
 {
     struct timeval tv;
 ?
     gettimeofday(&tv, NULL);  //使用gettimeofday獲取當前系統時間
 ?
     return (tv.tv_sec * 1000 + tv.tv_usec / 1000); //利用struct timeval結構體將時間轉換為ms
 }
 ?

3.2 代碼簡介

代碼的功能邏輯,正如上面 的函數描述所說,正是利用gettimeofday返回的struct timeval結構內的成員變量,通過秒、毫秒、微妙的數量轉換,將當前時間轉換成毫秒,然后以函數返回值的形式輸出。

值得注意的是,雖然gettimeofday在結構體定義上 【號稱】有微妙級的精度,但是實際大部分的平臺是沒法達到這樣的精度的,所以我們取其中,轉換成毫秒級的精度,這個已經滿足我們絕大多數應用場景了。

3.3 代碼測試

針對上面的功能代碼,寫了一段小代碼來測試下。

#include 
 #include 
 #include 
 #include 
 ?
 static int get_cur_time_ms(void)
 {
     struct timeval tv;
 ?
     gettimeofday(&tv, NULL);  //使用gettimeofday獲取當前系統時間
 ?
     return (tv.tv_sec * 1000 + tv.tv_usec / 1000); //利用struct timeval結構體將時間轉換為ms
 }
 ?
 static void get_rand_bytes(unsigned char *data, int len)
 {
     int a;
     int i;
 ?
     srand((unsigned)time(NULL)); //種下隨機種子
     for (i = 0; i < len; i++) {
         data[i] = rand() % 255; //取隨機數,并保證數在0-255之間
         //printf("%02X ", data[i]);
     }  
 }
 ?
 int main(int argc, const char **argv)
 {
     int t1;
     int t2;
     unsigned char data[1024000];
 ?
     t1 = get_cur_time_ms();
     get_rand_bytes(data, sizeof(data));
     t2 = get_cur_time_ms();
     printf("random %d bytes, waste time: %dms
", sizeof(data), t2 - t1); //打印耗時
 ?
     return 0;
 }
 ?

以下測試代碼的邏輯還是很簡單的,主要就是測試獲取 1024000個隨機數的耗時情況。

image-20221205132449215

由于我本次測試使用的PC主機,其性能還是不錯,所以測試出來的數據,還是耗時比較小的;如果這段代碼放在嵌入式平臺去運行的話,一個可能data數組的內存會爆,第二個耗時可能會大大增加。

感興趣的朋友可以拿去一試。

注,本次測試的PC機情況如下:

image-20221205132334585

4 小小總結

  • 面對需求說明,盡快找到核心的功能要點,找到算法邏輯是關鍵;
  • 明白要做什么,再去選擇合適的函數來滿足功能邏輯,這是比較好的思路;
  • 考慮到gettimeofday的實際精度問題,犧牲部分不起眼的精度,依然可以滿足大部分的需求。

5 更多分享

[架構師李肯]

架構師李肯全網同名 ),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲[CSDN博客專家]、[CSDN物聯網領域優質創作者]、[2021年度CSDN&RT-Thread技術社區之星]、[2022年RT-Thread全球技術大會講師]、[RT-Thread官方嵌入式開源社區認證專家]、[RT-Thread 2021年度論壇之星TOP4]、[華為云云享專家(嵌入式物聯網架構設計師)]等榮譽。堅信【知識改變命運,技術改變世界】!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RT-Thread
    +關注

    關注

    31

    文章

    1300

    瀏覽量

    40264
收藏 人收藏

    評論

    相關推薦

    如何縮短Vivado的運行時間

    在Vivado Implementation階段,有時是有必要分析一下什么原因導致運行時間(runtime)過長,從而找到一些方法來縮短運行時間
    的頭像 發表于 05-29 14:37 ?1.4w次閱讀
    如何縮短Vivado的<b class='flag-5'>運行時間</b>

    獲取單片機運行時間

    的開始階段使單片機的一個GPIO輸出高電平,在待測程序段的結尾階段再令這個GPIO輸出低電平。用示波器通過檢查高電平的時間長度,就知道了這段代碼的運行時間。顯然,借助于示波器的方法更為簡便。 以下內容
    的頭像 發表于 08-26 20:26 ?1887次閱讀
    獲取單片機<b class='flag-5'>運行時間</b>

    如何檢查Linux服務器的運行時間

    Linux 中的 uptime 用于查看系統啟動后的運行時間。它是一個比較簡單的 Linux 命令,可以不帶參數直接運行。
    發表于 11-25 15:25 ?1.5w次閱讀
    如何檢查Linux服務器的<b class='flag-5'>運行時間</b>

    labview如何實時獲取程序運行時間!?。。?/a>

    我們在做一個交通燈系統,(交通燈倒計時時間用做的數碼管顯示)當數碼管顯示3,2,1時,交通燈要亮黃燈,我做了一個條件語句,當時間在0~3之間時亮黃燈,否則其他燈亮。。但是不知道怎么獲取程序運行
    發表于 12-26 00:30

    CCS 程序時間統計

    請教關于CCS 程序時間統計的問題: 能否指導simulator和emulator下各自測試代碼運行時間的具體方法(程序實例或文檔),所給的方法能客觀地度量
    發表于 06-24 02:07

    LabVIEW程序運行時間與循環時間沖突

    的是:1,如何使循環讀取的時間運行時間一致; 2,使用定時循環結構設定循環時間為什么不能達到循環時間運行時間一致。
    發表于 11-30 14:24

    C語言教程之顯示程序運行時間

    C語言教程之顯示程序運行時間,很好的C語言資料,快來學習吧。
    發表于 04-25 16:09 ?0次下載

    如何用SysTick實現測量程序運行時間

    在實際的項目開發過程中,常常遇到需要得到一段代碼的運行時間,通常的方法是用示波器來測量,這篇博文將用 SysTick 來實現 精確測量 程序運行時間。 STM32F4 的內核定時
    的頭像 發表于 05-09 14:07 ?6082次閱讀
    如何用SysTick實現測量<b class='flag-5'>程序</b><b class='flag-5'>運行時間</b>

    電機運行時間進行排列 是分為兩個部分來完成這個程序的設計的

    前幾天有個學員咨詢一個程序設計的問題,程序的控制要求如下:需要控制5臺電機的運行,每臺電機運行時需要記錄運行時間,電機啟動
    的頭像 發表于 07-19 08:57 ?7235次閱讀
    電機<b class='flag-5'>運行時間</b>進行排列 是分為兩個部分來完成這個<b class='flag-5'>程序</b>的設計的

    如何高效測量ECU的運行時間

    ,最終可能會引起運行時間方面的問題。這在項目后期需要大量的時間和金錢來解決。如果不能掌握系統的運行狀態,則很難發現系統內缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測量標定硬件相結合,可同步分析 ECU內部
    的頭像 發表于 10-28 11:05 ?2269次閱讀

    淺析STM32代碼運行時間的技巧

    前言 ????測試代碼的運行時間的兩種方法: 使用單片機內部定時器,在待測程序段的開始啟動定時器,在待測程序段的結尾關閉定時器。為了測量的準確性,要進行多次測量,并進行平均取值。 借助示波器的方法
    的頭像 發表于 11-09 09:52 ?3935次閱讀
    淺析STM32代碼<b class='flag-5'>運行時間</b>的技巧

    ch32v307記錄程序運行時間

    ch32v307記錄程序運行時間程序開發中,很重要的一項任務就是對程序運行時間進行評估。對于大型的
    的頭像 發表于 08-22 15:53 ?933次閱讀

    西門子SCL編程50臺電機運行時間累計方法

    當RUN信號為TRUE時,開始計時,FALSE時停止計時,單次運行時間清零,長按RESET5秒時,單次和總運行時間都清零。
    發表于 11-27 09:59 ?1980次閱讀
    西門子SCL編程50臺電機<b class='flag-5'>運行時間</b>累計方法

    jvm運行時內存區域劃分

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是Java編程語言的運行環境。JVM的主要功能是將Java源代碼轉換為機器代碼,并且在運行時管理Java程序的內存。JVM
    的頭像 發表于 12-05 14:08 ?554次閱讀

    三菱plc累計運行時間怎么編程

    具有重要意義。本文將詳細介紹如何使用三菱PLC編程實現累計運行時間統計功能。 一、概述 累計運行時間是指設備或系統在一定時間內的總運行時間
    的頭像 發表于 06-20 11:31 ?2418次閱讀
    主站蜘蛛池模板: 日韩av线观看| 免费看一级视频| 一品毛片| 亚洲电影一区二区三区| 亚洲成电影| 天天色爱| 欧美精品亚洲网站| 黄色一级片在线观看| 岛国最新资源网站| 亚洲69视频| 免费看美女午夜大片| 1024国产基地永久免费| 在线观看免费视频一区| 在线黄色免费| 日本免费色| 国产偷窥女洗浴在线观看亚洲| 97av在线播放| 免费国产不卡午夜福在线观看| 午夜黄色网| 久久思re热9一区二区三区| 伊人久久综合成人网小说| 色综合久久久久久久久久久| 欧美精品啪啪| 97久久伊人精品影院| 免费人成网站永久| 国产精品臀控福利在线观看| 成人国产三级精品| 色播久久| 国产福利你懂的| 男女性高爱麻豆| 69日本人xxxx16-18| 羞羞爱爱| 狠狠做深爱婷婷久久一区| 亚洲色五月| 欧美黄免在线播放| 一色屋免费视频| 免费色视频| 天堂中文最新版www| 一区二区三区高清在线| 婷婷亚洲五月| 国产成人三级|