glibc源码目录中的sysdeps
前段时间看了下glibc的一些string库函数实现
自己照猫画虎的写了几个函数测了测, 比起windows vc中自带的实现, 并没有更快, 反倒是慢了很多.
比如memset函数, 微软公开的vc crt中memset.c是以字节为单位循环的. 如果用glibc中操作块与循环展开的方式, 按道理应该比前者快4倍/8倍才对啊
开始以为是编译器优化不给力, 后来用编译为release版, 各种手段优化用上了也比系统自带的慢很多
实在气不过, 汇编跟踪了下, 发现vc实际运行的不是memset.c的实现, 而是另一个版本, crt/src/intel/memset.s, 其中用到了rep指令…
好吧, 充分说明我看代码不认真.
我想既然crt中都有针对具体处理器的函数实现, glibc中肯定也有吧
于是翻了下目录, 发现很多函数在sysdeps目录有重复的实现版本.
顾名思义, sysdeps目录大概就是存放和处理器具体架构有关的代码
看子目录名也知道了, i386, powerpc, s390, sparc, x86, x86_64….
那么对于同一个函数, 比如memset, 就会有多个实现版本
glibc/string/memset.c
glibc/sysdeps/i386/memset.c
glibc/sysdeps/x86_64/memset.s
…
我的理解是外层目录的代码是通用实现, 针对各个处理器都能良好工作的
而对于可以使用处理器提供的各种高级指令进行优化的函数, 就放到sysdesp目录中再实现一个版本
另外还发现math库函数的真正实现貌似都在sysdeps中, glibc/math/中的c代码都没有真正的实现过一个函数…
有空再分析