核心内容摘要
基于知识蒸馏的轻量级通用推理模型设计
文章目录fast-floatfpconvhdr_histogramhiredisjemalloclinenoiseluaREDIS源码里deps目录是做什么的从阅读deps目录我们可以感觉到redis真的是对性能的追求达到了极致尽一切可能去优化性能。
deps主要存放的是依赖的第三方库除hiredis外都是第三方库。
fast-floatfast-float的主要作用是将文本转换为浮点数它比系统自带的函数快2~4倍。
该第三方库采用了以下几种技术来提升性能:通过预计算表和高效的数字转换逻辑大幅减少了计算量。
零内存分配No Allocation在解析过程中不进行任何动态内存分配No Heap Allocation。
它直接在传入的字符缓冲区上进行操作避免了 malloc/free 带来的性能损耗和缓存污染。
缓存友好Cache Friendly它采用线性内存访问模式最大限度地利用了现代 CPU 的预取机制减少了缓存未命中Cache Miss的延迟。
忽略本地化Locale Independence它始终遵循 “C” 语言环境的数值格式。
这意味着它不需要去检查系统当前的区域设置比如欧洲用逗号做小数点的情况直接跳过了复杂的本地化处理逻辑省去了巨大的开销。
严格模式它严格按照 C17 的 from_chars 接口规范不跳过前导空格由调用者处理这种明确的职责划分也减少了函数内部的判断时间。
fpconvfpconv作用是将浮点数转为字符串,比系统自带的函数快5~10倍。
该三方库有以下特点\item fpconv 使用了 Grisu 算法确保生成的十进制字符串是最短的且能唯一确定原来的二进制浮点数这是 JSO标准要求的。
\item 无动态内存分配Zero Allocationfpconv 的设计通常要求调用者预先分配好缓冲区比如一个长度为 32 的 char 数组,它直接在传入的缓冲区上写入数据不调用 malloc。
\item 线程安全与无状态,它是一个纯函数不依赖全局变量或静态缓冲区不像旧的 ecvt/fcvt 函数它们使用静态内存多线程调用会有数据覆盖风险。
在Grisu 算法出现之前浮点数转字符串主要用的是 Dragon4算法。
hdr_histogram这个库的作用是高性能直方图用于记录redis命令的执行时间。
该库有以下特点监控redis运行时间它的记录精度跨度很大时间跨度可以从几微秒到几小时。
监控redis运行时间它的记录精度跨度很大时间跨度可以从几微秒到几小时。
高性能记录一次数据的耗时极短纳秒级对业务逻辑几乎无侵入适合高频记录命令延迟。
hiredis是redis的c语言客户端库.也就是说如果要在C语言程序里连接redis服务器需要把hiredis引入项目中。
jemalloc与系统自带的内存分配函数相比jemalloc在高并发下锁竞争更小而且内存碎片很少。
jemalloc使用了很多先进的思想。
比如说它的内存分析就使用了快速伯努利抽样的方法来提高性能。
linenoiselinenoise是一个命令行工具当需要开发命令行程序时用linenoise可以减少重复开发时间它包含了历史记录tab补全等常见命令行的功能。
曾经有人说一个完整的命令行工具至少要两万行代码。
初步想想确实要啊就做个命令历史记录1000行代码得要吧。
再来个tab补全1000行行内提示也差不多1000行吧再加上辅助函数工具方法之类的肯定得20000行了。
让我来写的话肯定3万行不止。
但是Guerrilla这位大牛最终用头文件76行加C文件1458行总共1534行就搞定了。
lualua自然不需要多说是lua语言的引擎。
lua这门语言非常奇特因为它编译后只有差不多200kb却实现了一门完整的编程语言。
可以说是轻量到了极致。
lua主要有以下特点lua只用一种数据结构table来实现几乎所有的数据结构。
lua是寄存器试虚拟机比基于栈的虚拟机轻量得多。
lua没有文件、网络IO功能没有图形界面这些全靠宿主程序实现。