2012-03-29 213 views
1

的Measurment一次我要使用此代碼來測量時間內存分配:內存分配

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(隨機)。爲什麼?或者它是正確的衡量方式?

+0

您從測量這個好處會有什麼好處?這不是你能以任何方式影響的東西。 – Groo 2012-03-29 08:22:58

回答

0

DateTime不夠精確,不足以衡量如此小的時間間隔。您可以使用該秒錶從System.Diagnostics命名空間

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是動態的,可以隨時決定是否執行一些繁重的操作。

除此之外,真正的性能問題來自垃圾回收,而不是分配。

0

這很可能是時間的正確測量。分配內存在人們習慣的O(x)表單中並不真正表示;塊的大小並不會真正改變分配時間,如果內存量可用,則會分配它。

更詳盡的和寫得很好的答案,看到這個問題: Time complexity of memory allocation

但你可能要調查「System.Diagnostics.StopWatch」級將來參考,它包含了用於測量一些不錯的方法經過的時間。 http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx