我有一个方法 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/