首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高TryGetValue的性能

提高TryGetValue的性能
EN

Stack Overflow用户
提问于 2022-04-27 03:51:11
回答 1查看 71关注 0票数 0

我正在使用开放XML SDK创建一个Excel文件。在这个过程中,我有一个场景如下所示。

如果键不存在,我需要将数据添加到Dictionary<uint, string>中。为此,我正在使用下面的代码。

代码语言:javascript
复制
var dataLines = sheetData.Elements<Row>().ToList();

for (int i = 0; i < dataLines.Count; i++)
{
    var x = dataLines[i];
    if (!dataDictionary.TryGetValue(x.RowIndex.Value, out var res)) // 700 seconds, 1,279,999,998 Hit counts
    {
        dataDictionary.Add(x.RowIndex.Value, x.OuterXml);
    }
}

当我试图创建一个包含90,000至92,000行的Excel表时,上面代码中的IF条件行将消耗700秒来完成。(使用性能分析器检查,此行也有1,279,999,998次命中计数)。

如果以上代码中的条件消耗了,我如何减少使用的时间?

有什么更好的方法可以用更少的时间来完成这个任务吗?

EN

回答 1

Stack Overflow用户

发布于 2022-04-27 05:23:39

如果if语句速度慢,一个选项是完全消除它,并使用字典的索引器来设置值。这意味着“最后一场比赛将获胜”。如果你想要“第一场比赛获胜”,你所要做的就是扭转你正在迭代列表的顺序。

代码语言:javascript
复制
var dataLines = sheetData.Elements<Row>().ToList();

for (int i = dataLines.Count - 1; i >= 0; i--)
{
    var x = dataLines[i];
    dataDictionary[x.RowIndex.Value] = x.OuterXml;
}
  • 如果x.RowIndex.Value是唯一的,那么迭代的方向并不重要。
  • 如果键按升序排序很重要,则可以使用SortedDictionary

但正如其他人所指出的,你有这么多命中数似乎很奇怪。应用程序中可能存在需要跟踪的递归。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72023048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档