Пример #1
0
        public void Pareto_OneDimension_SmallerIsBetter()
        {
            var benchmark = new MockedBenchmark(
                time: n => 10.0 * n + 30,
                memory: n => 20.0 * n + 10);

            var pareto = new ParetoFilter<string>(new Dictionary<string, DimensionRating>()
            {
                { "Time", DimensionRating.SmallerIsBetter }
            });

            var result = pareto.Filter(benchmark.CreateMeasurements(20)).ToList();

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(30.0, result.Single().Measurements["Time"]);
        }
Пример #2
0
        public void Pareto_OneDimension_BiggerIsBetter()
        {
            var benchmark = new MockedBenchmark(
                time: n => 10.0 * n + 30,
                memory: n => 20.0 * n + 10);

            var pareto = new ParetoFilter <string>(new Dictionary <string, DimensionRating>()
            {
                { "Time", DimensionRating.BiggerIsBetter }
            });

            var result = pareto.Filter(benchmark.CreateMeasurements(20)).ToList();

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(220.0, result.Single().Measurements["Time"]);
        }
Пример #3
0
        public void Pareto_TwoDimension_NotCorrelated()
        {
            var benchmark = new MockedBenchmark(
                time: n => n < 25 ? 10.0 * n + 30
                                  : 10.0 * (n-25) + 10,
                memory: n => n < 25 ? 20.0 * n + 10
                                    : 30.0 * (n-25) + 20);

            var pareto = new ParetoFilter<string>(new Dictionary<string, DimensionRating>()
            {
                { "Time", DimensionRating.SmallerIsBetter },
                { "Memory", DimensionRating.BiggerIsBetter }
            });

            var result = pareto.Filter(benchmark.CreateMeasurements(50)).ToList();

            Assert.AreEqual(25, result.Count);
        }
Пример #4
0
        public void Pareto_TwoDimension_NotCorrelated()
        {
            var benchmark = new MockedBenchmark(
                time: n => n < 25 ? 10.0 * n + 30
                                  : 10.0 * (n - 25) + 10,
                memory: n => n < 25 ? 20.0 * n + 10
                                    : 30.0 * (n - 25) + 20);

            var pareto = new ParetoFilter <string>(new Dictionary <string, DimensionRating>()
            {
                { "Time", DimensionRating.SmallerIsBetter },
                { "Memory", DimensionRating.BiggerIsBetter }
            });

            var result = pareto.Filter(benchmark.CreateMeasurements(50)).ToList();

            Assert.AreEqual(25, result.Count);
        }
Пример #5
0
        private void OptimizeAnalysis(Configuration baseConfiguration)
        {
            IList <MeasuredConfiguration <Configuration> > measurements;
            var benchmark = CreateBenchmark();

            if (options.Repetitions > 1)
            {
                benchmark = new RepeatAverageBenchmark <Configuration>(benchmark, options.Repetitions);
            }
            switch (options.Method)
            {
            case OptimizationAlgorithm.Full:
                measurements = PerformFullExploration(baseConfiguration, benchmark);
                break;

            case OptimizationAlgorithm.Genetic:
                measurements = PerformGeneticAlgorithm(baseConfiguration, benchmark, options);
                break;

            default:
                throw new ArgumentOutOfRangeException("options", "The chosen method is not supported");
            }

            if (!options.All)
            {
                Console.WriteLine("Starting Pareto filter for dimensions Time and Memory");
                var paretoDimensions = new Dictionary <string, DimensionRating>();
                paretoDimensions.Add("Time", DimensionRating.SmallerIsBetter);
                paretoDimensions.Add("Memory", DimensionRating.SmallerIsBetter);
                var pareto = new ParetoFilter <Configuration>(paretoDimensions);

                measurements = pareto.Filter(measurements).ToList();
            }
            else
            {
                Console.WriteLine("Skipping Pareto filter");
            }

            Console.WriteLine("Saving results to disk.");
            if (measurements.Count == 1)
            {
                repository.Save(measurements[0].Configuration, options.Configuration);
            }
            else
            {
                using (var csv = new StreamWriter(Path.ChangeExtension(options.Configuration, "csv"), false))
                {
                    csv.Write("Configuration");
                    foreach (var metric in benchmark.Metrics)
                    {
                        csv.Write(";" + metric);
                    }
                    csv.WriteLine();
                    var index    = 1;
                    var baseName = Path.ChangeExtension(options.Configuration, null);
                    foreach (var config in measurements)
                    {
                        var fileName = string.Format("{0}_{1}.xmi", baseName, index);
                        csv.Write(Path.GetFileNameWithoutExtension(fileName));
                        foreach (var metric in benchmark.Metrics)
                        {
                            csv.Write(";");
                            csv.Write(config.Measurements[metric]);
                        }
                        csv.WriteLine();
                        repository.Save(config.Configuration, fileName);
                        index++;
                    }
                }
            }
        }