我正在使用开放XML SDK创建一个Excel文件。在这个过程中,我有一个场景如下所示。
如果键不存在,我需要将数据添加到Dictionary<uint, string>中。为此,我正在使用下面的代码。
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次命中计数)。
如果以上代码中的条件消耗了,我如何减少使用的时间?
有什么更好的方法可以用更少的时间来完成这个任务吗?
发布于 2022-04-27 05:23:39
如果if语句速度慢,一个选项是完全消除它,并使用字典的索引器来设置值。这意味着“最后一场比赛将获胜”。如果你想要“第一场比赛获胜”,你所要做的就是扭转你正在迭代列表的顺序。
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。但正如其他人所指出的,你有这么多命中数似乎很奇怪。应用程序中可能存在需要跟踪的递归。
https://stackoverflow.com/questions/72023048
复制相似问题