idealvin / co
- воскресенье, 1 декабря 2019 г. в 00:26:15
C++
An elegant and efficient C++ basic library for Linux, Windows and Mac.
CO 是一个优雅、高效的 C++ 基础库,支持 Linux, Windows 与 Mac 平台。
CO 追求极简、高效,不依赖于 boost 等三方库,仅使用了少量 C++11 特性。
这是一个真正为程序员考虑的配置文件库,支持自动生成配置文件,支持整数类型带单位 k, m, g, t, p,不区分大小写。
这是一个超级快的本地日志系统,直观感受一下:
| log vs glog | google glog | co log |
|---|---|---|
| win2012 机械硬盘 | 1.6MB/s | 180MB/s |
| win10 ssd | 3.7MB/s | 560MB/s |
| mac ssd | 17MB/s | 450MB/s |
| linux ssd | 54MB/s | 1023MB/s |
上表是单线程连续打印 100w 条 info 日志(50 字节左右)的测试结果,co/log 几乎甩了 glog 两条街。
为何如此快?一是 log 库内部基于比 sprintf 快 8-25 倍的 fastream 实现,二是 log 库几乎没有什么内存分配操作。
这是一个速度堪比 rapidjson 的 json 库,如果使用 jemalloc,parse 与 stringify 的速度能达到 rapidjson 的两倍。
co/json 虽不如 rapidjson 全面,但能满足程序员的基本需求,且更容易使用。
这是一个 golang 风格的协程库,内置多线程调度,是网络编程之良品,居家必备。
这是一个基于协程与 json 的高性能 rpc 框架,支持代码生成,简单易用,单线程 qps 能达到 12w+。
这是一个与 co::Pool 配套使用的模板类。co::Pool 是一个协程安全的池子,内部存储 void* 指针。
卡卡洛特构造时从 Pool 拉取一个指针,析构时将指针放回 Pool,同时,卡卡洛特还自带智能指针属性:
co::Pool p;
void f() {
co::Kakalot<Redis> rds(p); // 卡卡洛特现在变身为 Redis* 指针
if (rds == NULL) rds = new Redis; // 对卡卡洛特重新赋值
rds->get("xx"); // 卡卡洛特调用 redis 的 get 操作
}
go(f);