示例#1
0
        static void Main(string[] args)
        {
            ThreadPool.SetMaxThreads(maxThreads, maxThreads);

            Console.WriteLine("Generating input distribution...");
            samples = new int[sampleCount];
            Zipf.Samples(samples, s, n);

            int[] threadCount = Enumerable.Range(1, maxThreads).ToArray();

            // Desired output:
            // Class       1  2  3  4  5
            // Classic       5  6  7  7  8
            // Concurrent    5  6  7  7  8
            DataTable resultTable = new DataTable();

            resultTable.Clear();
            resultTable.Columns.Add("Class");
            foreach (var tc in threadCount)
            {
                resultTable.Columns.Add(tc.ToString());
            }

            DataRow concurrentLru = resultTable.NewRow();
            DataRow classicLru    = resultTable.NewRow();

            concurrentLru["Class"] = "concurrentLru";
            classicLru["Class"]    = "classicLru";

            foreach (int tc in threadCount)
            {
                const int warmup  = 3;
                const int runs    = 6;
                double[]  results = new double[warmup + runs];

                for (int i = 0; i < warmup + runs; i++)
                {
                    results[i] = MeasureThroughput(new ConcurrentLru <int, int>(tc, capacity, EqualityComparer <int> .Default), tc);
                }
                double avg = AverageLast(results, runs) / 1000000;
                Console.WriteLine($"ConcurrLru ({tc}) {avg} million ops/sec");
                concurrentLru[tc.ToString()] = avg.ToString();

                for (int i = 0; i < warmup + runs; i++)
                {
                    results[i] = MeasureThroughput(new ClassicLru <int, int>(tc, capacity, EqualityComparer <int> .Default), tc);
                }
                avg = AverageLast(results, runs) / 1000000;
                Console.WriteLine($"ClassicLru ({tc}) {avg} million ops/sec");
                classicLru[tc.ToString()] = avg.ToString();
            }

            resultTable.Rows.Add(concurrentLru);
            resultTable.Rows.Add(classicLru);

            ExportCsv(resultTable);

            Console.WriteLine("Done.");
        }
示例#2
0
        public void Setup()
        {
            _newCache = new MassTransitCache <Guid, Item, CacheValue <Item> >(new UsageCachePolicy <Item>(), new CacheOptions {
                Capacity = 1000
            });

            _samples = new int[SampleCount];

            Zipf.Samples(_samples, S, N);
        }
示例#3
0
 public void CanSampleSequence()
 {
     var d = new Zipf(0.7, 5);
     var ied = d.Samples();
     var e = ied.Take(1000).ToArray();
     foreach (var i in e)
     {
         Assert.LessOrEqual(i, 5);
         Assert.GreaterOrEqual(i, 0);
     }
 }
        public void CanSampleSequence()
        {
            var d   = new Zipf(0.7, 5);
            var ied = d.Samples();
            var e   = ied.Take(1000).ToArray();

            foreach (var i in e)
            {
                Assert.Between(i, 0, 5);
            }
        }
示例#5
0
        public void Setup()
        {
            _massTransitCache = new MassTransitCache <Guid, Item, ITimeToLiveCacheValue <Item> >(new TimeToLiveCachePolicy <Item>(TimeSpan.FromSeconds(30)),
                                                                                                 new CacheOptions {
                Capacity = 1000
            });

            _samples = new int[SampleCount];

            Zipf.Samples(_samples, S, N);
        }
示例#6
0
        public void CanSampleSequence()
        {
            var d   = new Zipf(0.7, 5);
            var ied = d.Samples();
            var e   = ied.Take(1000).ToArray();

            foreach (var i in e)
            {
                Assert.LessOrEqual(i, 5);
                Assert.GreaterOrEqual(i, 0);
            }
        }
 public void GlobalSetup()
 {
     samples = new int[sampleCount];
     Zipf.Samples(samples, s, n);
 }
示例#8
0
        static void Main(string[] args)
        {
            double[] sValues = { 0.5, 0.86 };

            // % of total number of items
            double[] cacheSizes = { 0.0125, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4 };

            List <Analysis> analysis = new List <Analysis>();

            foreach (var sValue in sValues)
            {
                foreach (var cacheSize in cacheSizes)
                {
                    analysis.Add(new Analysis {
                        N                = n,
                        s                = sValue,
                        Samples          = sampleCount,
                        CacheSizePercent = cacheSize
                    });
                }
            }

            int[][] zipdfDistribution = new int[sValues.Length][];

            for (int i = 0; i < sValues.Length; i++)
            {
                Console.WriteLine($"Generating Zipfan distribution with {sampleCount} samples, s = {sValues[i]}, N = {n}");
                var sw = Stopwatch.StartNew();
                zipdfDistribution[i] = new int[sampleCount];
                Zipf.Samples(zipdfDistribution[i], sValues[i], n);
                Console.WriteLine($"Took {sw.Elapsed}.");
            }

            List <AnalysisResult> results = new List <AnalysisResult>();
            Func <int, int>       func    = x => x;

            foreach (var a in analysis)
            {
                a.WriteSummaryToConsole();

                int cacheSize = (int)(a.N * a.CacheSizePercent);

                var concurrentLru = new ConcurrentLru <int, int>(1, cacheSize, EqualityComparer <int> .Default);
                var classicLru    = new ClassicLru <int, int>(1, cacheSize, EqualityComparer <int> .Default);

                var concurrentLruScan = new ConcurrentLru <int, int>(1, cacheSize, EqualityComparer <int> .Default);
                var classicLruScan    = new ClassicLru <int, int>(1, cacheSize, EqualityComparer <int> .Default);

                var d = a.s == 0.5 ? 0 : 1;

                var lruSw = Stopwatch.StartNew();
                for (int i = 0; i < sampleCount; i++)
                {
                    concurrentLru.GetOrAdd(zipdfDistribution[d][i], func);
                }
                lruSw.Stop();
                Console.WriteLine($"concurrentLru size={cacheSize} took {lruSw.Elapsed}.");

                var clruSw = Stopwatch.StartNew();
                for (int i = 0; i < sampleCount; i++)
                {
                    classicLru.GetOrAdd(zipdfDistribution[d][i], func);
                }
                clruSw.Stop();
                Console.WriteLine($"classic lru size={cacheSize} took {clruSw.Elapsed}.");

                var lruSwScan = Stopwatch.StartNew();
                for (int i = 0; i < sampleCount; i++)
                {
                    concurrentLruScan.GetOrAdd(zipdfDistribution[d][i], func);
                    concurrentLruScan.GetOrAdd(i % n, func);
                }
                lruSwScan.Stop();
                Console.WriteLine($"concurrentLruScan lru size={cacheSize} took {lruSwScan.Elapsed}.");

                var clruSwScan = Stopwatch.StartNew();
                for (int i = 0; i < sampleCount; i++)
                {
                    classicLruScan.GetOrAdd(zipdfDistribution[d][i], func);
                    classicLruScan.GetOrAdd(i % n, func);
                }
                clruSwScan.Stop();
                Console.WriteLine($"classicLruScan lru size={cacheSize} took {clruSwScan.Elapsed}.");

                results.Add(new AnalysisResult
                {
                    Cache            = "ClassicLru",
                    N                = a.N,
                    s                = a.s,
                    CacheSizePercent = a.CacheSizePercent * 100.0,
                    Samples          = a.Samples,
                    IsScan           = false,
                    HitRatio         = classicLru.HitRatio * 100.0,
                    Duration         = clruSw.Elapsed,
                });

                results.Add(new AnalysisResult
                {
                    Cache            = "ConcurrentLru",
                    N                = a.N,
                    s                = a.s,
                    CacheSizePercent = a.CacheSizePercent * 100.0,
                    Samples          = a.Samples,
                    IsScan           = false,
                    HitRatio         = concurrentLru.HitRatio * 100.0,
                    Duration         = lruSw.Elapsed,
                });

                results.Add(new AnalysisResult
                {
                    Cache            = "ClassicLru",
                    N                = a.N,
                    s                = a.s,
                    CacheSizePercent = a.CacheSizePercent * 100.0,
                    Samples          = a.Samples,
                    IsScan           = true,
                    HitRatio         = classicLruScan.HitRatio * 100.0,
                    Duration         = clruSwScan.Elapsed,
                });

                results.Add(new AnalysisResult
                {
                    Cache            = "ConcurrentLru",
                    N                = a.N,
                    s                = a.s,
                    CacheSizePercent = a.CacheSizePercent * 100.0,
                    Samples          = a.Samples,
                    IsScan           = true,
                    HitRatio         = concurrentLruScan.HitRatio * 100.0,
                    Duration         = lruSwScan.Elapsed,
                });
            }

            AnalysisResult.WriteToConsole(results);
            AnalysisResult.WriteToFile("results.csv", results);

            Console.ReadLine();
        }
示例#9
0
        /// <summary>
        /// Run example
        /// </summary>
        /// <a href="http://en.wikipedia.org/wiki/Zipf_distribution">Zipf distribution</a>
        public void Run()
        {
            // 1. Initialize the new instance of the Zipf distribution class with parameters S = 5, N = 10
            var zipf = new Zipf(5, 10);

            Console.WriteLine(@"1. Initialize the new instance of the Zipf distribution class with parameters S = {0}, N = {1}", zipf.S, zipf.N);
            Console.WriteLine();

            // 2. Distributuion properties:
            Console.WriteLine(@"2. {0} distributuion properties:", zipf);

            // Cumulative distribution function
            Console.WriteLine(@"{0} - Сumulative distribution at location '3'", zipf.CumulativeDistribution(3).ToString(" #0.00000;-#0.00000"));

            // Probability density
            Console.WriteLine(@"{0} - Probability mass at location '3'", zipf.Probability(3).ToString(" #0.00000;-#0.00000"));

            // Log probability density
            Console.WriteLine(@"{0} - Log probability mass at location '3'", zipf.ProbabilityLn(3).ToString(" #0.00000;-#0.00000"));

            // Entropy
            Console.WriteLine(@"{0} - Entropy", zipf.Entropy.ToString(" #0.00000;-#0.00000"));

            // Largest element in the domain
            Console.WriteLine(@"{0} - Largest element in the domain", zipf.Maximum.ToString(" #0.00000;-#0.00000"));

            // Smallest element in the domain
            Console.WriteLine(@"{0} - Smallest element in the domain", zipf.Minimum.ToString(" #0.00000;-#0.00000"));

            // Mean
            Console.WriteLine(@"{0} - Mean", zipf.Mean.ToString(" #0.00000;-#0.00000"));

            // Mode
            Console.WriteLine(@"{0} - Mode", zipf.Mode.ToString(" #0.00000;-#0.00000"));

            // Variance
            Console.WriteLine(@"{0} - Variance", zipf.Variance.ToString(" #0.00000;-#0.00000"));

            // Standard deviation
            Console.WriteLine(@"{0} - Standard deviation", zipf.StdDev.ToString(" #0.00000;-#0.00000"));

            // Skewness
            Console.WriteLine(@"{0} - Skewness", zipf.Skewness.ToString(" #0.00000;-#0.00000"));
            Console.WriteLine();

            // 3. Generate 10 samples of the Zipf distribution
            Console.WriteLine(@"3. Generate 10 samples of the Zipf distribution");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(zipf.Sample().ToString("N05") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 4. Generate 100000 samples of the Zipf(5, 10) distribution and display histogram
            Console.WriteLine(@"4. Generate 100000 samples of the Zipf(5, 10) distribution and display histogram");
            var data = new int[100000];

            Zipf.Samples(data, 5, 10);
            ConsoleHelper.DisplayHistogram(data);
            Console.WriteLine();

            // 5. Generate 100000 samples of the Zipf(2, 10) distribution and display histogram
            Console.WriteLine(@"5. Generate 100000 samples of the Zipf(2, 10) distribution and display histogram");
            Zipf.Samples(data, 2, 10);
            ConsoleHelper.DisplayHistogram(data);
            Console.WriteLine();

            // 6. Generate 100000 samples of the Zipf(5, 20) distribution and display histogram
            Console.WriteLine(@"6. Generate 100000 samples of the Zipf(1, 20) distribution and display histogram");
            Zipf.Samples(data, 1, 20);
            ConsoleHelper.DisplayHistogram(data);
        }