Teemo 轻量级高性能 C++ 工具库:开箱即用的后端开发开源组件指南
一、Teemo 库完整详细介绍
1.1 项目背景
日常 C++ 开发中,几乎每个项目都要重复编写大量底层基础工具:日志打印、字符串编解码、内存管理、环形缓冲、时间处理、文件操作、本地缓存、定时器等。
- 标准库功能薄弱,缺少工程化组件;
- Boost 功能全面但体积庞大、编译复杂,嵌入式项目难以移植;
- 自研工具分散在各个项目,维护成本高、性能参差不齐、跨平台兼容性差;
- 专用框架(如协程库、RPC 库)只解决单一领域,无法覆盖通用基础需求。
在此背景下,Teemo诞生,它是一款纯 C++ 编写、零外部依赖、跨平台开源基础工具集,专门用来统一解决业务开发中重复造轮子的痛点,专注提供轻量化、高性能、开箱即用的底层通用组件。
开源仓库地址:https://github.com/teemolib/teemo
开源协议:MIT 协议,支持商用、修改、闭源二次开发,无版权约束。
1.2 核心设计理念
- 零外部依赖核心全部基于 C++11 标准库实现,不依赖 Boost、OpenSSL、protobuf 等第三方库,最小化项目编译成本,嵌入式、云服务器均可轻松接入。
- 模块化解耦,按需编译所有功能模块完全独立,编译时可关闭不需要的组件,最终库文件体积小巧,不会引入冗余代码。
- 现代 C++ 风格,性能优先大量使用
string_view零拷贝、右值引用、模板泛型、无锁数据结构、内存池优化,规避频繁堆内存分配带来的性能损耗与内存碎片。 - 全平台兼容支持 Linux / Windows /macOS,适配 x86_64、ARM64、RISC-V 主流 CPU 架构,同时兼容 PC 服务端与资源受限嵌入式设备。
- 双接入模式支持纯头文件引入(小型工具快速开发)、静态 / 动态库编译链接(大型后端项目)两种接入方式,适配不同规模工程。
- 低学习成本,接口简洁统一封装抹平不同操作系统原生 API 差异,所有模块接口命名规范统一,注释完善,新手可快速上手。
1.3 全模块功能详解
Teemo 将所有工具按功能划分为 7 大核心模块,覆盖 90% C++ 开发底层需求:
模块 1:log 高性能日志模块
项目必备组件,替代cout、printf、简陋自研日志:
- 日志分级:TRACE、DEBUG、INFO、WARN、ERROR、FATAL;
- 同步 / 异步双模式,高并发场景异步写入不阻塞业务线程;
- 自动日志切割:按文件大小、按日期分割,自动清理过期日志;
- 自动携带线程 ID、毫秒时间、代码文件名、行号、函数名;
- 支持多输出终端:控制台打印、本地文件、自定义网络输出;
- 低锁竞争,万级并发打印无明显性能卡顿。
模块 2:codec 通用编解码工具
网络报文、参数传输高频工具,内置成熟高效实现:
- Base64 编码 / 解码;
- Hex 十六进制互转;
- URL 编码解码;
- 内置高效字符串工具:分割、去空格、大小写转换、数字字符串互转。
模块 3:memory 内存优化组件
解决服务端高频创建销毁对象导致的内存碎片:
- ObjectPool 对象池:复用自定义结构体 / 类内存,减少 new/delete 调用;
- 固定大小内存池,适配网络数据包;
- 调试阶段简易内存泄漏检测工具;
- 对齐内存分配封装,适配二进制、网络解析场景。
模块 4:container 拓展高性能容器
弥补标准容器在高并发、IO 场景的短板:
- RingBuffer 环形缓冲区:TCP 收发、生产者消费者消息队列专用;
- 无锁多生产者多消费者队列;
- LRU 本地缓存模板,无需依赖 Redis 即可实现热点数据本地缓存;
- 高性能哈希表,降低哈希冲突。
模块 5:time 时间与定时器工具
抹平 Linux/Windows 时间 API 差异,提供一站式时间能力:
- 毫秒 / 微秒 / 纳秒高精度时间戳;
- 自定义格式化时间输出;
- 时间差计算、时区简易处理;
- 定时器:一次性延时任务、循环定时任务;
- 跨平台统一休眠接口(ms/s 级休眠)。
模块 6:fs 跨平台文件系统工具
封装文件、目录操作,不用区分系统 API:
- 递归创建 / 删除文件夹;
- 文本文件快速读写;
- 判断文件 / 目录是否存在、获取文件大小;
- 获取程序运行目录、可执行文件路径。
模块 7:config 轻量配置解析
无需引入重型 JSON/XML 库,适配简单 KV 配置文件:
- 解析
key=value格式本地配置; - 支持读取数字、字符串、布尔类型;
- 运行时热重载配置,无需重启程序。
1.4 Teemo 对比同类工具库优势
| 对比项 | Teemo | Boost | 自研零散工具 |
|---|---|---|---|
| 外部依赖 | 无 | 大量依赖,编译繁琐 | 无,但维护成本极高 |
| 库体积 | 极小,按需裁剪 | 体积庞大,嵌入式移植困难 | 随项目累积冗余代码 |
| 性能优化 | 内置内存池、无锁结构、零拷贝 | 部分模块优秀,冗余功能多 | 大多未做并发优化,易内存碎片 |
| 跨平台支持 | 全平台统一封装,ARM 嵌入式友好 | 支持多平台,配置复杂 | 每个项目单独适配,兼容性参差不齐 |
| 商用协议 | MIT 宽松协议,无限制 | Boost 特殊协议,有使用约束 | 自有代码,无协议但迭代成本高 |
| 接入难度 | 极低,头文件 / 静态库两种方式 | 高,链接、编译配置复杂 | 极高,持续修复 bug、统一接口 |
选型建议
- 仅需要日志、内存池、编解码、缓冲、定时器等基础底层工具,优先 Teemo;
- 项目需要协程、序列化、复杂数学计算等重型能力,可 Teemo 搭配专用框架使用;
- 嵌入式、资源受限设备、存量 zlib/zstd/C++ 后端轻量化改造,Teemo 是最优选择。
二、前置环境准备
- 编译器:GCC7+/Clang10+/MSVC2017+,支持 C++11 及以上标准;
- 构建工具:CMake 3.12 及以上;
- 提前拉取 Teemo 源码编译并安装静态库。
三、工程 CMakeLists.txt 通用配置
cmake_minimum_required(VERSION 3.12) project(teemo_demo) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找系统中已安装的Teemo库 find_package(teemo REQUIRED) # 编译可执行程序 add_executable(demo main.cpp) # 链接Teemo静态库 target_link_libraries(demo teemo)四、main.cpp 完整综合实战 Demo
包含日志、编解码、内存池、环形缓冲、LRU 缓存、时间工具、定时器、文件工具全部模块示例,可直接编译运行
#include <iostream> #include <string> #include <vector> // Teemo全模块头文件引入 #include <teemo/log/log.h> #include <teemo/codec/base64.h> #include <teemo/codec/hex.h> #include <teemo/memory/object_pool.h> #include <teemo/container/ring_buffer.h> #include <teemo/container/lru_cache.h> #include <teemo/time/time_util.h> #include <teemo/time/timer.h> #include <teemo/fs/file_util.h> // 自定义测试结构体,用于对象内存池演示 struct MsgData { int id; std::string content; MsgData() : id(0) {} MsgData(int i, std::string c) : id(i), content(c) {} }; // 定时任务回调函数 void TimerCallback() { uint64_t ms = teemo::TimeUtil::MsNow(); LOG_INFO("定时任务触发,当前毫秒时间戳:{}", ms); } int main() { // ====================== 1. 异步日志模块初始化 ====================== teemo::LogConfig log_cfg; log_cfg.async = true; // 开启异步日志,不阻塞业务线程 log_cfg.file_path = "./demo_log/app.log"; log_cfg.max_file_size = 128 * 1024 * 1024; // 单日志文件最大128MB log_cfg.keep_days = 7; // 自动清理7天前日志 teemo::Logger::Instance()->Init(log_cfg); LOG_INFO("========== Teemo 综合Demo启动 =========="); // 分级日志打印 LOG_DEBUG("调试日志:程序初始化完成"); LOG_WARN("警告:示例测试日志"); LOG_ERROR("错误模拟:code = {}", 10086); // ====================== 2. Base64 / Hex 编解码 ====================== std::string raw_str = "Teemo C++ lib test 编解码示例 123456"; // Base64 std::string b64_enc = teemo::Base64::Encode(raw_str); std::string b64_dec = teemo::Base64::Decode(b64_enc); LOG_INFO("Base64 编码结果:{}", b64_enc); LOG_INFO("Base64 解码还原:{}", b64_dec); // Hex十六进制转换 std::string hex_enc = teemo::Hex::Encode(raw_str); std::string hex_dec = teemo::Hex::Decode(hex_enc); LOG_INFO("Hex 编码结果:{}", hex_enc); LOG_INFO("Hex 解码还原:{}", hex_dec); // ====================== 3. 对象内存池(解决频繁new碎片) ====================== teemo::ObjectPool<MsgData> msg_pool(200); // 预分配200个对象缓存 // 从池获取对象,无需new MsgData* p1 = msg_pool.Alloc(1, "第一条内存池消息"); MsgData* p2 = msg_pool.Alloc(2, "第二条内存池消息"); LOG_INFO("内存池对象1 id:{}, content:{}", p1->id, p1->content); LOG_INFO("内存池对象2 id:{}, content:{}", p2->id, p2->content); // 归还对象,回收复用,不调用delete msg_pool.Free(p1); msg_pool.Free(p2); // ====================== 4. 环形缓冲区(网络IO、消息队列专用) ====================== teemo::RingBuffer ring_buf(1024); // 1KB环形缓冲 std::string send_data = "ring buffer test data"; ring_buf.Write(send_data.data(), send_data.size()); char read_buf[256] = {0}; size_t read_len = ring_buf.Read(read_buf, sizeof(read_buf)); LOG_INFO("环形缓冲区读出数据:{}", std::string(read_buf, read_len)); // ====================== 5. LRU本地缓存 ====================== teemo::LruCache<std::string, std::string> lru(10); // 最大缓存10条数据 lru.Put("user_1001", "张三"); lru.Put("user_1002", "李四"); std::string name; if (lru.Get("user_1001", name)) { LOG_INFO("LRU缓存读取 user_1001 = {}", name); } // ====================== 6. 高精度时间工具 ====================== uint64_t ms_ts = teemo::TimeUtil::MsNow(); uint64_t us_ts = teemo::TimeUtil::UsNow(); std::string time_fmt = teemo::TimeUtil::FormatNow("%Y-%m-%d %H:%M:%S"); LOG_INFO("毫秒时间戳:{}", ms_ts); LOG_INFO("微秒时间戳:{}", us_ts); LOG_INFO("格式化当前时间:{}", time_fmt); // ====================== 7. 定时器循环任务 ====================== teemo::Timer timer; // 每500ms执行一次定时回调 timer.AddLoopTask(500, TimerCallback); timer.Start(); LOG_INFO("定时器启动,等待3s测试定时任务..."); teemo::TimeUtil::SleepMs(3000); // 主线程休眠3秒 timer.Stop(); LOG_INFO("定时器停止"); // ====================== 8. 文件工具 ====================== std::string test_dir = "./demo_dir"; // 创建文件夹 if (!teemo::FileUtil::DirExists(test_dir)) { teemo::FileUtil::MkDirRecursive(test_dir); LOG_INFO("文件夹 {} 创建成功", test_dir); } // 写入本地文件 std::string file_path = test_dir + "/test.txt"; std::string file_content = "Teemo FileUtil 读写测试内容"; teemo::FileUtil::WriteText(file_path, file_content); // 读取文件 std::string read_file; teemo::FileUtil::ReadText(file_path, read_file); LOG_INFO("读取本地文件内容:{}", read_file); // 释放日志资源,刷盘剩余日志 teemo::Logger::Instance()->Shutdown(); std::cout << "Demo全部执行完成!" << std::endl; return 0; }五、Linux 下编译运行命令
# 创建编译目录 mkdir build && cd build cmake .. make -j4 # 运行程序 ./demo六、Teemo 典型落地应用场景
- C++ 后端网关、微服务、中间件异步日志、环形缓冲处理 TCP 报文、Base64 编解码、LRU 缓存用户配置、定时巡检服务状态,统一替换项目零散自研工具类,提升并发吞吐。
- 嵌入式 Linux、车载、物联网终端零依赖、体积小,适配 ARM 低算力设备,用于传感器数据压缩传输、本地日志存储、定时上报设备状态、固件文件读写。
- 游戏服务端(逻辑服 / 网关服)对象池消除玩家对象频繁创建销毁的内存碎片、高速异步日志记录玩家行为、定时器处理定时活动、环形缓冲处理网络帧数据。
- 跨平台桌面工具、调试程序一套代码兼容 Windows/Linux/macOS,统一文件读写、日志、时间接口,开发文件处理工具、网络抓包调试工具。
- 存量 C++ 老项目轻量化改造原有项目自研工具混乱、日志性能差、内存泄漏频发,可渐进式接入 Teemo,无需大规模重构业务代码,低成本完成性能优化。
- C++ 入门学习实践源码结构清晰,大量现代 C++ 高性能实现,适合学习内存池、无锁队列、异步日志、零拷贝字符串等底层核心技术。
七、开发避坑实用小贴士
- 程序退出前必须调用
Logger::Instance()->Shutdown(),否则异步日志缓冲区数据丢失; - 对象池
Alloc获取的对象禁止直接delete,必须调用Free归还复用; - Timer 启动会新建后台工作线程,程序退出前务必调用
Stop销毁线程,避免内存泄漏; - Windows 编译建议开启 UTF-8 编码,防止日志中文乱码;
- 嵌入式编译时可通过 CMake 关闭不需要的模块,进一步减小库文件体积;
- 高并发网关场景优先开启异步日志,同步日志大量打印会阻塞网络线程。
八、全文总结
Teemo 作为轻量化、零依赖的开源 C++ 通用工具库,核心优势是极低接入成本、全平台兼容、全套高性能底层组件、宽松 MIT 商用协议。 它完美解决 C++ 开发重复造轮子的行业痛点,不管是云后端、嵌入式、游戏服务端还是桌面工具项目,都能快速集成,统一底层基础组件标准,同时通过内存池、无锁容器、异步日志等能力显著提升程序并发性能。 如果你长期使用零散自研工具或笨重的 Boost 库,Teemo 是性价比极高的轻量化替代方案。
原创 C++ 开源库实战分享,点赞收藏不迷路,后续更新 Teemo 配置模块、网络缓冲进阶实战案例! 拓展阅读:C++ 高性能日志实现原理、环形缓冲区在 TCP 网关中的应用
