C語言sprintf的高效替代方案

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 …