public void PutGetTwo() { using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; var rowIn1 = CheckoutRow.MakeFake(new GDID(0, 1)); var rowIn2 = CheckoutRow.MakeFake(new GDID(0, 2)); var pp1 = ipile.Put(rowIn1); var pp2 = ipile.Put(rowIn2); Assert.AreEqual(2, ipile.ObjectCount); Assert.AreEqual(DefaultPile.SEG_SIZE_DFLT, ipile.AllocatedMemoryBytes); Assert.AreEqual(1, ipile.SegmentCount); var rowOut1 = pile.Get(pp1) as CheckoutRow; var rowOut2 = pile.Get(pp2) as CheckoutRow; Assert.AreEqual(rowIn1, rowOut1); Assert.AreEqual(rowIn2, rowOut2); } }
public void LinkStringNoPreallocate() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var obj1 = "abcdefgh"; var p1 = pile.Put(obj1); var got = pile.Get(p1) as string; Aver.AreEqual("abcdefgh", got); var obj2 = "abcdefghijklmnopqrst0912345"; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); got = pile.Get(p1) as string; Aver.AreEqual("abcdefghijklmnopqrst0912345", got); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void LinkPreallocate() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var obj1 = new Payload { ID = 1, Name = "1", Data = null }; var p1 = pile.Put(obj1, preallocateBlockSize: 2000); Aver.AreEqual(2000, pile.SizeOf(p1)); var obj2 = new Payload { ID = 2, Name = "2", Data = new byte [3000] }; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); var got = pile.Get(p1) as Payload; Aver.AreEqual(2, got.ID); Aver.AreEqual("2", got.Name); Aver.IsNotNull(got.Data); Aver.AreEqual(3000, got.Data.Length); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public static void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int countMin, int countMax) { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.AllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; pile.Start(); var startTime = DateTime.UtcNow; var tasks = new List <Task>(); for (var t = 0; t < (System.Environment.ProcessorCount - 1); t++) { tasks.Add(Task.Factory.StartNew(() => { var list = new List <CheckByteArray>(); bool put = true; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) { return; } if (put) { var cnt = Ambient.Random.NextScaledRandomInteger(countMin, countMax); for (int j = 0; j < cnt; j++) { var payloadSize = Ambient.Random.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)Ambient.Random.NextRandomInteger; val[payloadSize - 1] = (byte)Ambient.Random.NextRandomInteger; var ptr = pile.Put(val); var element = new CheckByteArray(ptr, payloadSize - 1, val[0], val[payloadSize - 1]); list.Add(element); } Console.WriteLine("Thread {0} put {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); put = false; } else { Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); for (var j = 0; j < list.Count; j++) { var element = list[j]; var buf = pile.Get(element.Ptr) as byte[]; Aver.AreEqual(element.FirstByte, buf[0]); Aver.AreEqual(element.LastByte, buf[element.IdxLast]); pile.Delete(element.Ptr); } list.Clear(); put = true; } } }, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); } Console.WriteLine("Test finished."); }
private void btnStart_Click(object sender, EventArgs e) { lbErrors.Items.Clear(); var sz = tbSegmentSize.Text.AsInt(0); if (sz > 0) { sz = sz * 1024 * 1024; m_Pile.SegmentSize = sz; } var mm = tbMaxMemoryMb.Text.AsLong(0); if (mm > 0) { mm = mm * 1024 * 1024; m_Pile.MaxMemoryLimit = mm; } else { m_Pile.MaxMemoryLimit = 0; } m_Pile.Start(); }
[Run("cnt=32000000 size=32 parallel=12")] //12 threads put 32,000,000 byte[32] in 5,008 msec at 6,389,776 ops/sec //12 threads got 32,000,000 byte[32] in 3,787 msec at 8,449,960 ops/sec //-------------------------------------------------------------------------------- //12 threads put 32,000,000 byte[32] in 2,963 msec at 10,799,865 ops/sec //12 threads got 32,000,000 byte[32] in 2,253 msec at 14,203,285 ops/sec public void ByteBuf(int CNT, int size, int parallel) { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var str = new byte[size]; var pp = pile.Put(str); var sw = Stopwatch.StartNew(); Parallel.For(0, CNT, new ParallelOptions { MaxDegreeOfParallelism = parallel }, (i) => { pile.Put(str); }); var el = sw.ElapsedMilliseconds; Console.WriteLine("{0:n0} threads put {1:n0} byte[{2:n0}] in {3:n0} msec at {4:n0} ops/sec".Args(parallel, CNT, size, el, CNT / (el / 1000d))); sw.Restart(); Parallel.For(0, CNT, new ParallelOptions { MaxDegreeOfParallelism = parallel }, (i) => { pile.Get(pp); }); el = sw.ElapsedMilliseconds; Console.WriteLine("{0:n0} threads got {1:n0} byte[{2:n0}] in {3:n0} msec at {4:n0} ops/sec".Args(parallel, CNT, size, el, CNT / (el / 1000d))); } }
public void FitPreallocateByteArray() { using (var pile = new DefaultPile()) { pile.Start(); var obj1 = new byte[3]; var p1 = pile.Put(obj1, preallocateBlockSize: 4000); var got = pile.Get(p1) as byte[]; Aver.AreEqual(3, got.Length); Aver.AreEqual(4000, pile.SizeOf(p1)); var obj2 = new byte[571]; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); got = pile.Get(p1) as byte[]; Aver.AreEqual(571, got.Length); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void PutSubarray() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var src = new byte[] { 1, 6, 9, 250 }; var sub = new Subarray <byte>(); sub.Set(src, 2); var ptr1 = pile.Put(sub); sub.Set(src, 4); var ptr2 = pile.Put(sub); var got1 = pile.Get(ptr1) as byte[]; var got2 = pile.Get(ptr2) as byte[]; Aver.IsNotNull(got1); Aver.AreEqual(2, got1.Length); Aver.AreEqual(1, got1[0]); Aver.AreEqual(6, got1[1]); Aver.IsNotNull(got2); Aver.AreEqual(4, got2.Length); Aver.AreEqual(1, got2[0]); Aver.AreEqual(6, got2[1]); Aver.AreEqual(9, got2[2]); Aver.AreEqual(250, got2[3]); } }
public void LinkByteArrayNoPreallocate() { using (var pile = new DefaultPile()) { pile.Start(); var obj1 = new byte[12]; var p1 = pile.Put(obj1); var got = pile.Get(p1) as byte[]; Aver.AreEqual(12, got.Length); var obj2 = new byte[389]; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); got = pile.Get(p1) as byte[]; Aver.AreEqual(389, got.Length); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void ReallocateInPlace(int len) { using (var pile = new DefaultPile()) { pile.Start(); var lst = new List <PilePointer>(); for (var i = 0; i < len; i++) { var ub = i * 10; var ptr = pile.Put(new byte[0], preallocateBlockSize: ub); lst.Add(ptr); for (var j = 0; j < ub + (ub / 2); j++) { Aver.IsTrue(pile.Put(ptr, new byte[j])); } } Aver.AreEqual(lst.Count, pile.ObjectCount); var n = 0; foreach (var pp in lst) { Console.WriteLine("iteration#{0} of {1}".Args(n, lst.Count)); Aver.IsTrue(pile.Delete(pp)); n++; } Aver.AreEqual(0, pile.AllocatedMemoryBytes); Aver.AreEqual(0, pile.ObjectCount); Aver.AreEqual(0, pile.ObjectLinkCount); } }
public void LinkNoPreallocate() { using (var pile = new DefaultPile()) { pile.Start(); var obj1 = new Payload { ID = 1, Name = "1", Data = null }; var p1 = pile.Put(obj1); Aver.IsTrue(pile.SizeOf(p1) < 128); var obj2 = new Payload { ID = 2, Name = "2", Data = new byte [128] }; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); var got = pile.Get(p1) as Payload; Aver.AreEqual(2, got.ID); Aver.AreEqual("2", got.Name); Aver.IsNotNull(got.Data); Aver.AreEqual(128, got.Data.Length); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void FitPreallocate() { using (var pile = new DefaultPile()) { pile.Start(); var obj1 = new Payload { ID = 1, Name = "1", Data = null }; var p1 = pile.Put(obj1, preallocateBlockSize: 4000); Aver.AreEqual(4000, pile.SizeOf(p1)); var obj2 = new Payload { ID = 2, Name = "2", Data = new byte [] { 1, 2, 3, 4, 5, 6, 7, 8 } }; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); var got = pile.Get(p1) as Payload; Aver.AreEqual(2, got.ID); Aver.AreEqual("2", got.Name); Aver.IsNotNull(got.Data); Aver.AreEqual(8, got.Data.Length); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void FitPreallocateString() { using (var pile = new DefaultPile()) { pile.Start(); var obj1 = "abcdefgh"; var p1 = pile.Put(obj1, preallocateBlockSize: 4000); var got = pile.Get(p1) as string; Aver.AreEqual("abcdefgh", got); Aver.AreEqual(4000, pile.SizeOf(p1)); var obj2 = "abcdefghijklmnopqrst0912345"; Aver.IsTrue(pile.Put(p1, obj2)); Aver.AreEqual(1, pile.ObjectCount); got = pile.Get(p1) as string; Aver.AreEqual("abcdefghijklmnopqrst0912345", got); Aver.IsTrue(pile.AllocatedMemoryBytes > 0); Aver.IsTrue(pile.Delete(p1)); Aver.IsTrue(pile.AllocatedMemoryBytes == 0); Aver.IsTrue(pile.ObjectCount == 0); } }
public void SegmentAddedDeleted() { using (var pile = new DefaultPile() { SegmentSize = PileCacheTestCore.SEG_SIZE }) { pile.Start(); var ipile = pile as IPile; var pp = PilePointer.Invalid; for (ulong i = 0; i < PileCacheTestCore.SEG_SIZE && ipile.SegmentCount < 2; i++) { var ch = Charge.MakeFake(new GDID(1, i)); pp = ipile.Put(ch); } Assert.AreEqual(2, ipile.SegmentCount); ipile.Delete(pp); Assert.AreEqual(1, ipile.SegmentCount); } }
public void Buffers(int count, int segmentSize) { using (var pile = new DefaultPile()) { pile.SegmentSize = segmentSize; pile.Start(); var hs = new HashSet <int>(); for (var i = 0; i < count; i++) { var buf = new byte[4 + (i % 512)]; buf.WriteBEInt32(i); pile.Put(buf); hs.Add(i); } Console.WriteLine("Created {0} segments".Args(pile.SegmentCount)); var j = 0; foreach (var entry in pile) { var buf = pile.Get(entry.Pointer) as byte[]; Aver.IsNotNull(buf); Aver.IsTrue(buf.Length >= 4); var i = buf.ReadBEInt32(); Aver.IsTrue(hs.Remove(i)); Aver.IsTrue(entry.Type == PileEntry.DataType.Buffer); j++; } Aver.AreEqual(j, count); Aver.AreEqual(0, hs.Count); } }
public void DeleteInvalid() { using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; ipile.Delete(PilePointer.Invalid); } }
private static void body(IApplication app, int cnt, int threads, object payload) { GC.Collect(); using (var pile = new DefaultPile(app)) { pile.Start(); bodyCore(pile, cnt, threads, payload); } }
public void GetNoObject() { using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; ipile.Get(PilePointer.Invalid); } }
public void DeleteInvalid() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var ipile = pile as IPile; ipile.Delete(PilePointer.Invalid); } }
public static void NoGrowth_TRow(bool speed, int durationSec, int countMin, int countMax) { using (var pile = new DefaultPile()) { pile.AllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; pile.Start(); var startTime = DateTime.UtcNow; var tasks = new List <Task>(); for (var t = 0; t < (System.Environment.ProcessorCount - 1); t++) { tasks.Add(Task.Factory.StartNew(() => { var list = new List <CheckTRow>(); bool put = true; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) { return; } if (put) { var cnt = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(countMin, countMax); for (int j = 0; j < cnt; j++) { var val = PersonRow.MakeFake(new GDID()); var ptr = pile.Put(val); var element = new CheckTRow(ptr, val.ID, val.Address1); list.Add(element); } Console.WriteLine("Thread {0} put {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); put = false; } else { Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); for (var j = 0; j < list.Count; j++) { var element = list[j]; var buf = pile.Get(element.Ptr) as PersonRow; Aver.AreEqual(element.Id, buf.ID); Aver.AreEqual(element.Address, buf.Address1); pile.Delete(element.Ptr); } list.Clear(); put = true; } } }, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); } Console.WriteLine("Test finished."); }
public CacheServer() { var pile = new DefaultPile(); pile.Configure(null); // m_Pile.SegmentSize = 512 * 1024 * 1024; pile.Start(); _pile = pile; Running = true; }
public void Parallel_PutDeleteGet_Checkerboard() { const int CNT = 1002030;//1000203; var tuples = new Tuple <PilePointer, Charge> [CNT]; using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; Parallel.For(0, CNT, i => { var ch = Charge.MakeFake(new GDID(0, (ulong)i)); var pp = ipile.Put(ch); tuples[i] = new Tuple <PilePointer, Charge>(pp, ch); }); Assert.AreEqual(CNT, ipile.ObjectCount); Parallel.For(0, CNT, i => { if (i % 3 != 0) { ipile.Delete(tuples[i].Item1); } }); Assert.AreEqual(CNT / 3, ipile.ObjectCount); var deletedHits = new ConcurrentDictionary <int, int>(); Parallel.For(0, CNT, i => { if (i % 3 != 0) { try { deletedHits.AddOrUpdate(System.Threading.Thread.CurrentThread.ManagedThreadId, 1, (threadId, val) => val + 1); ipile.Get(tuples[i].Item1); Assert.Fail("Object is deleted but its pointer doesn't throw exception!"); } catch (PileAccessViolationException) {} } else { var ch = ipile.Get(tuples[i].Item1); Assert.AreEqual(ch, tuples[i].Item2); } }); foreach (var kvp in deletedHits) { Console.WriteLine("Thread '{0}' {1:n0} times accessed deleted pointer", kvp.Key, kvp.Value); } } }
public void SimpleNullTest() { using (var m_pile = new DefaultPile() { AllocMode = AllocationMode.FavorSpeed }) { m_pile.Start(); var test = new LinkedListNode <string>(m_pile, null); Aver.IsNull(test.Value); } }
public void MulticulturalString() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var str = @" 外国語の学習と教授 Language Learning and Teaching Изучение и обучение иностранных языков Tere Daaheng Aneng Karimah 語文教學・语文教学 Enseñanza y estudio de idiomas Изучаване и Преподаване на Чужди Езици ქართული ენის შესწავლა და სწავლება 'læŋɡwidʒ 'lɘr:niŋ ænd 'ti:tʃiŋ Lus kawm thaib qhia Ngôn Ngữ, Sự học, ללמוד וללמד את השֵפה L'enseignement et l'étude des langues 말배우기와 가르치기 Nauka języków obcych Γλωσσική Εκμὰθηση και Διδασκαλία ﺗﺪﺭﯾﺲ ﻭ ﯾﺎﺩﮔﯿﺮﯼ ﺯﺑﺎﻥ Sprachlernen und -lehren ﺗﻌﻠﻢ ﻭﺗﺪﺭﻳﺲ ﺍﻟﻌﺮﺑﻴﺔ เรียนและสอนภาษา"; var pp = pile.Put(str); var got = pile.Get(pp) as string; Aver.AreEqual(str, got); } }
public void PutCheckerboardPattern3() { using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; const ulong CNT = 123; var ppp = new Tuple <PilePointer, string> [CNT]; for (ulong i = 0; i < CNT; i++) { var str = NFX.Parsing.NaturalTextGenerator.Generate(179); ppp[i] = new Tuple <PilePointer, string>(ipile.Put(str), str); } Assert.AreEqual(CNT, ipile.ObjectCount); for (ulong i = 0; i < CNT; i++) { if (i % 3 != 0) { ipile.Delete(ppp[i].Item1); } } Assert.AreEqual(CNT / 3, ipile.ObjectCount); for (ulong i = 0; i < CNT; i++) { if (i % 3 != 0) { try { ipile.Get(ppp[i].Item1); Assert.Fail("Object is deleted but its pointer doesn't throw exception!"); } catch (PileAccessViolationException) {} } else { var ch = ipile.Get(ppp[i].Item1); Assert.AreEqual(ch, ppp[i].Item2); } } ////Console.WriteLine("ObjectCount: {0}", ipile.ObjectCount); ////Console.WriteLine("AllocatedMemoryBytes: {0}", ipile.AllocatedMemoryBytes); ////Console.WriteLine("UtilizedBytes: {0}", ipile.UtilizedBytes); ////Console.WriteLine("OverheadBytes: {0}", ipile.OverheadBytes); ////Console.WriteLine("SegmentCount: {0}", ipile.SegmentCount); } }
public void PutString() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var ptr = pile.Put("abcd123"); var got = pile.Get(ptr) as string; Aver.IsNotNull(got); Aver.AreEqual("abcd123", got); } }
public void PutCheckerboardPattern2() { using (var pile = new DefaultPile()) { pile.Start(); var ipile = pile as IPile; const ulong CNT = 100; var ppp = new Tuple <PilePointer, ChargeRow> [CNT]; for (ulong i = 0; i < CNT; i++) { var ch = ChargeRow.MakeFake(new GDID(0, i)); ppp[i] = new Tuple <PilePointer, ChargeRow>(ipile.Put(ch), ch); } Assert.AreEqual(CNT, ipile.ObjectCount); for (ulong i = 0; i < CNT; i++) { var ch = ipile.Get(ppp[i].Item1); Assert.AreEqual(ch, ppp[i].Item2); } for (ulong i = 0; i < CNT; i += 2) { ipile.Delete(ppp[i].Item1); } Assert.AreEqual(CNT / 2, ipile.ObjectCount); for (ulong i = 0; i < CNT; i++) { if (i % 2 == 0) { try { ipile.Get(ppp[i].Item1); Assert.Fail("Object is deleted but its pointer doesn't throw exception!"); } catch (PileAccessViolationException) {} } else { var ch = ipile.Get(ppp[i].Item1); Assert.AreEqual(ch, ppp[i].Item2); } } } }
public void ChangeValueTest() { using (var m_pile = new DefaultPile() { AllocMode = AllocationMode.FavorSpeed }) { m_pile.Start(); var test = new LinkedListNode <string>(m_pile, "TEST"); Aver.AreEqual(test.Value, "TEST"); test.Value = "TEST 111"; Aver.AreEqual(test.Value, "TEST 111"); } }
public void PutByteArray() { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var ptr = pile.Put(new byte[] { 1, 6, 9 }); var got = pile.Get(ptr) as byte[]; Aver.IsNotNull(got); Aver.AreEqual(3, got.Length); Aver.AreEqual(1, got[0]); Aver.AreEqual(6, got[1]); Aver.AreEqual(9, got[2]); } }
[Run("cnt=1048576")] // 1024 * 1024 public void LongMulticulturalString(int cnt) { using (var pile = new DefaultPile(NOPApplication.Instance)) { pile.Start(); var str = new string('久', cnt); var pp = pile.Put(str); var got = pile.Get(pp) as string; Aver.AreEqual(str, got); } }