本系列补丁为 RISC-V 架构提供了 strnlen()、strchr() 和 strrchr() 的优化实现。其中 strnlen() 的实现基于现有已优化的 strlen()。对于 strchr() 和 strrchr(),当前版本采用简单的逐字节汇编逻辑,这将作为未来基于 Zbb 扩展优化的基准。
该补丁系列分为三个部分:
正确性测试:前三个补丁为 strlen()、strnlen() 和 strrchr() 添加了 KUnit 测试用例,以确保基线版本和优化版本的功能正确性。
基准测试工具:扩展了 string_kunit,增加了性能测量功能,以便在 KUnit 环境中进行性能对比分析。
架构优化:最后引入了 RISC-V 特定的汇编实现。
性能摘要(提升百分比):
表格
函数 16 字节(短字符串) 512 字节(中等字符串) 4096 字节(长字符串)
strnlen +72.6% +350.1% +427.5%
strchr +3.6% +3.5% -0.3%
strrchr +5.3% +5.8% +0.8%
strnlen() 的实现利用了 Zbb 扩展的 orc.b 指令和按字(word-at-a-time)处理逻辑,随着字符串长度增加,性能提升显著。对于 strchr() 和 strrchr(),手写汇编通过消除栈帧管理减少了固定开销。在短字符串上提升最为明显(此时函数调用开销占主导),而在 TCG 环境中,对于较长字符串,性能与 C 实现趋于一致。
合入补丁列表如下:
83feeb1 lib/string_helpers: string_get_size() now returns characters wrote
f0b7f8a lib/string_helpers: Add flags param to string_get_size()
29d8568 string: Convert selftest to KUnit
fb57550 string: Convert helpers selftest to KUnit
9259a47 string_kunit: Add test cases for str*cmp functions
b03442f string: Prepare to merge strscpy_kunit.c into string_kunit.c
bb8d9b7 string: Merge strscpy KUnit tests into string_kunit.c
6e4ef14 string: Prepare to merge strcat KUnit tests into string_kunit.c
bd678f7 string: Merge strcat KUnit tests into string_kunit.c
dde915c string: Convert KUnit test names to standard convention
0efc599 string.h: Introduce memtostr() and memtostr_pad()
c01c41e string_kunit: Move strtomem KUnit test to string_kunit.c
ae45f89 lib/string_kunit: add correctness test for strlen()
263dca2 lib/string_kunit: add correctness test for strnlen()
27b2810 lib/string_kunit: add correctness test for strrchr()
0020240 lib/string_kunit: add performance benchmark for strlen()
e73bcb3 lib/string_kunit: extend benchmarks to strnlen() and chr searches
5ba15d4 riscv: lib: add strnlen() implementation
adf5421 riscv: lib: add strchr() implementation
bef64bc riscv: lib: add strrchr() implementation
本系列补丁为 RISC-V 架构提供了 strnlen()、strchr() 和 strrchr() 的优化实现。其中 strnlen() 的实现基于现有已优化的 strlen()。对于 strchr() 和 strrchr(),当前版本采用简单的逐字节汇编逻辑,这将作为未来基于 Zbb 扩展优化的基准。
该补丁系列分为三个部分:
正确性测试:前三个补丁为 strlen()、strnlen() 和 strrchr() 添加了 KUnit 测试用例,以确保基线版本和优化版本的功能正确性。
基准测试工具:扩展了 string_kunit,增加了性能测量功能,以便在 KUnit 环境中进行性能对比分析。
架构优化:最后引入了 RISC-V 特定的汇编实现。
性能摘要(提升百分比):
表格
函数 16 字节(短字符串) 512 字节(中等字符串) 4096 字节(长字符串)
strnlen +72.6% +350.1% +427.5%
strchr +3.6% +3.5% -0.3%
strrchr +5.3% +5.8% +0.8%
strnlen() 的实现利用了 Zbb 扩展的 orc.b 指令和按字(word-at-a-time)处理逻辑,随着字符串长度增加,性能提升显著。对于 strchr() 和 strrchr(),手写汇编通过消除栈帧管理减少了固定开销。在短字符串上提升最为明显(此时函数调用开销占主导),而在 TCG 环境中,对于较长字符串,性能与 C 实现趋于一致。
合入补丁列表如下:
83feeb1 lib/string_helpers: string_get_size() now returns characters wrote
f0b7f8a lib/string_helpers: Add flags param to string_get_size()
29d8568 string: Convert selftest to KUnit
fb57550 string: Convert helpers selftest to KUnit
9259a47 string_kunit: Add test cases for str*cmp functions
b03442f string: Prepare to merge strscpy_kunit.c into string_kunit.c
bb8d9b7 string: Merge strscpy KUnit tests into string_kunit.c
6e4ef14 string: Prepare to merge strcat KUnit tests into string_kunit.c
bd678f7 string: Merge strcat KUnit tests into string_kunit.c
dde915c string: Convert KUnit test names to standard convention
0efc599 string.h: Introduce memtostr() and memtostr_pad()
c01c41e string_kunit: Move strtomem KUnit test to string_kunit.c
ae45f89 lib/string_kunit: add correctness test for strlen()
263dca2 lib/string_kunit: add correctness test for strnlen()
27b2810 lib/string_kunit: add correctness test for strrchr()
0020240 lib/string_kunit: add performance benchmark for strlen()
e73bcb3 lib/string_kunit: extend benchmarks to strnlen() and chr searches
5ba15d4 riscv: lib: add strnlen() implementation
adf5421 riscv: lib: add strchr() implementation
bef64bc riscv: lib: add strrchr() implementation