【发布时间】:2022-10-23 20:00:50
【问题描述】:
是否值得努力尝试并积极处置此代码中的Dictionary,还是将其留给托管垃圾收集?
private void LogReprocessTsk(List<ReprocessTsk> reprocessTsks)
{
foreach (ReprocessTsk reprocessTsk in reprocessTsks)
{
Dictionary<string, string> logMessage = new Dictionary<string, string>
{
{ "Message", "insert into REPROCESS_TSK - parentId changed" },
{ "TSKLOC", reprocessTsk.TSKLOC },
{ "CRS", reprocessTsk.CRS.ToString() },
{ "PROCESSED", reprocessTsk.PROCESSED.ToString() },
{ "OldParentId", reprocessTsk.OldParentId },
{ "NewParentId", reprocessTsk.NewParentId }
};
_logger.LogInformation(JsonConvert.SerializeObject(logMessage));
}
}
【问题讨论】:
-
过早优化不是一个好主意。你有一个只有字符串的字典。为什么这有关系什么时候垃圾收集发生了吗?您是否因此测量了应用程序中有意义的瓶颈?
-
这也可能是一个 X/Y 问题,因为您正在为 JSON 序列化它的灵魂目的创建一个字典。您的记录器方法可以不采用复杂的对象吗?
-
过早优化不是一个好主意——明白了。我会把它留给垃圾收集。我只是想知道,因为在一个紧密的循环中,可能有任意数量的它们。但是,这永远不会导致瓶颈(我认为),因为与今天的内存资源相比,字符串系列的成本微不足道。
-
您可以在循环之前创建一个字典并调用
logMessage.Clear();,而不是每次都重新创建字典。其他解决方案:只需保留相同的字典而不清除它,然后使用logMessage["key"] = "value";重新分配条目。这会自动替换任何现有条目并添加新条目。 -
应该只处理非托管资源,如连接或文件等。GC应该在这里完成它的工作。您应该根据建议进行优化。
标签: c# .net dictionary coding-style dispose