C语言的sprintf和snprintf将变量格式化输出到内存buffer,其功能强大,用起来很方便。但sprintf系列函数的运行效率低下,主要包括四方面的原因:格式字符串解析、变参处理、locale(本地化)支持和通用(如对齐、填充、精度、宽度等)导致的复杂性。

在FastDFS和FastCFS项目中,我们将低效的sprintf和snprintf改造为高效的字符串拼接方式。因为C标准库没有提供itoa(整数转换为字符串)和ftoa(浮点数转换为字符串)这样的转换函数,我们在基础库libfastcommon中实现了fc_itoa、fc_ftoa和fc_ltostr_ex、int2hex和int2HEX等函数,这些函数均返回转换后的字符串长度。其中fc_itoa和fc_ftoa转换后的字符串不以'\0'结尾,而fc_ltostr_ex是fc_itoa的加强版,支持以'0'补齐长度,且转换后的字符串以'\0'结尾。

fc_itoa根据传入的整数大小折半查找确认输出的字符串长度,因此不需要传统的字符串逆转操作。经实测,性能大约是sprintf的6倍。

fc_ftoa支持小数点后的保留位数,和sprintf一样采用四舍五入的做法。经实测,fc_ftoa性能大约是sprintf的25倍。

int2hex转换为小写字母的十六进制字符串,而int2HEX转换为大写字母的十六进制字符串。int2hex系列函数支持前导'0'补齐,对应sprintf的格式修饰符为%0#x,其中#为对齐位数,比如 %08x。经实测,int2hex性能大约是sprintf的7倍。

为了提高替换sprintf和snprintf的代码改造效率,libfastcommon中还封装了如下函数:fc_combine_two_strings、fc_get_full_filename、fc_get_one_subdir_full_filename和fc_get_two_subdirs_full_filename等,欢迎大家观摩。

fc_itoa、fc_ftoa、fc_ltostr_ex和int2hex等转换函数在shared_func.h和shared_func.c中实现。fc_itoa、fc_ftoa、int2hex和sprintf的性能对比测试源码为 libfastcommon/src/tests/test_fast_buffer.c,感兴趣的朋友可以把玩一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98783.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98783.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98783.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【知识堂】制造业与物流数字化全景图:系统缩写大全与专业名词速查手册

前言在制造业和物流行业的数字化转型过程中,我们经常会接触到大量的 系统缩写(如 ERP、MES、WMS…)和 专业名词(如 AGV、BOM、LOT…)。 这些缩写往往让刚入行的人“一头雾水”,即使是有经验的从业者&#x…

利用JSONCrack与cpolar提升数据可视化及跨团队协作效率

文章目录前言1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址前言 JSONCrack 是一款功能强大的开源数据可视化工具,专为解析和展示复杂的 JSON、XML 等结构化数据…

CANoe入门之一 CANoe功能概述

01 CANoe功能概述 CANoe软件在汽车电子领域被广泛应用。 CANoe软件的全称是CAN Open Environment,它是一个专业的系统级总线和ECU仿真、分析、开发、测试工具。支持ECU或总线网络开发从需求分析到系统实现的全过程,包括模型创建、仿真、测试、诊断及通信…

项目管理核心八项(软件篇)

2025年09月11日23:50:33:进来常思,写代码也五六年了,后面的路该何去何从呢? 项目管理核心八项一、项目管理之“建立开发人员 backup 机制”二、待补充一、项目管理之“建立开发人员 backup 机制” “建立开发人员 backup 机制” 是…

springboot redisson 分布式锁入门与实战

Spring Boot3 Redisson 项目地址 https://gitee.com/supervol/loong-springboot-study (记得给个start,感谢) Redisson 介绍 在分布式系统中,多节点部署的应用对共享资源(如数据库记录、缓存键、文件)的…

使用 Tkinter + Requests 实现地理信息安全系统学习时长助手

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨ 这里有: 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!趣味开发日常:代码背后的脑洞故事、工具…

构建一个优雅的待办事项应用:现代JavaScript实践

构建一个优雅的待办事项应用:现代JavaScript实践本文将介绍如何使用现代JavaScript(ES6)和DOM操作创建一个功能完整的待办事项应用,无需任何外部库或框架。功能概述添加新任务标记任务为完成/未完成编辑任务内容删除任务过滤任务&…

【数据可视化-111】93大阅兵后的军费开支情况———2024年全球军费开支分析:用Python和Pyecharts打造炫酷可视化大屏

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

3.2.Maven-概述-介绍安装

一.介绍:二.安装:Maven的安装比较简单,因为他是绿色版的软件,官方给我们提供Maven的安装包就是一个zip压缩包,在进行Maven安装以及配置的时候,主要进行如下4步操作:第一步:把官方提供…

Kafka面试精讲 Day 14:集群扩容与数据迁移

【Kafka面试精讲 Day 14】集群扩容与数据迁移 在“Kafka面试精讲”系列的第14天,我们将深入探讨 Kafka 运维中最关键的操作之一:集群扩容与数据迁移。随着业务增长,原始 Kafka 集群可能面临磁盘不足、吞吐瓶颈或节点负载不均等问题&#xff…

字节一面 面经(补充版)

什么是RabbitMQ,特点是什么怎么理解保障消息的一致性String、StringBuffer、StringBuilder解释一下线程安全先操作数据库再删缓存还是先删缓存再操作数据库这种办法能杜绝数据不一致问题吗解释一下AOP介绍Redis的特点(Redis比较快)Redis为什么…

【MFC】对话框属性:Absolute Align(绝对对齐)

前言 本文介绍对话框属性中的Absolute Align(绝对对齐),同时给出相关示例便于理解。 目录1 位置2 详解3 示例1 位置 首先介绍一下这个属性在哪里。 在资源视图中双击对话框节点,打开该对话框; 鼠标右键工作区空白处,单击属性&…

【从0开始学习Java | 第17篇】集合(中-Set部分)

文章目录Java集合之Set:无序不重复的元素容器一、Set接口的核心特性二、常用实现类及底层原理1. HashSet:基于哈希表的高效实现2. LinkedHashSet:保留插入顺序的哈希实现3. TreeSet:基于红黑树的排序实现三、实现类对比与选择建议…

玩转Docker | 使用Docker部署dufs文件管理工具

玩转Docker | 使用Docker部署dufs文件管理工具 前言 一、 dufs介绍 Dufs简介 核心特性 📁 静态文件服务 💾 文件夹打包下载 📤 拖拽上传文件/文件夹 ✏️ 文件在线创建、编辑与搜索 ⏳ 断点续传与部分传输 🔐 细粒度访问控制 🔒 HTTPS 安全传输 🌐 WebDAV 兼容支持…

【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之android 把assert里的dist.zip 包解压到sd卡里

一图胜千言 上一篇有 <!-- 读写外部存储 --> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion"28"/> <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE&qu…

线程的创建.销毁

线程线程的创建在 C 中&#xff0c;线程的创建核心是通过std::thread类实现的&#xff0c;其构造函数需要传入一个可调用对象&#xff08;Callable Object&#xff09;作为线程入口。可调用对象包括普通函数、lambda 表达式、函数对象&#xff08;functor&#xff09;、类的成员…

MySQL基础全面解析

MySQL作为最流行的关系型数据库管理系统之一&#xff0c;是每一位开发者必备的核心技能。本文将系统性地解析MySQL的基础知识&#xff0c;结合关键概念与实战应用&#xff0c;帮助您构建扎实的数据库基础。1. SQL与NoSQL的本质区别SQL&#xff08;结构化查询语言&#xff09;数…

4、幽络源微服务项目实战:后端公共模块创建与引入多租户模块

前言 上节我们将电网巡检系统的前端vue2项目创建、配置&#xff0c;并构建了最基础的多租户界面&#xff0c;本节来继续构建后端的公共模块、多租户模块&#xff0c;并将公共模块引入到多租户模块中。 创建公共模块和多租户模块 在back父工程下创建两个Module&#xff0c;和…

STM32学习路线开启篇:芯片简介与课程简介

编写不易,请多多指教,觉得不错可以关注一下,相互学习 前言 一、课程配套资源 1、面包板 2、面包板专用的跳线 3、面包板的飞线 4、杜邦线 5、STM32F103C8T6最小系统板 6、0.96寸的OLED显示屏模块 7、电位器 8、按钮 9、LED灯 10、STLINK 11、USB转串口(TTL)模块 12、源蜂鸣器模…

图像直方图

图像直方图就是用来统计图像像素值分布的。灰度图分布读取灰度图phone cv2.imread(phone.png, cv2.IMREAD_GRAYSCALE) a phone.ravel() plt.hist(a, bins256) plt.show()如何可以获得当前像素值分布读取各通道的像素值分布img cv2.imread(phone.png) colors (b, g, r) for …