色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

sprintf函數耗時是strcat函數的幾倍呢?

冬至子 ? 來源:一起學習軟硬件設計 ? 作者:哼唧狗 ? 2023-10-26 14:28 ? 次閱讀

我們在寫代碼的時候總是被領導告知 慎用sprintf函數 ,這個函數占用CPU時間較多,對于字符串拼接可以使用strcat函數替代(并未所有情形都可替代)。

可是艾兔還是好奇,這倆函數在耗時上到底有多大區別呢?

今天艾兔就親身測試一下。

為了易于分析,艾兔分別用sprintf和strcat、strcpy函數分別打印300個字符循環100次。然后利用單片機定時器計算三者的耗時。

下面是驗證代碼和結果。

while(1)里面進行計時并打印:

圖片

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  //WifiValue.WifiBreathingMode = 0xFF;
    int Count = 0;
    char buf[1000] = {0};
    while (1)
    {
    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 100; Count++)
    {
      //300個字符
      sprintf(buf,"%s","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");      
      buf[0] = 0;
    }
    printf("sprintf = %d msn",Time1_AtWifiReilDataSend_Ms);


    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 100; Count++)
    {
      //300個
      strcat(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcat = %d msn",Time1_AtWifiReilDataSend_Ms);


    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 100; Count++)
    {
      //300個
      strcpy(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcpy = %d msn",Time1_AtWifiReilDataSend_Ms);      
    while(1);


  /* USER CODE END WHILE */ 
  /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */


}

啟動定時器,每1ms進入中斷一次:

圖片

//定時器1中斷回調處理函數
uint16_t Time1_AtWifiReilDataSend_Ms = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim- >Instance == htim1.Instance)
    {
    Time1_AtWifiReilDataSend_Ms++;  
    }
}

測試結果:

圖片

**sprintf = 38 ms **

**strcat = 7 ms **

**strcpy = 7 ms **

結果表明分別 打印30000個字符 ,sprintf函數耗時是strcat和strcpy函數的5.43倍。

我們修改發送字符數進行進一步驗證:

我們測試50次循環循環,看看15000個字符的耗時對比。

while (1)
    {
    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 50; Count++)
    {
      //300個字符
      sprintf(buf,"%s","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");      
      buf[0] = 0;
    }
    printf("sprintf = %d ms ",Time1_AtWifiReilDataSend_Ms);

    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 50; Count++)
    {
      //300個
      strcat(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcat = %d ms ",Time1_AtWifiReilDataSend_Ms);

    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 50; Count++)
    {
      //300個
      strcpy(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcpy = %d ms ",Time1_AtWifiReilDataSend_Ms);    
    while(1);

  /* USER CODE END WHILE */ 
  /* USER CODE BEGIN 3 */
    }

圖片

**sprintf = 19 ms **

**strcat = 4 ms **

**strcpy = 3 ms **

結果表明分別 打印15000個字符 ,sprintf函數耗時是strcat和strcpy函數的4.75倍。

** 我們繼續測試10次循環循環,看看3000個字符的耗時對比。**

while (1)
    {
    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 10; Count++)
    {
      //300個字符
      sprintf(buf,"%s","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");      
      buf[0] = 0;
    }
    printf("sprintf = %d ms ",Time1_AtWifiReilDataSend_Ms);

    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 10; Count++)
    {
      //300個
      strcat(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcat = %d ms ",Time1_AtWifiReilDataSend_Ms);

    Time1_AtWifiReilDataSend_Ms = 0;
    for(Count = 0; Count < 10; Count++)
    {
      //300個
      strcpy(buf,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");
      buf[0] = 0;
    }  
    printf("strcpy = %d ms ",Time1_AtWifiReilDataSend_Ms);    
    while(1);

  /* USER CODE END WHILE */ 
  /* USER CODE BEGIN 3 */
    }

圖片

**sprintf = 4ms **

**strcat = 1 ms **

**strcpy = 1 ms **

結果表明分別打印3000個字符 ,sprintf函數耗時是strcat和strcpy函數的4倍。

結論:

因此在程序使用中如果只是對很少字符串進行操作,比如幾十個,用哪個函數差別不大,但是如果對幾百個字符、甚至上個字符的組包還是要考慮一下的。

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

    關注

    6035

    文章

    44554

    瀏覽量

    634653
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114720
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11554
  • sprintf函數
    +關注

    關注

    0

    文章

    3

    瀏覽量

    6260
  • 定時器中斷
    +關注

    關注

    0

    文章

    49

    瀏覽量

    11167
收藏 人收藏

    評論

    相關推薦

    帶你解析字符串連接函數strcat_s函數

    strcat_s函數strcat函數一樣,主要用于字符串拼接。
    發表于 11-01 11:28 ?894次閱讀

    C語言帶你解析字符串連接函數strcat_s函數

    strcat_s函數strcat函數一樣,主要用于字符串拼接。
    發表于 11-03 10:22 ?981次閱讀

    sprintf函數和STemwin里的GUI_TOUCH_Exec()函數起沖突是什么原因導致的?

    有個新問題請教,我要是用 sprintf顯示字符,為什么%d,%s都可以,而%f一直都是0.000000? 后來發現是調用stemwin里的GUI_TOUCH_Exec()函數有沖突,當不調
    發表于 05-06 08:14

    sprintf函數跑飛該怎么辦?

    在寫程序時用到了sprintf函數,但不太會用,程序運行到sprintf函數時跑飛了,不知道什么問題,望各位大神指點一二,感激不盡!具體如下:1.圖1中想通過
    發表于 10-16 04:36

    關于sprintf()函數的用法

    一、關于sprintf()函數的用法sprintf(),指的是字符串格式化函數,把格式化的數據寫入某個字符串中。int sprintf(ch
    發表于 08-23 07:10

    sprintf與printf函數的區別

    單片機中Sprint函數:說明1:使用該函數時必須包含stdio.h頭文件,否則容易卡死程序說明2:sprintf與printf函數的區別:二者功能相似,但是
    發表于 08-23 06:18

    怎樣使用Sprintf函數去代替printf函數

    為什么要去重定義Sprintf函數?怎樣使用Sprintf函數去代替printf函數
    發表于 11-30 07:32

    為什么使用printf或sprintf會出現程序在中斷服務函數中卡死的現象

    為什么使用printf或sprintf會出現程序在中斷服務函數中卡死的現象?有何解決辦法?
    發表于 12-01 07:24

    sprintf函數詳細解釋

    sprintf函數詳細解釋.
    發表于 04-16 14:18 ?59次下載

    sprintf函數原型_sprintf用法

    sprintf指的是字符串格式化命令,主要功能是把格式化的數據寫入某個字符串中。sprintf 是個變參函數。使用sprintf 對于寫入buffer的字符數是沒有限制的,這就存在了b
    發表于 11-28 09:26 ?1.5w次閱讀
    <b class='flag-5'>sprintf</b><b class='flag-5'>函數</b>原型_<b class='flag-5'>sprintf</b>用法

    sprintf函數的用法_sprintf函數的實例

    sprintf指的是字符串格式化命令,主要功能是把格式化的數據寫入某個字符串中。sprintf 是個變參函數。使用sprintf 對于寫入buffer的字符數是沒有限制的,這就存在了b
    發表于 11-28 09:51 ?11.3w次閱讀
    <b class='flag-5'>sprintf</b><b class='flag-5'>函數</b>的用法_<b class='flag-5'>sprintf</b><b class='flag-5'>函數</b>的實例

    C語言模擬實現strcat函數

    C語言模擬實現strcat函數
    的頭像 發表于 06-29 16:18 ?2435次閱讀

    C語言轉換工具函數有哪些

    如果只是單個十進制轉字符串,使用sprintf函數就可以了。
    的頭像 發表于 11-10 11:21 ?558次閱讀

    瑞薩e2studio(11)----打印函數(printf、 sprintf)的實現

    本篇文章主要介紹如何使用e2studio對瑞薩單片機進行打印函數(printf、sprintf)的實現。
    的頭像 發表于 11-15 11:09 ?2417次閱讀
    瑞薩e2studio(11)----打印<b class='flag-5'>函數</b>(printf、 <b class='flag-5'>sprintf</b>)的實現

    瑞薩e2studio----打印函數(printf、sprintf)的實現

    本篇文章主要介紹如何使用e2studio對瑞薩單片機進行打印函數(printf、sprintf)的實現。
    的頭像 發表于 11-02 17:35 ?1714次閱讀
    瑞薩e2studio----打印<b class='flag-5'>函數</b>(printf、<b class='flag-5'>sprintf</b>)的實現
    主站蜘蛛池模板: 天美传媒果冻传媒入口视频| 高清国产mv视频在线观看| 色久久综合视频本道88| 久久精品国产欧美| FREE性丰满HD毛多多| 娇小8一12xxxx第一次| 顶级少妇AAAAABBBBB片| 5580免费午夜福利院| 亚洲精品成人A8198A片漫画| 无码日韩人妻精品久久蜜桃免费| 免费人成在线观看视频不卡| 久久精品成人免费看| 国产精品无码AV天天爽人妻蜜桃| asian极品呦女xx农村| 2020精品国产视| 在线成 人av影院| 亚洲精品成人AV在线观看爽翻| 外女思春台湾三级| 日韩欧美精品有码在线播放免费| 欧美精品亚洲精品日韩专区一| 九九精品视频一区二区三区| 黑色丝袜在线观看| 国产免费变态视频网址网站| 国产成人无码一区AV在线观看 | 精品亚洲欧美中文字幕在线看| 国产成人精品精品欧美| 达达兔欧美午夜国产亚洲| 把极品白丝老师啪到腿软| 成人无码在线视频区| 国产Av男人的天堂精品良久| 高H短篇辣肉纯肉| 国产精品麻豆高潮刺激A片| 国产成人精品在视频| 国产精品高清视频在线| 国产99久久九九免费精品无码 | 亚洲国产精品一区二区三区在线观看 | 亚洲女人网| 亚洲一二三产品区别在哪里| 伊人久久综合热青草| 中文成人在线| OLDMAN老头456 TUBE|