c# - 从方法返回的开销

标签 c# sql-server networking latency

我有一个方法 A() 可以处理一些查询。此方法从左括号到其返回语句之前的时间为 +/- 70 毫秒。其中 50% 来自打开连接,大约 20% 来自实际查询,5-10% 用于某些内存访问,其余(可能)用于处理连接、命令和阅读器。

虽然这么大的时间用于处理连接已经够烦人了,但更让我困扰的是当我从方法 B() 调用 A() 时:

B()
{
    var timer = Stopwatch.Startnew()
    A(); 
    timer.Stop(); // elapsed: +/- 250ms
    Debugger.Break();
}

又增加了 180 毫秒的延迟,我似乎无法弄清楚原因。我已经尝试让 A 返回 null,但没有任何改变。

唯一的磁盘 I/O 和网络发生在 A 中。我认为从磁盘和网络到本地内存的传输应该发生在 A 中,因此 B 对 A 的调用不应该受此影响,但显然不是这种情况?这是我在这里遇到的网络延迟吗?如果是这样,那为什么当我让 B 返回 null 时也会发生这种情况?

目前我没有其他解释...

  • 一切都在同一个程序集中,
  • 在没有附加调试器的情况下进行测量没有任何改变,
  • 返回“null”立即显示 0 毫秒,返回 null 而不是正常的返回值不会改变任何内容(但强化了这在某种程度上与延迟相关的想法)。

A大致实现如下,就像访问数据库的任何简单方法一样。它是人为设计的,但显示了基本思想和流程:

A()
{   
    var totalTimer = Stopwatch.StartNew();
    var stuff = new Stuffholder();

    using(connection)
    {
         using(command)
         {
              using(reader) 
              { 
                  // fill 'stuff' 
              }
         } 
    }

    totalTimer.Stop(); // elapsed: +/- 70ms
    return stuff;
}

有什么想法吗?

最佳答案

您看到的开销是由于即时编译造成的。第一次方法 B() 被调用方法 A() 还没有被本地编译(它作为 IL 在 dll 中被部分编译),所以你会看到轻微的滞后而编译器将A()编译成机器码。

在分析方法调用时,重要的是调用该方法多次并取平均时间(如果您愿意,可以放弃第一次调用,尽管调用次数足够多编译开销应该变得微不足道)。

关于c# - 从方法返回的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659463/

相关文章:

c# - 无法在Visual Studio 2017 Professional中运行单元测试

sql-server - 具有 UNIQUE 索引的列中存在多个 NULL 值

C#获取系统网络使用情况

c# - 从 linq 在新对象中创建新属性

c# - 如何在控件中创建可编辑单元格:DataGrid in UWP?

sql - sql server中的空间索引

c - 如何用c检查互联网连接?

c# - 如何扫描网络以查找特定外设

c# - XML XPath 问题

sql-server - 在 SQL Server 中插入时根据 ID 计算的列值