Esempio n. 1
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.");
        }
Esempio n. 2
0
        public void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int countMin, int countMax)
        {
            using (var cache = new LocalCache())
                using (var pile = new DefaultPile(cache))
                {
                    cache.Pile          = pile;
                    cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace;
                    cache.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 tA   = cache.GetOrCreateTable <GDID>("A");
                            var list = new List <CheckByteArray>();
                            bool put = true;

                            while (true)
                            {
                                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec)
                                {
                                    return;
                                }

                                if (put)
                                {
                                    var cnt = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(countMin, countMax);
                                    for (int i = 0; i < cnt; i++)
                                    {
                                        var payloadSize = NFX.ExternalRandomGenerator
                                                          .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                                        var val = new byte[payloadSize];
                                        val[0]  = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                                        val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                                        var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i);

                                        tA.Put(key, val);

                                        var element = new CheckByteArray(key, 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
                                {
                                    var i = 0;
                                    for (var j = 0; j < list.Count; j++)
                                    {
                                        var element = list[j];
                                        var buf     = tA.Get(element.Key) as byte[];
                                        if (buf != null)
                                        {
                                            Assert.AreEqual(element.FirstByte, buf[0]);
                                            Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                                            tA.Remove(element.Key);
                                            i++;
                                        }
                                    }
                                    Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, i));
                                    list.Clear();
                                    put = true;
                                }
                            }
                        }, TaskCreationOptions.LongRunning));
                    }
                    Task.WaitAll(tasks.ToArray());
                }
        }
Esempio n. 3
0
        public void Chessboard_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, bool isParallel)
        {
            using (var cache = new LocalCache())
                using (var pile = new DefaultPile(cache))
                {
                    cache.Pile          = pile;
                    cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace;
                    cache.Start();

                    var startTime = DateTime.UtcNow;
                    var tasks     = new List <Task>();
                    for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
                    {
                        tasks.Add(Task.Factory.StartNew(() =>
                        {
                            var list = new List <CheckByteArray>();
                            var i    = 0;
                            var tA   = cache.GetOrCreateTable <GDID>("A");
                            var wlc  = 0;
                            while (true)
                            {
                                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec)
                                {
                                    break;
                                }

                                var payloadSize = NFX.ExternalRandomGenerator
                                                  .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                                var val = new byte[payloadSize];
                                val[0]  = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                                val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                                var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i);
                                tA.Put(key, val);

                                var element = new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1]);
                                list.Add(element);

                                // delete previous element
                                if (list.Count > 1 && i % 2 == 0)
                                {
                                    key = list[list.Count - 2].Key;
                                    tA.Remove(key);
                                    list.RemoveAt(list.Count - 2);
                                }

                                // get several random elements
                                if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                                {
                                    var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                                    wlc++;
                                    if (wlc % 125 == 0)
                                    {
                                        Console.WriteLine("Thread {0} is reading {1} elements, total {2}"
                                                          .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count));
                                    }
                                    for (var k = 0; k < toRead && list.Count > 0; k++)
                                    {
                                        var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1);
                                        element = list[idx];
                                        var buf = tA.Get(element.Key) as byte[];
                                        if (buf == null)
                                        {
                                            list.RemoveAt(idx);
                                            continue;
                                        }
                                        Assert.AreEqual(element.FirstByte, buf[0]);
                                        Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                                    }
                                }

                                if (i == Int32.MaxValue)
                                {
                                    i = 0;
                                }
                                else
                                {
                                    i++;
                                }

                                if (list.Count == Int32.MaxValue)
                                {
                                    list = new List <CheckByteArray>();
                                }
                            }

                            // total check
                            Console.WriteLine("Thread {0} is doing final read of {1} elements, tableCount {2}"
                                              .Args(Thread.CurrentThread.ManagedThreadId, list.Count, tA.Count));
                            foreach (var element in list)
                            {
                                var buf = tA.Get(element.Key) as byte[];
                                if (buf == null)
                                {
                                    continue;
                                }
                                Assert.AreEqual(element.FirstByte, buf[0]);
                                Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                            }
                            return;
                        }, TaskCreationOptions.LongRunning));
                    }
                    Task.WaitAll(tasks.ToArray());
                }
        }
Esempio n. 4
0
        public static void Put_RandomDelete_ByteArray(int cnt, int durationSec, bool speed, int payloadSizeMin, int payloadSizeMax, int deleteFreq, bool isParallel)
        {
            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 < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
                {
                    tasks.Add(Task.Factory.StartNew(() =>
                    {
                        var wlc = 0;
                        while (true)
                        {
                            if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec)
                            {
                                return;
                            }

                            var dict = new Dictionary <int, CheckByteArray>();


                            Console.WriteLine("Starting a batch of {0}".Args(cnt));
                            for (int i = 0; i < cnt; i++)
                            {
                                var payloadSize      = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                                var val              = new byte[payloadSize];
                                val[0]               = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                                val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                                var ptr = pile.Put(val);

                                var element = new CheckByteArray(ptr, payloadSize - 1, val[0], val[payloadSize - 1]);
                                dict.Add(i, element);

                                if (dict.Count > 0 && i % deleteFreq == 0)
                                {
                                    while (true)
                                    {
                                        var idx = i - NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, i);

                                        CheckByteArray stored;
                                        if (dict.TryGetValue(idx, out stored))
                                        {
                                            ptr = stored.Ptr;
                                            pile.Delete(ptr);
                                            dict.Remove(idx);
                                            break;
                                        }
                                    }
                                }

                                if (dict.Count > 16 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                                {
                                    var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                                    wlc++;
                                    if (wlc % 125 == 0)
                                    {
                                        Console.WriteLine("Thread {0} is reading {1} elements, total {2}"
                                                          .Args(Thread.CurrentThread.ManagedThreadId, toRead, dict.Count));
                                    }
                                    for (var k = 0; k < toRead; k++)
                                    {
                                        var kvp = dict.Skip(NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, dict.Count - 1)).First();
                                        var buf = pile.Get(kvp.Value.Ptr) as byte[];
                                        Aver.AreEqual(kvp.Value.FirstByte, buf[0]);
                                        Aver.AreEqual(kvp.Value.LastByte, buf[kvp.Value.IdxLast]);
                                    }
                                }
                            }

                            Console.WriteLine("Thread {0} is doing final read of {1} elements".Args(Thread.CurrentThread.ManagedThreadId, dict.Count));
                            foreach (var kvp in dict)
                            {
                                var buf = pile.Get(kvp.Value.Ptr) as byte[];
                                Aver.AreEqual(kvp.Value.FirstByte, buf[0]);
                                Aver.AreEqual(kvp.Value.LastByte, buf[kvp.Value.IdxLast]);
                            }
                        }
                    }, TaskCreationOptions.LongRunning));
                }
                Task.WaitAll(tasks.ToArray());
            }
        }
Esempio n. 5
0
        public static void Chessboard_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, bool isParallel)
        {
            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 < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
                {
                    tasks.Add(Task.Factory.StartNew(() =>
                    {
                        var list = new List <CheckByteArray>();
                        var i    = 0;
                        var wlc  = 0;
                        while (true)
                        {
                            if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec)
                            {
                                break;
                            }

                            var payloadSize = NFX.ExternalRandomGenerator
                                              .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                            var val = new byte[payloadSize];
                            val[0]  = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                            val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                            var ptr = pile.Put(val);

                            var element = new CheckByteArray(ptr, payloadSize - 1, val[0], val[payloadSize - 1]);
                            list.Add(element);

                            // delete previous element
                            if (list.Count > 1 && i % 2 == 0)
                            {
                                ptr = list[list.Count - 2].Ptr;
                                pile.Delete(ptr);
                                list.RemoveAt(list.Count - 2);
                            }

                            // get several random elements
                            if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                            {
                                var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                                wlc++;
                                if (wlc % 125 == 0)
                                {
                                    Console.WriteLine("Thread {0} is reading {1} elements, total {2}, Pile objects {3}, Pile segments {4} Pile Bytes {5}"
                                                      .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count, pile.ObjectCount, pile.SegmentCount, pile.AllocatedMemoryBytes));
                                }
                                for (var k = 0; k < toRead; k++)
                                {
                                    element = list[NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1)];
                                    var buf = pile.Get(element.Ptr) as byte[];
                                    Aver.AreEqual(element.FirstByte, buf[0]);
                                    Aver.AreEqual(element.LastByte, buf[element.IdxLast]);
                                }
                            }

                            if (i == Int32.MaxValue)
                            {
                                i = 0;
                            }
                            else
                            {
                                i++;
                            }

                            if (list.Count == Int32.MaxValue)
                            {
                                list = new List <CheckByteArray>();
                            }
                        }

                        // total check
                        Console.WriteLine("Thread {0} is doing final read of {1} elements, ObjectCount {2}"
                                          .Args(Thread.CurrentThread.ManagedThreadId, list.Count, pile.ObjectCount));
                        foreach (var element in list)
                        {
                            var buf = pile.Get(element.Ptr) as byte[];
                            Aver.AreEqual(element.FirstByte, buf[0]);
                            Aver.AreEqual(element.LastByte, buf[element.IdxLast]);
                        }
                        return;
                    }, TaskCreationOptions.LongRunning));
                }
                Task.WaitAll(tasks.ToArray());
            }
        }
Esempio n. 6
0
        public void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int countMin, int countMax)
        {
            using (var cache = new LocalCache())
              using (var pile = new DefaultPile(cache))
              {
            cache.Pile = pile;
            cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace;
            cache.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 tA = cache.GetOrCreateTable<GDID>("A");
              var list = new List<CheckByteArray>();
              bool put = true;

              while (true)
              {
                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) return;

                if (put)
                {
                  var cnt = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(countMin, countMax);
                  for (int i = 0; i < cnt; i++)
                  {
                    var payloadSize = NFX.ExternalRandomGenerator
                                        .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                    var val = new byte[payloadSize];
                    val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                    val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                    var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i);

                    tA.Put(key, val);

                    var element = new CheckByteArray(key, 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
                {
                  var i = 0;
                  for (var j = 0; j < list.Count; j++)
                  {
                    var element = list[j];
                    var buf = tA.Get(element.Key) as byte[];
                    if (buf != null)
                    {
                      Assert.AreEqual(element.FirstByte, buf[0]);
                      Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                      tA.Remove(element.Key);
                      i++;
                    }
                  }
                  Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, i));
                  list.Clear();
                  put = true;
                }
              }
            }, TaskCreationOptions.LongRunning));
            Task.WaitAll(tasks.ToArray());
              }
        }
Esempio n. 7
0
        public void Chessboard_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, bool isParallel)
        {
            using (var cache = new LocalCache())
              using (var pile = new DefaultPile(cache))
              {
            cache.Pile = pile;
            cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace;
            cache.Start();

            var startTime = DateTime.UtcNow;
            var tasks = new List<Task>();
            for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
              tasks.Add(Task.Factory.StartNew(() =>
            {
              var list = new List<CheckByteArray>();
              var i = 0;
              var tA = cache.GetOrCreateTable<GDID>("A");
              var wlc = 0;
              while (true)
              {
                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) break;

                var payloadSize = NFX.ExternalRandomGenerator
                                    .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                var val = new byte[payloadSize];
                val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i);
                tA.Put(key, val);

                var element = new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1]);
                list.Add(element);

                // delete previous element
                if (list.Count > 1 && i % 2 == 0)
                {
                  key = list[list.Count - 2].Key;
                  tA.Remove(key);
                  list.RemoveAt(list.Count - 2);
                }

                // get several random elements
                if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                {
                  var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                  wlc++;
                  if (wlc % 125 == 0)
                    Console.WriteLine("Thread {0} is reading {1} elements, total {2}"
                      .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count));
                  for (var k = 0; k < toRead && list.Count > 0; k++)
                  {
                    var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1);
                    element = list[idx];
                    var buf = tA.Get(element.Key) as byte[];
                    if (buf == null)
                    {
                      list.RemoveAt(idx);
                      continue;
                    }
                    Assert.AreEqual(element.FirstByte, buf[0]);
                    Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                  }
                }

                if (i == Int32.MaxValue)
                  i = 0;
                else
                  i++;

                if (list.Count == Int32.MaxValue)
                  list = new List<CheckByteArray>();
              }

              // total check
              Console.WriteLine("Thread {0} is doing final read of {1} elements, tableCount {2}"
                .Args(Thread.CurrentThread.ManagedThreadId, list.Count, tA.Count));
              foreach (var element in list)
              {
                var buf = tA.Get(element.Key) as byte[];
                if (buf == null)
                  continue;
                Assert.AreEqual(element.FirstByte, buf[0]);
                Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
              }
              return;
            }, TaskCreationOptions.LongRunning));
            Task.WaitAll(tasks.ToArray());
              }
        }
Esempio n. 8
0
        public static void Put_RandomDelete_ByteArray(int cnt, int durationSec, bool speed, int payloadSizeMin, int payloadSizeMax, int deleteFreq, bool isParallel)
        {
            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 < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
              tasks.Add(Task.Factory.StartNew(() =>
            {
              var wlc = 0;
              while (true)
              {
                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) return;

                var dict = new Dictionary<int, CheckByteArray>();

                Console.WriteLine("Starting a batch of {0}".Args(cnt));
                for (int i = 0; i < cnt; i++)
                {
                  var payloadSize = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                  var val = new byte[payloadSize];
                  val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                  val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                  var ptr = pile.Put(val);

                  var element = new CheckByteArray(ptr, payloadSize - 1, val[0], val[payloadSize - 1]);
                  dict.Add(i, element);

                  if (dict.Count > 0 && i % deleteFreq == 0)
                  {
                    while (true)
                    {
                      var idx = i - NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, i);

                      CheckByteArray stored;
                      if (dict.TryGetValue(idx, out stored))
                      {
                        ptr = stored.Ptr;
                        pile.Delete(ptr);
                        dict.Remove(idx);
                        break;
                      }
                    }
                  }

                  if (dict.Count > 16 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                  {
                    var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                    wlc++;
                    if (wlc % 125 == 0)
                      Console.WriteLine("Thread {0} is reading {1} elements, total {2}"
                        .Args(Thread.CurrentThread.ManagedThreadId, toRead, dict.Count));
                    for (var k = 0; k < toRead; k++)
                    {
                      var kvp = dict.Skip(NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, dict.Count - 1)).First();
                      var buf = pile.Get(kvp.Value.Ptr) as byte[];
                      Assert.AreEqual(kvp.Value.FirstByte, buf[0]);
                      Assert.AreEqual(kvp.Value.LastByte, buf[kvp.Value.IdxLast]);
                    }
                  }
                }

                Console.WriteLine("Thread {0} is doing final read of {1} elements".Args(Thread.CurrentThread.ManagedThreadId, dict.Count));
                foreach (var kvp in dict)
                {
                  var buf = pile.Get(kvp.Value.Ptr) as byte[];
                  Assert.AreEqual(kvp.Value.FirstByte, buf[0]);
                  Assert.AreEqual(kvp.Value.LastByte, buf[kvp.Value.IdxLast]);
                }
              }
            }, TaskCreationOptions.LongRunning));
            Task.WaitAll(tasks.ToArray());
              }
        }
Esempio n. 9
0
        public static void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, 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<CheckByteArray>();
              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 payloadSize = NFX.ExternalRandomGenerator
                                        .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                    var val = new byte[payloadSize];
                    val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                    val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.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[];
                    Assert.AreEqual(element.FirstByte, buf[0]);
                    Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                    pile.Delete(element.Ptr);

                  }
                  list.Clear();
                  put = true;
                }
              }
            }, TaskCreationOptions.LongRunning));
            Task.WaitAll(tasks.ToArray());
              }
              Console.WriteLine("Test finished.");
        }
Esempio n. 10
0
        public static void Chessboard_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, bool isParallel)
        {
            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 < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++)
              tasks.Add(Task.Factory.StartNew(() =>
            {
              var list = new List<CheckByteArray>();
              var i = 0;
              var wlc = 0;
              while (true)
              {
                if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) break;

                var payloadSize = NFX.ExternalRandomGenerator
                                    .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax);
                var val = new byte[payloadSize];
                val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;
                val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger;

                var ptr = pile.Put(val);

                var element = new CheckByteArray(ptr, payloadSize - 1, val[0], val[payloadSize - 1]);
                list.Add(element);

                // delete previous element
                if (list.Count > 1 && i % 2 == 0)
                {
                  ptr = list[list.Count - 2].Ptr;
                  pile.Delete(ptr);
                  list.RemoveAt(list.Count - 2);
                }

                // get several random elements
                if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98)
                {
                  var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64);
                  wlc++;
                  if (wlc % 125 == 0)
                    Console.WriteLine("Thread {0} is reading {1} elements, total {2}, Pile objects {3}, Pile segments {4} Pile Bytes {5}"
                      .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count, pile.ObjectCount, pile.SegmentCount, pile.AllocatedMemoryBytes));
                  for (var k = 0; k < toRead; k++)
                  {
                    element = list[NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1)];
                    var buf = pile.Get(element.Ptr) as byte[];
                    Assert.AreEqual(element.FirstByte, buf[0]);
                    Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
                  }
                }

                if (i == Int32.MaxValue)
                  i = 0;
                else
                  i++;

                if (list.Count == Int32.MaxValue)
                  list = new List<CheckByteArray>();
              }

              // total check
              Console.WriteLine("Thread {0} is doing final read of {1} elements, ObjectCount {2}"
                .Args(Thread.CurrentThread.ManagedThreadId, list.Count, pile.ObjectCount));
              foreach (var element in list)
              {
                var buf = pile.Get(element.Ptr) as byte[];
                Assert.AreEqual(element.FirstByte, buf[0]);
                Assert.AreEqual(element.LastByte, buf[element.IdxLast]);
              }
              return;
            }, TaskCreationOptions.LongRunning));
            Task.WaitAll(tasks.ToArray());
              }
        }