代码之家  ›  专栏  ›  技术社区  ›  Dejan Scott Dorman

DateTime字典在调试模式下更快?

  •  0
  • Dejan Scott Dorman  · 技术社区  · 7 年前

    我试图衡量一些性能,但我偶然发现了一些非常违反直觉的结果,我不敢相信。即,查询 Dictionary<DateTime> 在调试模式下,比在发布模式下。

    显然,这个错误一定在我的测量例程中-但是在哪里?这是:

            Dictionary<DateTime, int> d1 = new Dictionary<DateTime, int>();
    
            // fill the dictionary
            DateTime now = DateTime.Now;
            const int items = 100000;
            for (int i = 0; i < items; i++)
            {
                DateTime item = now.AddSeconds(-i);
                d1.Add(item, i);
            }
            Console.WriteLine("Items ready");
    
            const int calls = 100000000;
            DateTime queryDate = DateTime.Now;
    
            // query the dictionary
            var stopwatch = Stopwatch.StartNew();
            for (int i = 0; i < calls; i++)
            {
                int j;
                if (d1.TryGetValue(queryDate, out j))
                {
                    throw new InvalidOperationException();
                }
            }
            stopwatch.Stop();
            Console.WriteLine("{0}ms", stopwatch.ElapsedMilliseconds);
    

    我检查/尝试的内容:

    • 项目设置只是VS 2015的默认设置:“优化代码”已检查是否发布,但未检查是否调试。要复制,只需创建一个新的控制台应用程序项目,并将代码复制粘贴到 Program .
    • int 作为字典的键类型,发布模式 比预期的调试速度稍快。

    请帮我揭开我的盲点!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dejan Scott Dorman    7 年前

    优化器无法对这段代码做太多改进。有两种基本方法可以设置TryGetValue()调用的堆栈帧。代码生成器使用了一种方式,即“现代”方式,将参数直接写入堆栈。但是优化器使用了另一种方式,即使用推送的“旧”方式。效率较低的方法。这是针对x86抖动的,x64抖动没有这个问题。