我可以调整 IndexOf 选择吗?
Can I tune IndexOf selection?
我已经对应用程序进行性能分析很长时间了
原来大部分CPU被IndexOf函数用到了
这里是函数
public static string func_Fix_Google_Source(string srSource)
{
int irIndex = srSource.IndexOf("<div id=\"gt-form-c\">");
return srSource.Substring(irIndex);
}
字符串的长度有关系吗?我相信我可能会缩短搜索字符串的长度
如果子串搜索成为瓶颈,您可以切换到高级算法,例如KMP。
当您有很多 "false positives" 时,默认的字符串搜索可能会非常昂贵,例如很多
<div id="...
在正在搜索的文本中。
每次在匹配未开始的位置发现上述前缀时,默认算法都会遵循它,直到确认没有匹配为止,然后转到下一个位置。相比之下,KMP跳过了很多它已经看到的字符,提高了效率。
IndexOf(string) 重载除了改进您的搜索方式(看起来您可能已经通过评论完成了搜索)之外,还使用当前区域性进行比较。
使用 StringComparision 重载进行序号搜索将提供更好的性能。取决于你在做什么 ~8x.
int irIndex = srSource.IndexOf("<div id=\"gt-form-c\">", StringComparison.Ordinal);
我已经对应用程序进行性能分析很长时间了
原来大部分CPU被IndexOf函数用到了
这里是函数
public static string func_Fix_Google_Source(string srSource)
{
int irIndex = srSource.IndexOf("<div id=\"gt-form-c\">");
return srSource.Substring(irIndex);
}
字符串的长度有关系吗?我相信我可能会缩短搜索字符串的长度
如果子串搜索成为瓶颈,您可以切换到高级算法,例如KMP。
当您有很多 "false positives" 时,默认的字符串搜索可能会非常昂贵,例如很多
<div id="...
在正在搜索的文本中。
每次在匹配未开始的位置发现上述前缀时,默认算法都会遵循它,直到确认没有匹配为止,然后转到下一个位置。相比之下,KMP跳过了很多它已经看到的字符,提高了效率。
IndexOf(string) 重载除了改进您的搜索方式(看起来您可能已经通过评论完成了搜索)之外,还使用当前区域性进行比较。
使用 StringComparision 重载进行序号搜索将提供更好的性能。取决于你在做什么 ~8x.
int irIndex = srSource.IndexOf("<div id=\"gt-form-c\">", StringComparison.Ordinal);