2012-04-03 117 views
1

在SQL Server时,我要检查的表现,我清除所有缓冲区 - 为了获得真正的结果是:我用清除C#性能测试缓冲区?

CHECKPOINT 1 
    DBCC DROPCLEANBUFFERS 
    dbcc FREEPROCCACHE 

,然后我检查差异GetDate()'s

什么命令之间我应该在C#中使用以清除任何缓冲区/“速度助手”机制? (我打算使用秒表)。

THanks。

+1

这很大程度上取决于您的代码的功能。你能提供更多细节吗?另外,一般来说,性能测量应该在任何耗时的初始化之后完成,并且在算法运行足够长的时间后进入稳定状态。 – jnylen 2012-04-03 20:04:21

+0

@jnylen我不在乎代码。我关心防止缓存被第二次考虑。我希望所有> 1次与第一次执行相同。我需要清除缓冲区。怎么样? – 2012-04-03 20:06:01

+0

Royi Namir:什么缓存?什么缓冲区?没有包含所有潜在算法的“C#代码缓冲区/速度助手”,这就是我要求澄清的原因。正如zmbq所提到的,编译器和CPU缓存等低级构造对于实际性能非常重要,应该在基准测试中进行测量。 – jnylen 2012-04-03 20:18:27

回答

1

.NET程序有很多“缓存”,并不是所有的都可以被清除。您拥有的CPU缓存不仅可以通过您的进程填充,还可以通过计算机上运行的其他进程填充。第一次调用函数时会产生抖动,这使得第一次迭代比其他任何迭代都要长。如果您使用的是任何类型的I/O,那么您也有这些缓存和缓冲区。

此外,为什么要清除缓存?他们在那里帮助你。在现实世界中,缓存命中将有助于您的性能 - 为什么不考虑缓存和缓冲区时衡量程序的性能?

无论如何,我认为你应该使用探查器而不是Stopwatch来衡量你的表现。这也适用于SQL Server。