Ho fatto qualche prova per vedere quanto spazio occupano in cache,indicativamente, dei file di testo ,i file di testo dovrebbero essere comparabili ,ai fini del test, a file-oggetti json od xml.Ho utilizzato la MemoryCache (.Net,Microsoft.Extensions.Caching.Memory) ed ho preso in considerazione la proprietà WorkingSet64 ,dell'oggetto Process, la quale "Ottiene la quantità di memoria fisica, in byte, allocata per il processo associato".Ho utilizzato un file di testo da circa 30 kbyte ed uno da circa 100kb ,il risultato è che lo spazio usato in memoria fisica dalla cache è circa da 2,2 a 2,8 volte lo spazio dei file su disco :
il model :
nella view :
i risultati (forse anche un pò noiosi :-) ):
esecuzione in debug con 10000 elementi da 100 kb
Altre proprietà dell'oggetto Process possono permettere di ricavare quali differenze comporta il caricamento degli oggetti riguardo a specifici aspetti della memoria ,queste sono : VirtualMemorySize64 , PagedMemorySize64, PagedSystemMemorySize64 ,NonpagedSystemMemorySize64
Il test è stato condotto all'interno di un'applicazione Asp .Net Core 2.2.
public class HomeController : Controller
{
private IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult LoadFile()
{
DateTime start = DateTime.Now;
Process p = Process.GetCurrentProcess();
long memoriaFisica = p.WorkingSet64;
ProcessModel b = new ProcessModel();
b.RamIniziale = memoriaFisica;
MemoryCacheEntryOptions opt = new MemoryCacheEntryOptions();
opt.Priority = CacheItemPriority.NeverRemove;
string data = null;
string path = @"C:\Users\gianmarco\Desktop\SourceCodeSafer.txt"; //30 kb su disco
string path100 = @"C:\Users\gianmarco\Desktop\SourceCodeSaferda100kb.txt"; //104 kb su disco
data = System.IO.File.ReadAllText(path);
int numeroOggettiInCache = 30000;
long counter = 0;
Random r = new Random();
while (counter < numeroOggettiInCache)
{
string k = counter.ToString();
data = data + k.Substring(0,1);
int position = r.Next(0, 28000);
data = data.Remove(position, 1);
_cache.CreateEntry("cucu" + counter.ToString());
_cache.Set("cucu" + counter.ToString(), data, opt);
counter++;
}
Process p1 = Process.GetCurrentProcess();
long memoriaFisicaPost = p1.WorkingSet64;
b.RamFinale = memoriaFisicaPost;
DateTime stop = DateTime.Now;
TimeSpan span = stop.Subtract(start);
int seconds = (int)span.TotalSeconds;
double milliseconds = span.TotalMilliseconds;
b.Seconds = seconds;
b.Milliseconds = milliseconds;
return View("ProcessModelView",b);
}
lo snippet sottostante serve ad evitare che si abbiano valori identici per i quali si potrebbero avere più chiavi che si riferiscono ad un solo elemento rendendo meno "realistico" il test :
string k = counter.ToString();
data = data + k.Substring(0,1);
int position = r.Next(0, 28000);
data = data.Remove(position, 1);
il model :
public class ProcessModel
{
public ProcessModel()
{
}
public double RamIniziale { get; set; }
public double RamFinale { get;set; }
public double DifferenzaRam {
get { return (RamFinale - RamIniziale); }
}
public int Seconds { get; set; }
public double Milliseconds { get; set; }
}
nella view :
@model CacheTester.Models.ProcessModel;
<span> differenza ram: @Model.DifferenzaRam</span> <br />
<span> iniziale ram: @Model.RamIniziale</span><br />
<span> finale ram: @Model.RamFinale</span><br />
<span> numero millisecondi esecuzione: @Model.Milliseconds</span>
i risultati (forse anche un pò noiosi :-) ):
esecuzione
in debug con 10000 elementi da 100 kb
differenza
ram: 2882936832
iniziale ram: 69353472
finale ram: 2952290304
numero millisecondi esecuzione: 2634,2848
iniziale ram: 69353472
finale ram: 2952290304
numero millisecondi esecuzione: 2634,2848
esecuzione
in debug con 10000 elementi da 100 kb
differenza
ram: 3179827200
iniziale ram: 69287936
finale ram: 3249115136
numero millisecondi esecuzione: 2205,4243
iniziale ram: 69287936
finale ram: 3249115136
numero millisecondi esecuzione: 2205,4243
esecuzione
in debug con 10000 elementi da 100 kb
differenza
ram: 3251249152
iniziale ram: 69599232
finale ram: 3320848384
numero millisecondi esecuzione: 2013,1927
iniziale ram: 69599232
finale ram: 3320848384
numero millisecondi esecuzione: 2013,1927
esecuzione in debug con 10000 elementi da 100 kb
differenza
ram: 3065356288
iniziale
ram: 69341184
finale ram: 3134697472
numero millisecondi esecuzione: 1983,0739
finale ram: 3134697472
numero millisecondi esecuzione: 1983,0739
esecuzione
in debug con 10000 elementi da 100 kb
differenza
ram: 2885455872
iniziale ram: 69283840
finale ram: 2954739712
numero millisecondi esecuzione: 3337,625
iniziale ram: 69283840
finale ram: 2954739712
numero millisecondi esecuzione: 3337,625
esecuzione
non in debug con 10000 elementi da 100kb
differenza
ram: 3202289664
iniziale ram: 64741376
finale ram: 3267031040
numero millisecondi esecuzione: 1789,5347
iniziale ram: 64741376
finale ram: 3267031040
numero millisecondi esecuzione: 1789,5347
esecuzione
non in debug con 10000 elementi da 100kb
differenza
ram: 2725826560
iniziale ram: 65175552
finale ram: 2791002112
numero millisecondi esecuzione: 1605,974
iniziale ram: 65175552
finale ram: 2791002112
numero millisecondi esecuzione: 1605,974
esecuzione
non in debug con 10000 elementi da 100kb
differenza
ram: 3238813696
iniziale ram: 64675840
finale ram: 3303489536
numero millisecondi esecuzione: 1955,8279
iniziale ram: 64675840
finale ram: 3303489536
numero millisecondi esecuzione: 1955,8279
esecuzione
non in debug con 10000 elementi da 100kb
differenza
ram: 2988351488
iniziale ram: 65122304
finale ram: 3053473792
numero millisecondi esecuzione: 1940,5237
iniziale ram: 65122304
finale ram: 3053473792
numero millisecondi esecuzione: 1940,5237
esecuzione
non in debug con 10000 elementi da 100kb
differenza
ram: 3047837696
iniziale ram: 64446464
finale ram: 3112284160
numero millisecondi esecuzione: 2379,3362
iniziale ram: 64446464
finale ram: 3112284160
numero millisecondi esecuzione: 2379,3362
esecuzione
in debug con 30000 elementi da 30kb:
differenza
ram: 2058817536
iniziale ram: 68984832
finale ram: 2127802368
numero millisecondi esecuzione: 2496,5551
iniziale ram: 68984832
finale ram: 2127802368
numero millisecondi esecuzione: 2496,5551
esecuzione
in debug con 30000 elementi da 30kb:
differenza
ram: 2188320768
iniziale ram: 69689344
finale ram: 2258010112
numero millisecondi esecuzione: 1966,4472
iniziale ram: 69689344
finale ram: 2258010112
numero millisecondi esecuzione: 1966,4472
esecuzione
in debug con 30000 elementi da 30kb:
differenza
ram: 2067914752
iniziale ram: 69414912
finale ram: 2137329664
numero millisecondi esecuzione: 2425,9552
iniziale ram: 69414912
finale ram: 2137329664
numero millisecondi esecuzione: 2425,9552
esecuzione
non in debug con 30000 elementi da 30kb:
differenza
ram: 2011680768
iniziale ram: 65171456
finale ram: 2076852224
numero millisecondi esecuzione: 2658,862
iniziale ram: 65171456
finale ram: 2076852224
numero millisecondi esecuzione: 2658,862
esecuzione
non in debug con 30000 elementi da 30kb:
differenza
ram: 2065113088
iniziale ram: 64823296
finale ram: 2129936384
numero millisecondi esecuzione: 1874,3063
iniziale ram: 64823296
finale ram: 2129936384
numero millisecondi esecuzione: 1874,3063
esecuzione
non in debug con 30000 elementi da 30kb:
differenza
ram: 2311376896
iniziale ram: 64544768
finale ram: 2375921664
numero millisecondi esecuzione: 1937,1918
iniziale ram: 64544768
finale ram: 2375921664
numero millisecondi esecuzione: 1937,1918
esecuzione
non in debug con 30000 elementi da 30kb:
differenza
ram: 2110238720
iniziale ram: 64536576
finale ram: 2174775296
numero millisecondi esecuzione: 2131,8403
iniziale ram: 64536576
finale ram: 2174775296
numero millisecondi esecuzione: 2131,8403
esecuzione
non in debug con 30000 elementi da 30kb:
differenza
ram: 2058924032
iniziale ram: 64565248
finale ram: 2123489280
numero millisecondi esecuzione: 2072,0094
iniziale ram: 64565248
finale ram: 2123489280
numero millisecondi esecuzione: 2072,0094
Il test è stato condotto all'interno di un'applicazione Asp .Net Core 2.2.
Nessun commento:
Posta un commento