chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

【經(jīng)驗分享】使用gettimeofday為你的程序運行時間做統(tǒng)計

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-12-07 09:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

1 需求背景

2 簡要分析

2.1 算法分析

2.2 gettimeofday簡介

3 源碼實現(xiàn)

3.1 參考代碼

3.2 代碼簡介

3.3 代碼測試

4 小小總結(jié)

5 更多分享

1 需求背景

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

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

2 簡要分析

2.1 算法分析

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

根據(jù)這里方法論,我們可以比較快地實現(xiàn)邏輯代碼,但是我們應(yīng)該用哪個函數(shù)取當前時間點呢?

2.2 gettimeofday簡介

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

參考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用于獲取當前的時間是非常容易的,它會將時間結(jié)果存儲在這個結(jié)構(gòu)體中:

struct timeval {

** time_t tv_sec; /* seconds */

** suseconds_t tv_usec; /* microseconds / *

** };

struct timeval 結(jié)構(gòu)體中有 tv_sec 秒?yún)?shù) 和 tv_usec 微妙參數(shù),非常有利于我們做時間的加減計算。

下面我們就用這個函數(shù)來實現(xiàn)下本期的功能。

3 源碼實現(xiàn)

3.1 參考代碼

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

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

3.2 代碼簡介

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

值得注意的是,雖然gettimeofday在結(jié)構(gòu)體定義上 【號稱】有微妙級的精度,但是實際大部分的平臺是沒法達到這樣的精度的,所以我們?nèi)∑渲?,轉(zhuǎn)換成毫秒級的精度,這個已經(jīng)滿足我們絕大多數(shù)應(yīng)用場景了。

3.3 代碼測試

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

#include 
 #include 
 #include 
 #include 
 ?
 static int get_cur_time_ms(void)
 {
     struct timeval tv;
 ?
     gettimeofday(&tv, NULL);  //使用gettimeofday獲取當前系統(tǒng)時間
 ?
     return (tv.tv_sec * 1000 + tv.tv_usec / 1000); //利用struct timeval結(jié)構(gòu)體將時間轉(zhuǎn)換為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; //取隨機數(shù),并保證數(shù)在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個隨機數(shù)的耗時情況。

image-20221205132449215

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

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

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

image-20221205132334585

4 小小總結(jié)

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

5 更多分享

[架構(gòu)師李肯]

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

審核編輯:湯梓紅

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

    關(guān)注

    32

    文章

    1615

    瀏覽量

    44913
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何縮短Vivado的運行時間

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

    獲取單片機運行時間

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

    如何檢查Linux服務(wù)器的運行時間

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

    使用Nuclei Studio IDE計算程序運行時間

    在使用Nuclei Studio IDE進行程序運行時,我們想知道我們編寫的程序運行時間有多長怎么辦呢?可以選擇調(diào)用IDE里面時間記錄函數(shù)_
    發(fā)表于 10-28 08:25

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

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

    CCS 程序時間統(tǒng)計

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

    LabVIEW程序運行時間與循環(huán)時間沖突

    的是:1,如何使循環(huán)讀取的時間運行時間一致; 2,使用定時循環(huán)結(jié)構(gòu)設(shè)定循環(huán)時間為什么不能達到循環(huán)時間運行時間一致。
    發(fā)表于 11-30 14:24

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

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

    如何用SysTick實現(xiàn)測量程序運行時間

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

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

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

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

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

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

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

    ch32v307記錄程序運行時間

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

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

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

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

    具有重要意義。本文將詳細介紹如何使用三菱PLC編程實現(xiàn)累計運行時間統(tǒng)計功能。 一、概述 累計運行時間是指設(shè)備或系統(tǒng)在一定時間內(nèi)的總運行時間
    的頭像 發(fā)表于 06-20 11:31 ?4987次閱讀