在Windows 10 Fall Creators Update(1709)之后,log4net在调用者位置信息变得非常慢

时间:2017-12-11 20:03:38

标签: c# performance windows-10 log4net system.diagnostics

我知道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。

任何人都可以确认这个问题或知道会发生什么事吗?

我很感激任何建议如何调试/修复它。提前谢谢!

1 个答案:

答案 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解决了这个问题。