在最近的Windows 10更新(Fall Creators Update)之后,我们的.NET c#4.0应用程序的性能下降了很多。我认为存在各种问题,其中之一是log4net(或磁盘IO)。
我们的应用程序非常复杂(各种WCF应用程序和ASPNET MVC 3.0应用程序),并且在开发中有很多log4net跟踪。在启动时加载第一页持续4或5分钟,在更新持续一分钟之前,如果我停用log4net性能。
我已经完成了两个克隆虚拟机的测试,在正则表达式操作后进行记录,并且差异很大。
代码:
static void Main(string[] args)
{
Log.Info("Log4net1");
DateTime start = DateTime.Now;
for (int i = 0; i < 50; i++)
{
DoTheThing();
}
TimeSpan elapsedTime = DateTime.Now - start;
Log.DebugFormat("TOTAL Elapsed time: {0}", elapsedTime.TotalMilliseconds);
Console.ReadKey();
}
private static void DoTheThing()
{
DateTime start = DateTime.Now;
Regex.Replace(TEXT, " nec ", m =>
{
return " (word nec) ";
});
TimeSpan elapsedTime = DateTime.Now - start;
Log.DebugFormat("Elapsed time: {0}", elapsedTime.TotalMilliseconds);
}
我已经使用log4net 1.2.1和2.0.8进行了测试:
beforeUpdate之前的平均值 - &gt;总累计时间:600毫秒
afterUpdate后的平均值 - &gt;总累计时间:1000毫秒
这对我们来说是一个非常重要的问题,我没有在网上找到任何信息。
- 更新 -
我在stackoverflow上发现了另一个(未答复的)线程: log4net became very slow with caller location information after Windows 10 Fall Creators Update (1709)
我在两种环境下都运行了磁盘基准测试,读/写速率没有显着差异。 我已经测试了应用程序完全禁用log4net(log4net threshold =“OFF”),现在时间非常相似,所以,正如@DalmTo评论,有很多可能性,这将是由于log4net,我会尝试在那里提出了一个问题,尽管已经有一个相关的微软问题:https://connect.microsoft.com/VisualStudio/feedback/details/3143189/after-installing-windows-10-1709-update-creating-a-stacktrace-class-has-become-a-magnitude-slower
答案 0 :(得分:5)
你可能会遇到这个问题:
从2017年10月开始,升级到Windows 10版本1709之后 或.NET Framework 4.7.1,您注意到显着减少 运行使用.NET Framework的.NET Framework应用程序时的性能 System.Diagnostics.StackFrame类。
应用程序在抛出.NET时通常依赖于StackFrame 例外。如果这种情况发生率很高(每次发生超过10起事件) 第二),应用程序可以显着减慢(十倍)并运行 明显比以前慢。
.NET Framework 4.7.1增加了对检测和解析的支持 便携式PDB文件格式,用于显示文件和行号信息 堆栈跟踪。作为此更改的一部分,堆栈跟踪中的每个函数 检查其定义模块以确定该模块是否使用 便携式PDB格式。
由于内部缓存存在一些差异 策略,运行时花费更多时间搜索便携式PDB 比以前的.NET Framework版本花在搜索经典上 Windows PDB。这会导致格式化的堆栈跟踪产生更多 比以前慢。
安装最新的.NET 4.7.1可靠性更新(KB4054856)应解决此问题。
包含以下修复: 大量使用System.Diagnostics.StackTrace或Exception.StackTrace的应用程序在.NET Framework 4.7.1上的运行速度可能会更慢。