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

    文章

    44553

    浏览量

    634761
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114742
  • 回调函数
    +关注

    关注

    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 2438次阅读

    C语言转换工具函数有哪些

    如果只是单个十进制转字符串,使用sprintf函数就可以了。
    的头像 发表于 11-10 11:21 559次阅读

    瑞萨e2studio(11)----打印函数(printf、 sprintf)的实现

    本篇文章主要介绍如何使用e2studio对瑞萨单片机进行打印函数(printf、sprintf)的实现。
    的头像 发表于 11-15 11:09 2419次阅读
    瑞萨e2studio(11)----打印<b class='flag-5'>函数</b>(printf、 <b class='flag-5'>sprintf</b>)的实现

    瑞萨e2studio----打印函数(printf、sprintf)的实现

    本篇文章主要介绍如何使用e2studio对瑞萨单片机进行打印函数(printf、sprintf)的实现。
    的头像 发表于 11-02 17:35 1717次阅读
    瑞萨e2studio----打印<b class='flag-5'>函数</b>(printf、<b class='flag-5'>sprintf</b>)的实现