Esempio n. 1
0
        static void Main(string[] args)
        {
            var max = 20;

            using var pages = new MemoryPageAccessor <BTreeNode <long, long> .Data>(1000);

            var ref1 = pages.GetReference(0);
            var ref2 = pages.GetReference(0);

            ref1.Value.Value = 10;
            ref2.Value.Value = 100;

            if (ref1.Value.Value != 100)
            {
                throw new Exception();
            }

            var btree = new BTree <long, long>(pages);

            var rand = new Random(10);

            var range = Enumerable.Range(0, max).ToList();
            var items = new List <long>();

            while (range.Count > 0)
            {
                var i = range.Count - 1; // rand.Next(range.Count);

                items.Add(range[i]);
                range.RemoveAt(i);
            }

            for (var i = 0; i < 11; i++)
            {
                var idx = items[i];

                Console.WriteLine($"{i}: Adding {idx}");
                btree.Add(idx, i);
                Visualizer.Visualize(btree, $"tree_{i}");
            }

            Visualizer.Visualize(btree);

            for (var i = 0; i < 10; i++)
            {
                var idx = (long)rand.Next(max);
                Console.WriteLine($"{idx}: {btree[idx]}");
            }

            return;

            for (var i = 3; i <= 7; i++)
            {
                RunRandomIterations((int)Math.Pow(10, i), 10000);
                RunRandomIterations(5 * (int)Math.Pow(10, i), 10000);
            }
        }
Esempio n. 2
0
        static void RunLinearIterations(int max, int accesses)
        {
            using var paged_data = new MemoryPageAccessor <long>(4000 / sizeof(long));
            using var pages      = new MemoryPageAccessor <BinaryHeap <int, long> .Data>(4000 / sizeof(long));

            var heap = new BinaryHeap <int, long>(pages);
            var dict = new Dictionary <int, long>();
            var list = new List <long>();

            TimeSpan FillMPA(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0U; i < (ulong)max; i++)
                {
                    var idx  = paged_data.FindFreeIndex();
                    var page = paged_data.GetPageFor(idx);
                    page.Set(idx);
                    page[idx] = i;
                }
                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem + paged_data.Pages.Sum(p => (long)p.Value.AllocatedBytes);

                return(timer.Elapsed);
            }

            TimeSpan FillDict(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0; i < max; i++)
                {
                    dict[i] = i;
                }
                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem;

                return(timer.Elapsed);
            }

            TimeSpan FillList(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0; i < max; i++)
                {
                    list.Add(i);
                }
                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem;

                return(timer.Elapsed);
            }

            TimeSpan RunMPA(Stopwatch timer)
            {
                var rand = new Random(10);

                timer.Restart();
                for (var i = 0; i < accesses; i++)
                {
                    var val = (ulong)(i % max);  // rand.Next(max);
                    // var val = heap[i];
                    var str = paged_data.GetPageFor(val)[val];
                    GC.KeepAlive(str);
                    // Console.WriteLine($"Element at index {val}: {str}");
                }
                timer.Stop();

                // Console.WriteLine($"MemoryPageAccessor: {timer.Elapsed}");
                return(timer.Elapsed);
            }

            TimeSpan RunDictionary(Stopwatch timer)
            {
                var rand = new Random(10);

                timer.Restart();
                for (var i = 0; i < accesses; i++)
                {
                    var val = (i % max); // rand.Next(max);
                    // var val = heap[i];
                    var str = dict[val];
                    GC.KeepAlive(str);
                    // Console.WriteLine($"Element at index {val}: {str}");
                }
                timer.Stop();

                // Console.WriteLine($"Dictionary: {timer.Elapsed}");
                return(timer.Elapsed);
            }

            TimeSpan RunList(Stopwatch timer)
            {
                var rand = new Random(10);

                timer.Restart();
                for (var i = 0; i < accesses; i++)
                {
                    var val = (i % max); // rand.Next(max);
                    // var val = heap[i];
                    var str = list[val];
                    GC.KeepAlive(str);
                    // Console.WriteLine($"Element at index {val}: {str}");
                }
                timer.Stop();

                // Console.WriteLine($"List: {timer.Elapsed}");
                return(timer.Elapsed);
            }

            var timer = new Stopwatch();

            var mpaTimes  = new List <TimeSpan>(100);
            var dictTimes = new List <TimeSpan>(100);
            var listTimes = new List <TimeSpan>(100);

            var mpaAlloc  = FillMPA(timer, out var mpaMem).TotalMilliseconds;
            var dictAlloc = FillDict(timer, out var dictMem).TotalMilliseconds;
            var listAlloc = FillList(timer, out var listMem).TotalMilliseconds;

            for (var i = 0; i < 100; i++)
            {
                // Console.WriteLine($"\n === Iteration {i:00} ===");

                GC.TryStartNoGCRegion(1000 + accesses * 100);

                mpaTimes.Add(RunMPA(timer));
                dictTimes.Add(RunDictionary(timer));
                listTimes.Add(RunList(timer));

                GC.EndNoGCRegion();
            }

            //Console.WriteLine($"\n\n *** Results ***");

            Console.Write($"{max},{mpaAlloc},{mpaMem}");
            PrintResults($"MPA {max} values", mpaTimes);
            Console.Write($",{dictAlloc},{dictMem}");
            PrintResults($"DICT {max} values", dictTimes);
            Console.Write($",{listAlloc},{listMem}");
            PrintResults($"LIST {max} values", listTimes);
            Console.WriteLine();
        }
Esempio n. 3
0
        static void RunRandomIterations(int max, int accesses)
        {
            using var paged_data = new MemoryPageAccessor <long>(4000 / sizeof(long));
            using var pages      = new MemoryPageAccessor <BinaryHeap <int, long> .Data>(4000 / sizeof(long));

            var heap = new BinaryHeap <int, long>(pages);
            var dict = new Dictionary <int, long>();
            var list = new List <long>();

            TimeSpan FillMPA(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0U; i < (ulong)max; i++)
                {
                    var idx  = (ulong)rand.Next(max);
                    var page = paged_data.GetPageFor(idx);
                    page.Set(idx);
                    page[idx] = i;
                }

                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem + paged_data.Pages.Sum(p => (long)p.Value.AllocatedBytes);

                return(timer.Elapsed);
            }

            TimeSpan FillDict(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0; i < max; i++)
                {
                    var idx = rand.Next(max);
                    dict[idx] = i;
                }
                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem;

                return(timer.Elapsed);
            }

            TimeSpan FillList(Stopwatch timer, out long mem)
            {
                var rand = new Random(10);

                mem = GC.GetTotalMemory(true);
                timer.Restart();

                for (var i = 0; i < max; i++)
                {
                    var idx = rand.Next(max);

                    for (int j = list.Count; j <= idx; j++)
                    {
                        list.Add(-1);
                    }

                    list[idx] = i;
                }
                timer.Stop();
                mem = GC.GetTotalMemory(true) - mem;

                return(timer.Elapsed);
            }

            var timer = new Stopwatch();

            var mpaAlloc  = FillMPA(timer, out var mpaMem).TotalMilliseconds;
            var dictAlloc = FillDict(timer, out var dictMem).TotalMilliseconds;
            var listAlloc = FillList(timer, out var listMem).TotalMilliseconds;

            //Console.WriteLine($"\n\n *** Results ***");

            Console.Write($"{max},{mpaAlloc},{mpaMem}");
            Console.Write($",{dictAlloc},{dictMem}");
            Console.Write($",{listAlloc},{listMem}");
            Console.WriteLine();
        }