我正在使用Open 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);
}
}
当我试图创建一个Excel表,其中有大约90,000 - 92,000行,行与IF上面代码中的条件消耗700秒才能完成。(用性能分析器检查,这一行也有1,279,999,998命中计数) .
如何减少与IF行连接的时间?上述代码中的条件消耗?
有没有更好的方法用更少的时间实现这个目标?
如果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<TKey, TValue>
。
但是正如其他人指出的那样,你有这么多命中计数似乎很奇怪。在您的应用程序中可能存在需要跟踪的递归。