内存分配的测量时间

时间:2012-03-29 08:10:50

标签: c# memory-management

我想使用此代码测量时间内存分配:

long AForMemory = DateTime.Now.Ticks;
double[] massDoubleForMemory = new double[num];
long BForMemory = DateTime.Now.Ticks;
long rezult = BForMemory - AForMemory;

但是,无论num(100k或1M)多少,rezult = 0或10001(随机)。为什么?或者它是正确的衡量方法吗?

2 个答案:

答案 0 :(得分:0)

DateTime不够精确,无法确保如此小的时间差距。您可以使用System.SDiagnostics命名空间

中的秒表
int num = 1024 * 1024;
Stopwatch sw = new Stopwatch();
sw.Start();
long AForMemory = DateTime.Now.Ticks;
double[] massDoubleForMemory = new double[num];
sw.Stop();
long elapsed = sw.ElapsedTicks;

如果您尝试诊断某些类型的分配所产生的影响,那么您很可能会查看错误的位置。 .NET中的分配可能非常快或非常慢。例如,如果分配之前是垃圾收集,或者垃圾收集器需要保留新的内存块以满足您的请求,那么与gc收集器有足够可用空间相比,请求本身可能需要很长时间。 GC是动态的,它可以随时确定执行一些繁重的操作。

除此之外,真正的性能问题来自垃圾收集,而不是分配。

答案 1 :(得分:0)

这很可能是衡量时间的正确方法。在人们习惯的O(x)形式中,分配内存并不是真正可以表示的;块的大小并没有真正改变分配时间,如果内存量可用,则分配。

有关更详细和精心编写的答案,请参阅此问题: Time complexity of memory allocation

但是为了将来参考,您可能想要研究'System.Diagnostics.StopWatch'类,它包含一些测量经过时间的好方法。 http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx