gpt4 book ai didi

c# regex 高cpu使用率

转载 作者:太空狗 更新时间:2023-10-29 21:34:09 25 4
gpt4 key购买 nike

我的小程序正在检查网站使用的脚本类型,它使用了超过 80% 的 cpu i7 处理器。请问这正常吗?

代码:

public static class EnginesMatcher
{

public static readonly Regex Drupal1 =
new Regex(
@"/misc/drupal\.js|Drupal\.settings|href=""http://drupal\.org""|\?q=node/[0-9]+|/\?q=user/register|/\?q=user/password|/user/register\?destination|<li class=""collapsed""><a href=""/node/add"">|/dpl3/files/|/modules/node/",
RegexOptions.Compiled);

public static readonly Regex XE1 =
new Regex(
@"XpressEngine|content=""zeroboardXE|content=""xe_board""|var zbxe_session_name|/xe\.css\?2|/xeicon/favicon\.ico""|#xe-editor-container-1|xpress_xeditor",
RegexOptions.Compiled);

//and 60 more such regex

在另一个类(class)

  public async Task<Result> Match(string url)
{

if (!await Open(url).ConfigureAwait(false)) return ResultKey;


if (EnginesMatcher.Drupal1.IsMatch(html))
{
return new Result()
{
Key = AResultKey.Success,
LogFile = "Drupal.txt",
Message = "Drupal",
Url = url
};
}
if (EnginesMatcher.XE1.IsMatch(html))
{
return new Result()
{
Key = AResultKey.Success,
LogFile = "Drupal.txt",
Message = "Drupal",
Url = url
};
}

Match(url) 函数在 ForeachAsyncLoop 中,程序检查大约 4000 个链接/分钟。当我禁用所有正则表达式时,它最多使用 20% 的 CPU,我可以提高正则表达式的性能吗?强调文本

最佳答案

您可能无法使用正则表达式加快速度。但是,使用不同的算法可能会做得更好。

Aho-Corasick string matching algorithm旨在准确地完成您正在做的事情:在大量文本中寻找一组固定的字符串。

标准算法不支持正则表达式,但您的正则表达式是逐字字符串。也就是说,您正在寻找 this|that|something else|something more。这与查找四个不同的字符串相同。

我发布了 Aho-Corasick algorithm in C# 的实现几年前。通过对您做事的方式进行一些修改,它应该会运行良好。

首先构建一个包含您要查找的字符串和相应网站的字典:

Dictionary<string, string> StringsToSites = new Dictionary<string, string>();

然后,添加字符串。例如,对于 Drupal,您将添加:

StringsToSites.Add("/misc/drupal\.js", "Drupal");
StringsToSites.Add("Drupal.settings", "Drupal");
StringsToSites.Add(@"href=""http://drupal\.org"", "Drupal");
// problem with this one ... |\?q=node/[0-9]+
StringsToSites.Add("?q=user/register", "Drupal");
// etc., etc.

请注意,非逐字字符串的内容存在问题。实现无法匹配“?q=node/[0-9]+/”。我们能做的最好的事情就是添加字符串“?q=node/”。

然后,创建一个匹配器并填充它:

AhoCorasickStringSearcher matcher = new AhoCorasickStringSearcher();
foreach (var key in StringsToSites.Keys)
{
matcher.AddItem(key);
}
matcher.CreateFailureFunction();

然后,对于您看到的每个链接,调用 matcher.Search:

var Matches = matcher.Search(link);    

这将为您提供 StringMatch 对象的集合。您可以在字典中查找 Text 以查看它与哪个站点匹配。例如:

foreach (var m in Matches)
{
string site;
if (StringsToSites.TryGetValue(m.Text, out site))
{
Console.WriteLine("Text '{0}' matches site '{1}'.", m.Text, site);
}
}

我希望它至少比您的正则表达式解决方案快 10 倍,可能快 100 倍。

关于c# regex 高cpu使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com