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"); } } }); }
public unsafe void AccessItemsViaMemoryMappingPointers() { const string filename = "AccessItemsViaMemoryMappingPointers.tea"; using (var f = TeaFile <Tick> .Create(filename)) { var dt = new DateTime(2000, 1, 1); for (int i = 0; i < 3; i++) { f.Write(new Tick { Time = dt.AddDays(i), Volume = i * 10 }); } } using (var view = TeaFile <Tick> .OpenRawMemoryMapping(filename)) { Tick *tick = (Tick *)view.ItemAreaStart; Tick *end = (Tick *)view.ItemAreaEnd; ((int)tick).Should().Be.LessThanOrEqualTo((int)end); int i = 0; var dt = new DateTime(2000, 1, 1); while (tick < end) { tick->Volume.Should().Be(i * 10); tick->Time.Should().Be(dt.AddDays(i)); tick++; i++; } } }
public unsafe void AccessItemsViaMemoryMapping() { const string filename = "RawMemoryMappingTest_AccessItemsViaMemoryMapping.tea"; using (var f = TeaFile <Tick> .Create(filename)) { var dt = new DateTime(2000, 1, 1); for (int i = 0; i < 27; i++) { f.Write(new Tick { Time = dt.AddDays(i), Volume = i * 10 }); } } using (var view = TeaFile <Tick> .OpenRawMemoryMapping(filename)) { Tick *tick = (Tick *)view.ItemAreaStart; var dt = new DateTime(2000, 1, 1); for (int i = 0; i < 27; i++) { tick->Volume.Should().Be(i * 10); tick->Time.Should().Be(dt.AddDays(i)); tick++; } } }
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); } }
static unsafe double RunMemoryMapped(string filename) { double sum = 0; using (var fm = TeaFile <Tick> .OpenRawMemoryMapping(filename)) { for (Tick *tick = (Tick *)fm.ItemAreaStart; tick != fm.ItemAreaEnd; ++tick) { sum += tick->Price; } } return(sum); }
public TickPointer(Tick *ptr) { Ptr = ptr; }