我知道log4net的文档指出,调用者位置信息的记录可能非常慢,除非软件的性能不受影响,否则不应该使用它。
直到Windows 10 Fall Creators Update出现这种情况。这是一个小例子项目。
的app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
</configSections>
<log4net>
<appender name="DefaultAppender" type="log4net.Appender.RollingFileAppender">
<file value="logging.log" />
<encoding value="utf-8" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<!--without caller location information-->
<!--<conversionPattern value="%d | %-5p | %t | %m%n" />-->
<!--with caller location information-->
<conversionPattern value="%d | %-5p | %t | %C.%M:%L | %m%n" />
</layout>
</appender>
<root>
<level value="All" />
<appender-ref ref="DefaultAppender" />
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
Program.cs的
using System;
using System.Diagnostics;
using log4net;
namespace Log4Net.CSharp
{
class Program
{
private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
LoggingTest(1000);
Console.ReadKey();
}
private static void LoggingTest(int iterations)
{
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
Log.Info("Some info logging.");
}
Console.WriteLine($"Logging of {iterations} iterations took: {sw.ElapsedMilliseconds} ms.");
}
}
}
在Windows更新(1709)之后,具有呼叫者位置信息(如%C%M%L)的性能比没有呼叫者的位置信息差100倍。问题肯定与更新有关,因为在回滚后性能恢复正常。
Windows更新前的结果(1709)
w / o%C%M%L:记录1000次迭代:18 ms w%C%M%L:记录1000次迭代:81 ms。
Windows更新后的结果(1709)
w / o%C%M%L:记录1000次迭代:14 ms w%C%M%L:记录1000次迭代:1502 ms。
任何人都可以确认这个问题或知道会发生什么事吗?
我很感激任何建议如何调试/修复它。提前谢谢!
答案 0 :(得分:1)
微软已经更新了几天前提到的文章(https://support.microsoft.com/en-us/help/4057154/performance-of-system-diagnostics-stackframe-degrades-in-windows-10-17),正如Jeeze在评论中所说,新的更新(https://support.microsoft.com/en-us/help/4058258)独立于所使用的.NET Framework解决了这个问题。