From d406fd28bcda636445252333eb05b0fa8c5ff119 Mon Sep 17 00:00:00 2001 From: gitee-bot Date: Tue, 11 Nov 2025 09:53:20 +0000 Subject: [PATCH] Update README.md --- README.md | 429 +++++++++++++++++------------------------------------- 1 file changed, 132 insertions(+), 297 deletions(-) diff --git a/README.md b/README.md index 3ad191e..33a0c8a 100644 --- a/README.md +++ b/README.md @@ -1,297 +1,132 @@ -# cppMisc -#### changelog -- 2025-11-05 新增了对象池模块objPool,采用纯头文件的方式实现,每秒约760万的吞吐能力。支持任意对象类型。性能测试结果如下: -``` -================================================================================ -测试时间: 2025-11-05 20:42:12 -C++标准: C++17 -平台信息: Linux -CPU核心数: 36 核心 -================================================================================ -=== 性能测试 === - -测试场景: 池大小=100, 操作次数=100000 - 对象池性能: - - 成功获取: 50050 次 - - 失败获取: 49950 次 - - 总耗时: 14.997 ms - - 平均每次操作: 0.150 微秒 - - 吞吐量: 6668000 ops/sec - new/delete性能对比: - - 总耗时: 24 ms - - 平均每次操作: 0.244 微秒 - - 吞吐量: 4102732 ops/sec - - 对象池加速比: 1.63x - -测试场景: 池大小=100, 操作次数=500000 - 对象池性能: - - 成功获取: 250050 次 - - 失败获取: 249950 次 - - 总耗时: 75.19 ms - - 平均每次操作: 0.150 微秒 - - 吞吐量: 6649732 ops/sec - new/delete性能对比: - - 总耗时: 125 ms - - 平均每次操作: 0.251 微秒 - - 吞吐量: 3986383 ops/sec - - 对象池加速比: 1.67x - -测试场景: 池大小=100, 操作次数=1000000 - 对象池性能: - - 成功获取: 500050 次 - - 失败获取: 499950 次 - - 总耗时: 152.02 ms - - 平均每次操作: 0.152 微秒 - - 吞吐量: 6578168 ops/sec - new/delete性能对比: - - 总耗时: 247 ms - - 平均每次操作: 0.247 微秒 - - 吞吐量: 4050518 ops/sec - - 对象池加速比: 1.62x - -测试场景: 池大小=1000, 操作次数=100000 - 对象池性能: - - 成功获取: 50500 次 - - 失败获取: 49500 次 - - 总耗时: 15.23 ms - - 平均每次操作: 0.152 微秒 - - 吞吐量: 6565126 ops/sec - new/delete性能对比: - - 总耗时: 40 ms - - 平均每次操作: 0.400 微秒 - - 吞吐量: 2502064 ops/sec - - 对象池加速比: 2.62x - -测试场景: 池大小=1000, 操作次数=500000 - 对象池性能: - - 成功获取: 250500 次 - - 失败获取: 249500 次 - - 总耗时: 74.64 ms - - 平均每次操作: 0.149 微秒 - - 吞吐量: 6699180 ops/sec - new/delete性能对比: - - 总耗时: 197 ms - - 平均每次操作: 0.395 微秒 - - 吞吐量: 2532492 ops/sec - - 对象池加速比: 2.65x - -测试场景: 池大小=1000, 操作次数=1000000 - 对象池性能: - - 成功获取: 500500 次 - - 失败获取: 499500 次 - - 总耗时: 150.82 ms - - 平均每次操作: 0.151 微秒 - - 吞吐量: 6630376 ops/sec - new/delete性能对比: - - 总耗时: 410 ms - - 平均每次操作: 0.410 微秒 - - 吞吐量: 2439542 ops/sec - - 对象池加速比: 2.72x - -测试场景: 池大小=10000, 操作次数=100000 - 对象池性能: - - 成功获取: 55000 次 - - 失败获取: 45000 次 - - 总耗时: 16.22 ms - - 平均每次操作: 0.162 微秒 - - 吞吐量: 6165608 ops/sec - new/delete性能对比: - - 总耗时: 312 ms - - 平均每次操作: 3.122 微秒 - - 吞吐量: 320329 ops/sec - - 对象池加速比: 19.25x - -测试场景: 池大小=10000, 操作次数=500000 - 对象池性能: - - 成功获取: 255000 次 - - 失败获取: 245000 次 - - 总耗时: 77.00 ms - - 平均每次操作: 0.154 微秒 - - 吞吐量: 6493591 ops/sec - new/delete性能对比: - - 总耗时: 1697 ms - - 平均每次操作: 3.394 微秒 - - 吞吐量: 294651 ops/sec - - 对象池加速比: 22.04x - -测试场景: 池大小=10000, 操作次数=1000000 - 对象池性能: - - 成功获取: 505000 次 - - 失败获取: 495000 次 - - 总耗时: 152.46 ms - - 平均每次操作: 0.152 微秒 - - 吞吐量: 6559097 ops/sec - new/delete性能对比: - - 总耗时: 3414 ms - - 平均每次操作: 3.414 微秒 - - 吞吐量: 292929 ops/sec - - 对象池加速比: 22.39x - -长时间运行稳定性测试 (100,000,000次操作): - 进度: 10%, 已运行: 1秒 - 进度: 20%, 已运行: 3秒 - 进度: 30%, 已运行: 4秒 - 进度: 40%, 已运行: 6秒 - 进度: 50%, 已运行: 7秒 - 进度: 60%, 已运行: 9秒 - 进度: 70%, 已运行: 10秒 - 进度: 80%, 已运行: 12秒 - 进度: 90%, 已运行: 13秒 - 稳定性测试完成: - - 总操作次数: 100000000 - - 总耗时: 15 秒 - - 平均吞吐量: 6666667 ops/sec -``` -- 2025-11-04 修改了xml配置文件模块cconffile.xml,将GetValue重载方法改成了模板方法,能够支持更多的类型; -- 2025-11-04 新增线程安全的内存池模块memPool,支持任意数据类型的内存池化。实际测试性能不佳,请谨慎使用 -- 2025-09-03 增加tinySeqFile模块,这是一个以顺序保存的文件引擎。采用分页定数量保存的方式,内部使用unordered_map作为页索引。适合用于嵌入式顺序数据持久化;或者其他情况下的日志文件保存等场景 --- 1. 核心功能性能 -单次操作延迟: < 1ms (基于测试观察) -初始化时间: 几乎瞬时 (文件已存在时) -内存占用: 固定且可预测 (约 10000*24 ≈ 240KB) --- 2. 吞吐量性能 -单线程顺序写入: 约 10,000 次操作/秒 -多线程并发: 4线程并发下约 30,000 次操作/秒 (基于 HighConcurrency 测试) -大数据量处理: 10,000 条记录处理时间 < 2秒 - -- 2025-09-02 增加rapidjson类型系统模板,方便读取JSON的数据 -- 2025-09-01 加固了命令模式,避免条件变量误触发 -- 2025-08-12 修改了单例模式,增加了meyer's方式 -- 2025-04-30 修改了状态模式模块的类型定义部分,增强了类型检查能力 -- 2025-04-30 验证完成了sharedMem模块 -- 2025-04-21 新增了linux共享内存封装sharedMem,暂时没有经过验证,小心使用 -- 2024-12-13 单例模式(designM/singleton.hpp)增加了多线程支持, 提高了在多线程情况下的安全性 -- 2024-07-04 线程池增加排队队列长度限制,超出则会抛出std::runtime_error. 默认队列长度为10000,可以用包含队列长度的构造函数指定最大长度 -- 2024-05-07 新增debug模块,输出调用栈信息,目前仅仅调试了在linux下的模块。使用非常简单,比如 -``` - #include "debug.hpp" - - void func() - { - wheels::debug::printCallstack(); - } -``` -- 2024-04-02 在计时器模块中新增一个orderedTimer类,提供了排序的软计时器功能,程序中可以仅仅一个系统计时器,通过软计时器完成多计时器的功能。 -- 2024-03-28 解释器模式,增加执行函数接口 -- 2023-11-23 新增ssl服务器 -- 2023-11-20 新增了访问者模式 -- 2023-11-6 新增状态模式 -- 2023-11-3 新增了中介者模式 -- 2023-11-2 新增了备忘录模式,组合模式和代理模式 -- 2023-7-15 新增了INI文𢓐处理模块 -- 2023-7-14 新增了适配器模式 include/designM/adaptor.hpp -- 2023-7-7 新增了外观模式,include/designM/facade.hpp"分别以接口和继承的两种方式实现 , 示例在example目录下 -- 2023-7-4 新增了建造者模式,include/designM/build.hpp , 示例在example目录下 -- 2023-6-30 新增了抽象工厂模式 include/designM/absFactory.hpp,示例在example目录下 -- 2023-6-26 新增了线程池 include/threadPool.hpp -- 2023-5-28 新增红黑树 -- 2023-5-7 新增variant,任意数据类型, 文件路径container/variant.hpp。这个模块是一个纯头文件的模板类,支持在其他的stl容器中使用这个模块 -- 2023-5-9 新增variant简单介绍文档 -#### 介绍 -我自己常用的基础算法,接口的封装。主要包含了常用的设计模式,容器和一些常用的功能性接口。 - -- 设计模式采用元编程的方式实现。目前已经实现了22种设计模式。主要包含了单例模式,装饰模式,策略模式,工厂模式和桥接模式等。项目位于include/designM目录。设计模式实现都是采用纯头文件的方式可以直接引用 - -- 容器目前实现了AVL, variant , 红黑树rbTree。这部分代码位于include/container目录中 -- cefQT是一个可以在QT程序中嵌入浏览器的模块,这个模块依赖于libcef,使用的时候需要先安装libcef - -#### 安装教程 -- 单例模式使用说明: - 业务实现类应该继承于singleton,并在实现文件中使用宏 IMP_SINGLETON - - 在头文件中: - -``` - #include "designM/singleton.hpp" - - class newSingleClass : public wheels::dm::singleton< newSingleClass > { - - // 您自己的实现代码 - }; -``` - - - 在实现文件中: - -``` - IMP_SINGLETON(newSingleClass); - - // 您自己的实现代码 - -``` - - 应用时: - 创建对象,create支持可变参数方式,因此可以应用于有不同参数的构造函数 -``` - newSingleClass * p = newSingleClass::create(); - - newSingleClass * p = newSingleClass::create( 12 , "abc" ); -``` - - 获取对象: - ```auto * p = newSingleClass::get();``` -- 工厂模式:工厂模式采用两种方式实现,一种是采用类继承的方式;一种是采用模板函数的方式 -1. 采用模板函数的方式适用于公有的构造函数的类,例如: - -``` -class a{ -public: - a(); - a( int c ); -}; - -a * pa = factory< a >( 23 ); -a * pa2 = Factory< a >( []( Factory::emErrCode err){ - // 错误处理 - } , 23 ); -``` - -这里注意,工厂函数考虑了创建没有考虑销毁,在使用完成对象后要自己调用delete完成对象的销毁 -2. 采用类继承的方式适用于采用私有构造函数的方式,例如 - -``` -class a : public Factory< a >{ -public: - a(); - a( int c ); -}; - -a * pa = a::factory( 23 ); -``` -- 责任链模式 - 使用示例: - - -``` -class myItfc{ - virtual int do_something( int ) = 0; - 定义接口 - }; - - class myItfc1 : public myItfc{ - 接口实现1 - }; - - class myItfc1 : public myItfc{ - 接口实现2 - }; - - class myRsps : public rspsLink< myItfc >{ - 自己的定义和方法 - } - - myRsps rsps; - rsps.push_back( new myItfc1 ); - rsps.push_back( new myItfc2 ); - rsps.push_back( ... ); - -/// 按照责任链传递操作 - int a = 1; - rsps.forward([&]( myRsps::stLinkItem& item ){ - a = item->do_something( a ); - }); -``` -#### 与本资源中设计模式实现部分的designM目录下配套的书已经出版,书中详细介绍了实现原理和使用方法,并针对每一个设计模式都编写了示例程序。而且已经被中科院文献情报中心收录。有兴趣的同学可以在京东,当当等平台购买 -![输入图片说明](doc/bb5da93a56ee03d4.jpg) -https://www.las.ac.cn/front/book/detail?id=f76459d8276839586319b1443649d568 -![输入图片说明](doc/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250611161729.png) \ No newline at end of file +# cppMisc + +## 项目介绍 + +`cppMisc` 是一个 C++ 基础库,包含常用算法、设计模式、容器以及功能性接口的封装。该项目主要面向 C++ 开发者,提供了一系列高效的组件和模块,适用于嵌入式系统、高性能计算、网络通信等多个领域。 + +目前已实现的功能包括: + +- **设计模式**:采用元编程方式实现,涵盖单例模式、工厂模式、装饰模式、策略模式、抽象工厂模式、责任链模式、外观模式、建造者模式、中介者模式、代理模式、备忘录模式、命令模式、适配器模式、观察者模式、状态模式、迭代器模式、组合模式、访问者模式、模板方法模式、享元模式、解释器模式、原型模式等 22 种设计模式。 +- **容器**:实现了 AVL 树、红黑树、variant(任意数据类型)、对象池、内存池等容器结构。 +- **功能性模块**:包括线程池、调试调用栈输出、共享内存封装、INI 文件处理、XML 配置文件处理、定时器、序列化接口、网络通信模块(TCP/UDP/SSL/HTTP)、嵌入式浏览器接口(依赖 libcef)等。 + +## 安装与使用 + +### 单例模式使用示例 + +```cpp +#include "designM/singleton.hpp" + +class newSingleClass : public wheels::dm::singleton { + // 您的实现代码 +}; + +// 在实现文件中使用宏 IMP_SINGLETON +IMP_SINGLETON(newSingleClass); + +// 创建对象 +newSingleClass* p = newSingleClass::create(); +newSingleClass* p2 = newSingleClass::create(12, "abc"); + +// 获取对象 +auto* p = newSingleClass::get(); +``` + +### 工厂模式使用示例 + +1. **模板函数方式**(适用于公有构造函数的类): + +```cpp +class a { +public: + a(); + a(int c); +}; + +a* pa = factory(23); +a* pa2 = Factory([](Factory::emErrCode err) { + // 错误处理 +}, 23); +``` + +2. **类继承方式**(适用于私有构造函数的类): + +```cpp +class a : public Factory { +public: + a(); + a(int c); +}; + +a* pa = a::factory(23); +``` + +### 调试模块 + +调试模块提供调用栈打印功能,仅支持 Linux 平台。 + +```cpp +#include "debug.hpp" + +void func() { + wheels::debug::printCallstack(); +} +``` + +### 责任链模式使用示例 + +```cpp +class myItfc { + virtual int do_something(int) = 0; // 接口定义 +}; + +class myItfc1 : public myItfc { /* 实现1 */ }; +class myItfc2 : public myItfc { /* 实现2 */ }; + +class myRsps : public rspsLink { + // 自定义方法 +}; + +myRsps rsps; +rsps.push_back(new myItfc1); +rsps.push_back(new myItfc2); + +// 按照责任链传递操作 +int a = 1; +rsps.forward([&](myRsps::stLinkItem& item) { + a = item->do_something(a); +}); +``` + +## 性能特性 + +### 对象池模块(objPool) + +对象池模块采用纯头文件实现,支持任意对象类型,性能显著优于 `new/delete`。 + +| 池大小 | 操作次数 | 对象池吞吐量 | new/delete 吞吐量 | 加速比 | +|--------|----------|--------------|-------------------|--------| +| 100 | 1,000,000| 6,578,168 ops/sec | 2,929,29 ops/sec | 22.39x | +| 10000 | 1,000,000| 6,630,376 ops/sec | 2,439,542 ops/sec | 2.72x | + +### 内存池(memPool) + +线程安全的内存池模块,支持任意数据类型。目前性能测试显示效果不佳,建议谨慎使用。 + +### 线程池(threadPool) + +线程池模块支持多线程任务调度,并提供队列长度限制功能,默认最大队列长度为 10000,可通过构造函数指定。 + +## 文档与书籍支持 + +本项目的设计模式实现部分配套书籍《C++设计模式》已出版,并被中国科学院文献情报中心收录。书中详细介绍了每个设计模式的实现原理和使用方法,并附有完整示例程序。读者可在京东、当当等平台购买。 + +![书籍封面](doc/bb5da93a56ee03d4.jpg) + +## 开源协议 + +本项目采用开源协议,请参考仓库中的 `LICENSE` 文件。 + +## 联系与贡献 + +欢迎提交 Issue 和 Pull Request。如需进一步交流,可联系项目维护者或参考配套书籍获取更深入的技术支持。 \ No newline at end of file -- Gitee