public unsafe void MeasureTeaFileRawMemoryMappedTick(Runner runner) { long N = runner.N; RawMemoryMapping <Tick> view = null; File.Delete(filename); using (var tf = TeaFile <Tick> .Create(filename)) { for (int i = 0; i < N; i++) { tf.Write(new Tick { Price = i }); } } runner.Measure("memmap raw sum using ticks", () => { using (view = TeaFile <Tick> .OpenRawMemoryMapping(filename)) { double sum = 0d; Tick *tick = (Tick *)view.ItemAreaStart; for (int i = 0; i < N; i++) { sum += tick->Price; tick++; } Console.WriteLine(sum); if (sum != runner.TargetValue) { throw new Exception("wrong result"); } } }); }
static Statistics GetSessionDataMemMapped(string filename) { using (var mf = RawMemoryMapping <Tick> .OpenRead(filename)) unsafe { var stats = new Statistics(); Tick * firstTick = (Tick *)mf.ItemAreaStart; double minPrice = firstTick->Price; double maxPrice = firstTick->Price; var session = new TradingSession(firstTick->Time); stats.Sessions.Add(session); for (var t = firstTick; t != mf.ItemAreaEnd; t++) { if (t->Time >= session.End) { session = new TradingSession(t->Time); stats.Sessions.Add(session); } session.TickCount++; minPrice = Math.Min(t->Price, minPrice); maxPrice = Math.Max(t->Price, maxPrice); } stats.MinPrice = minPrice; stats.MaxPrice = maxPrice; return(stats); } }
public unsafe void MeasureTeaFileRawMemoryMapped(Runner runner) { long N = runner.N; RawMemoryMapping <double> view = null; //string copyfilename = "copy" + filename; //if (File.Exists(copyfilename)) File.Delete(copyfilename); //File.Copy(filename, copyfilename); //if(File.Exists(filename)) File.Delete(filename); runner.Measure("TeaFile<double>.OpenRawMemoryMapping", () => { view = TeaFile <double> .OpenRawMemoryMapping(filename); }); runner.Measure("memmap raw sum += view[i]", () => { double sum = 0d; double *p = (double *)view.ItemAreaStart; for (int i = 0; i < N; i++) { sum += *p; p++; } Console.WriteLine(sum); if (sum != runner.TargetValue) { throw new Exception("wrong result"); } }); runner.Measure("memmap raw sum += view[i] 2nd run", () => { double sum = 0d; double *p = (double *)view.ItemAreaStart; for (int i = 0; i < N; i++) { sum += *p; p++; } Console.WriteLine(sum); if (sum != runner.TargetValue) { throw new Exception("wrong result"); } }); runner.Measure("memmap raw sum += view[i] 3rd run", () => { double sum = 0d; double *p = (double *)view.ItemAreaStart; for (int i = 0; i < N; i++) { sum += *p; p++; } Console.WriteLine(sum); if (sum != runner.TargetValue) { throw new Exception("wrong result"); } }); runner.Measure("memmap raw sum += view[i] 4th run, pointer only", () => { double sum = 0d; double *p = (double *)view.ItemAreaStart; double *end = (double *)view.ItemAreaEnd; while (p < end) { sum += *p; p++; } Console.WriteLine(sum); if (sum != runner.TargetValue) { throw new Exception("wrong result"); } }); view.Dispose(); view = null; }