C# NLog 性能类变量

标签 c# performance nlog

使用 NLog 似乎大大降低了我访问类变量的速度。当我按原样运行代码时,s1 大约比 s2 慢 2 倍,这是预期的。但是当我取消注释 GetCurrentClassLogger 行时,s1 变得比 s2 慢大约 800 倍。我正在使用 .NET Core 2 和 NLog 4.5.3。这是预期的行为吗?是什么导致性能下降?感谢您提供的所有帮助!

class Program
{
    //private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
    private static readonly DateTime _epoch = new DateTime(1970, 1, 1);

    static void Main(string[] args)
    {
        DateTime epoch = new DateTime(1970, 1, 1);
        int count = 10000;
        Stopwatch s1 = new Stopwatch();
        Stopwatch s2 = new Stopwatch();

        s1.Start();
        for (int i = 0; i < count; i++)
        {
            var x = DateTime.UtcNow.Subtract(_epoch).TotalSeconds;
        }

        s1.Stop();

        s2.Start();
        for (int i = 0; i < count; i++)
        {
            var x = DateTime.UtcNow.Subtract(epoch).TotalSeconds;
        }

        s2.Stop();

        Console.WriteLine(s1.ElapsedTicks);
        Console.WriteLine(s2.ElapsedTicks);
        Console.ReadLine();
    }
}

最佳答案

当您第一次访问类中的一个字段时,系统有必要初始化类中的所有静态字段——此时您的基准正在测量。注释掉第一行后,这只是将 _epoch 设置为新的 DateTime 实例。在第一行中,它还调用了 NLog 代码以初始化记录器。

当您访问 _epoch 时,您第一次访问类中的字段是在您的第一个循环中。这意味着它在 s1 内,所以它也在测量类初始化时间。如果您像这样修改代码:

class Program
{
    private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
    private static readonly DateTime _epoch = new DateTime(1970, 1, 1);

    static void Main(string[] args)
    {

        DateTime epoch = new DateTime(1970, 1, 1);
        int count = 10000;
        Stopwatch s1 = new Stopwatch();
        Stopwatch s2 = new Stopwatch();

        Stopwatch s3 = new Stopwatch();
        s3.Start();
        var e = _epoch;
        s3.Stop();

        s1.Start();
        for (int i = 0; i < count; i++)
        {
            var x = DateTime.UtcNow.Subtract(_epoch).TotalSeconds;
        }

        s1.Stop();

        s2.Start();
        for (int i = 0; i < count; i++)
        {
            var x = DateTime.UtcNow.Subtract(epoch).TotalSeconds;
        }

        s2.Stop();
        Console.WriteLine(s3.ElapsedTicks);
        Console.WriteLine(s1.ElapsedTicks);
        Console.WriteLine(s2.ElapsedTicks);
        Console.ReadLine();
    }
}

您可以看到大部分时间都花在 s3 中,因为那里有 _epoch 的访问,它在那里初始化那些静态成员。

关于C# NLog 性能类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49981732/

相关文章:

c# - 这个 ToArray() 实现如何更优化?

performance - 使用Hive/Hadoop连接两个排序的文件

javascript - 下划线上的 max 函数实现

C# - 使用 NLog 记录自定义异常

c# - 如何在 .NET/Visual Studio 中创建可浏览的类属性

c# - 使用 .net 将 vba 宏代码注入(inject) excel

c# - 如何在 C# 中的 WPF 应用程序中创建最近的文档历史记录

java - 如何遍历大目录的目录树并忽略文件

c# - 检查是否使用 nlog 消息

c# - 如何在 C# 中将对 STATIC 方法的引用作为函数参数传递?