C# dotnet 使用 startIndex 提升 IndexOf 的性能
时间:2022-07-22
本文章向大家介绍C# dotnet 使用 startIndex 提升 IndexOf 的性能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在代码审查 WPF 仓库的时候,小伙伴告诉我说使用 dotnet core 版本的 WPF 开了 ReadyToRun 的提升还不够大,他准备开始一大波业务无关的优化,其中就包含了 xaml 中的字符串相关优化。我在 davidwrighton 大大的优化代码和 pentp 大大的代码审查里面学到了使用 startIndex 提升 IndexOf 的性能,本文就来和大家分享一下
假定只有一个字符的匹配,例如从字符串里面找到 :
属于第几个字符,可以如何写?最简单的是如下面代码
int colonIdx = uriInput.IndexOf(":");
上面代码是 WPF 的源代码,优化之前的代码 Baml2006Reader.cs ae1790531 在 Use faster char based overload of String.IndexOf 优化之后的代码是 Baml2006Reader.cs 00a26a27 可以看到优化就是将只有一个字符的字符串替换为字符
int colonIdx = uriInput.IndexOf(':');
这样写能提升不少的性能,为什么呢?答案是显然的,我就不多说了
而即使是这样的优化,在 Pent Ploompuu 大佬看起来依然有优化空间,那就是 startIndex 参数,从业务上,在这里进来的参数都是至少超过4个字符,这就是我为什么选用这个例子的原因
在业务上,会输入的 uri 合法的输入一定不会在第一个字符里面就包含了 :
一般都是在第 4 个字符。假定在第 4 个字符之前存在 :
那么也是不合法的
此时的优化就是添加 startIndex 进行更快速的寻找
当然,这必须需要了解业务才能这样做的哦,不然就是挖坑了
例如输入是以下代码
a:bc:a
此时如果加上 startIndex 跳过了 4 个字符,那么刚好返回以为预期的值,但事实上的输入是不合法的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 单双击实现的方法步骤
- Android多渠道打包时获取当前渠道的方法
- Flutter Dio二次封装的实现
- android开发通过Scroller实现过渡滑动效果操作示例
- Android9.0 静默安装源码的实现
- Flutter路由框架Fluro使用简介
- Android倒计时神器(CountDownTimer)
- Kotlin如何安全访问lateinit变量的实现
- Android实现加载对话框
- Android RecyclerView实现悬浮吸顶、分隔线、到底提示效果
- Android监听键盘状态获取键盘高度的实现方法
- android实现小音频频繁播放
- 每日一个知识点:什么时候会触发Full GC
- 拥抱kotlin之如何习惯使用kotlin高阶函数
- Android中调用另一个Activity并返回结果(选择头像功能为例)