gpt4 book ai didi

c# - 遍历原子提要的最快方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:53 25 4
gpt4 key购买 nike

我正在编写一个对性能非常关键的程序。我正在轮询一个通常有大约 50 个条目的原子提要。我需要通过这个解析才能尽快得到uri链接。

目前我正在这样做:

var feedUrl = "my path";

using (var feedReader = XmlReader.Create(feedUrl))
{
var feedContent = SyndicationFeed.Load(feedReader);
if (null == feedContent) return null;

foreach (var item in feedContent.Items.Reverse())
{
if (item.Title.Text.Contains("Some text I am looking for"))
{
foreach (var link in item.Links)
{
uri = link.Uri;
}
}
}
}

我从许多来源了解到,使用 for 循环比使用 foreach 快得多,因此我尝试实现这一点,但不断收到一些错误,提示无法对 SyndicationItem 应用索引。这似乎是因为 SyndicationItem 是一个 IEnumerable。

所以这给我留下了两个问题:1.) 是否有更好更高效/更快的方法来做到这一点2.) 我目前正在实现最佳解决方案吗?

最佳答案

绝大多数时间可能花在往返行程中,首先是获取 Feed。通常,网络延迟时间会使迭代集合所需的时间相形见绌。

但是,您的 feedContent.Items 可能没有立即完全加载到内存中,因此迭代此集合的 Reverse 可能会导致更多比你需要的开销。我个人建议使用 LINQ 语句一次性获取您想要的项目,然后调用 .ToList() 将结果放入内存中的集合中,该集合在调用 .Reverse().

var uris = 
(from item in feedContent.Items
where item.Title.Text.Contains(searchTerm)
from link in item.Links
select link.Uri)
.ToList()
.Reverse();

或者,如果您只对单个 URI 感兴趣(您的代码使它看起来像是您只是想在第一个匹配项中以第一个 URI 结束),您也可以调用 。 FirstOrDefault() 并完全跳过 ReverseToList:

var uris = 
(from item in feedContent.Items
where item.Title.Text.Contains(searchTerm)
from link in item.Links
select link.Uri)
.FirstOrDefault()

更新

我稍微玩了一下,并且(正如我所怀疑的那样)这个程序大约 95% 的成本(针对 Blogger 上包含 25 个项目的提要进行测试)用于调用 XmlReader.Create() SyndicationFeed.Load()。尝试优化 for 循环就像用千分尺测量,用蜡笔做标记,然后用斧头切割。

更新2

回应您的评论:是的,有办法,而且也很简单。

var updateTimesByUri = 
(from item in feedContent.Items
where item.Title.Text.Contains(searchTerm)
from link in item.Links
select new {link.Uri, item.LastUpdatedTime})
.ToDictionary(l => l.Uri, l => l.LastUpdatedTime)

重申一下,这不会给您带来任何显着的性能改进,但代码更能表达您真正想要做的事情,因此更容易维护。

关于c# - 遍历原子提要的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106459/

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