发布时间:2023-01-04 13:24:16
转载:OSC开源项目(ID:oschina2013)
Linux 6.2 近日合拼了一个重要补丁,该补丁能够把一个核心内核函数公式效率提高 715 倍。
从合拼的注解得知,奉献此补丁的管理者 Zhen Lei 来源于华为公司,他把 kallsyms_lookup_name () 平均查找性能提升了 715 倍,从而使得内核里边旧达到的时间复杂度从 O (n) 升级成 O (log (n)),大幅降低查找时虫草鹿鞭王怎么服用长,另外还保存了 藏虫草鹿王鞭10粒 /proc/kallsyms 上老旧完成适用。
kallsyms_lookup_name () 函数公式用以依据名字查找标记地址,并适合于查找内核字母符号中的所有标记。
Zhen Lei 曾经在较快的补丁中叙述了?kallsyms_lookup_name () 的改善构思:
现阶段,要搜索一个符号,我们应该将 'kallsyms_names' 中的符号一个一个进行,随后应用进行后字符串数组进行对比。这类算法的时间复杂度是 O (n)。
假如我们像详细地址一样按降序对名字开展排序,则可以用二分查找。这类算法的时间复杂度虫草鹿鞭王多少钱是 O (log (n))。
为了能没有改变 “/proc/kallsyms” 的完成,表 kallsyms_names[]依然依照降序与详细地址一一对应存放。
加上二维数组 kallsyms_seqs_of_names[],以排序后 names 编号为检索,相对应的内容是排序后详细地址编号。比如:假定 NameX 在二维数组 kallsyms_seqs_of_names[]里的检索为 'i',kallsyms_seqs_of_names[i]内容为 'k',则 NameX 相对应的详细地址为 kallsyms_addresses[k]。kallsyms_names[]里的偏移是 get_symbol_offset (k)。
一定要注意,应用这种方法内存使用量将提升 (4 * kallsyms_num_syms) 字节数,接下来2个补丁将降低 (1 * kallsyms_num_syms) 字节数并妥善处理 CONFIG_LTO_CLANG=y 的现象。
性能检测结果:(x86)
Before:
min=234, max=10364402, avg=5206926
min=虫草鹿鞭王使用说明书267, max=11168517, avg=5207587
After:
min=1016, max=90894, avg=7272
min=1014, max=93470, avg=7293
kallsyms_lookup_name () 平均查找性能提升了 715 倍。
因而,该补丁产生的唯一主要缺点将cpu占用量提升 3 * kallsyms_num_syms。
Linux 6.2 的组件编码也包含一个小的运行提升,将开机时间缩短大概 30 ms。
分类虫草鹿鞭王服后脸红搜索:
- EOF -