예제 #1
0
        public async Task <ActionResult> SolveTaskArea(SurfaceInfoViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Заполните обязательные поля корректно."));
            }

            try
            {
                if (model.IsParallel)
                {
                    var viewResult = GetAreaWithParallel(model);

                    return(View("_AreaPartial", viewResult));
                }
                else
                {
                    var viewResult = GetAreaWithoutParallel(model);

                    return(View("_AreaPartial", viewResult));
                }
            }
            catch (Exception ex)
            {
                HttpContext.Response.StatusCode = 500;
                ModelState.AddModelError(string.Empty, ex.Message);
                return(View("_AreaErrorPartial", ex.Message));
            }
        }
예제 #2
0
        private AreaResultViewModel GetAreaWithParallel(SurfaceInfoViewModel model)
        {
            var    tasks = new List <Task <double> >();
            double hX    = (model.XEnd - model.XStart) / model.ThreadsCount;
            double hY    = (model.YEnd - model.YStart) / model.ThreadsCount;

            for (int i = 0; i < model.ThreadsCount; i++)
            {
                double xnStep = model.XStart + hX * i;
                double xkStep = model.XStart + hX * (i + 1);

                tasks.Add(new Task <double>(() =>
                                            SurfaceAreaService.CalculateSurfaceAreaNamed(
                                                xnStep, xkStep,
                                                model.YStart, model.YEnd,
                                                model.Steps / model.ThreadsCount,
                                                model.Name)));
            }

            var startTime = Stopwatch.StartNew();

            tasks.ForEach(t => t.Start());
            Task.WaitAll(tasks.ToArray());

            var res = tasks.Sum(t => t.Result);

            startTime.Stop();

            var resultTime = startTime.Elapsed;

            return(new AreaResultViewModel {
                Result = res, Description = resultTime.ToString(),
            });
        }
예제 #3
0
        public async Task <ActionResult> SolveTaskChart(SurfaceInfoViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Заполните обязательные поля корректно."));
            }

            HttpClient client = new HttpClient();

            client.BaseAddress = new Uri("http://localhost:5000");

            var formContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("name", model.Name.Optimize()),
                new KeyValuePair <string, string>("xstart", Convert.ToString(model.XStart)),
                new KeyValuePair <string, string>("xend", Convert.ToString(model.XEnd)),
                new KeyValuePair <string, string>("ystart", Convert.ToString(model.YStart)),
                new KeyValuePair <string, string>("yend", Convert.ToString(model.YEnd)),
                new KeyValuePair <string, string>("step", Convert.ToString(DefStep)),
            });

            var response = await client.PostAsync("get_data", formContent);

            if (response.IsSuccessStatusCode)
            {
                return(Content(await response.Content.ReadAsStringAsync()));
            }

            HttpContext.Response.StatusCode = 500;
            return(View("_PlotErrorPartial", response.ReasonPhrase));
        }
예제 #4
0
        public async Task <ActionResult> SolveTaskArea(SurfaceInfoViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Заполните обязательные поля корректно."));
            }

            try
            {
                if (model.IsParallel)
                {
                    var approximateViewResult = GetAreaWithParallel(model);
                    var exactAreaResult       = await GetExactArea(model);

                    var absAccuracy = Math.Abs(approximateViewResult.Result - exactAreaResult);
                    var relAccuracy = (absAccuracy / exactAreaResult) * 100;

                    var analyticsViewModel = new AnalyticsResultViewModel
                    {
                        RelativeAccuracy  = relAccuracy,
                        AbsoluteAccuracy  = absAccuracy,
                        ApproximateResult = approximateViewResult,
                        ExactArea         = exactAreaResult,
                    };

                    return(PartialView("_AnalyticsResultPartial", analyticsViewModel));
                }
                else
                {
                    var approximateViewResult = GetAreaWithoutParallel(model);
                    var exactAreaResult       = await GetExactArea(model);

                    var absAccuracy = Math.Abs(approximateViewResult.Result - exactAreaResult);
                    var relAccuracy = (absAccuracy / exactAreaResult) * 100;

                    var analyticsViewModel = new AnalyticsResultViewModel
                    {
                        RelativeAccuracy  = relAccuracy,
                        AbsoluteAccuracy  = absAccuracy,
                        ApproximateResult = approximateViewResult,
                        ExactArea         = exactAreaResult,
                    };

                    return(PartialView("_AnalyticsResultPartial", analyticsViewModel));
                }
            }
            catch (Exception ex)
            {
                HttpContext.Response.StatusCode = 500;
                ModelState.AddModelError(string.Empty, ex.Message);
                return(View("_AreaErrorPartial", ex.Message));
            }
        }
예제 #5
0
        private AreaResultViewModel GetAreaWithoutParallel(SurfaceInfoViewModel model)
        {
            var    startTime = Stopwatch.StartNew();
            double res       = SurfaceAreaService.CalculateSurfaceAreaNamed(model.XStart, model.XEnd,
                                                                            model.YStart, model.YEnd,
                                                                            model.Steps,
                                                                            model.Name);

            startTime.Stop();

            var resultTime = startTime.Elapsed;

            return(new AreaResultViewModel {
                Result = res, Description = resultTime.ToString(),
            });
        }
예제 #6
0
        private AreaResultViewModel GetAreaWithoutParallel(SurfaceInfoViewModel model)
        {
            string outFileName = $"{DateTime.Now.ToString("yymmssfff")}-thread-calculations.txt";

            var    startTime = Stopwatch.StartNew();
            double res       = SurfaceAreaService.CalculateSurfaceArea(model.XStart, model.XEnd,
                                                                       model.YStart, model.YEnd,
                                                                       model.Steps,
                                                                       outFileName);

            startTime.Stop();

            var resultTime = startTime.Elapsed;

            return(new AreaResultViewModel {
                Result = res, Description = resultTime.ToString(),
            });
        }
예제 #7
0
        public async Task <ActionResult> GetTimeChart(SurfaceInfoViewModel model)
        {
            string outFileName = $"{DateTime.Now.ToString("yymmssfff")}-performance-testing.txt";

            var timeArr    = new List <long>();
            var threadsArr = new [] { 1, 2, 3, 5, 10, 15, 30 };

            foreach (var thrdCount in threadsArr)
            {
                var    tasks = new List <Task <double> >();
                double hX    = (model.XEnd - model.XStart) / thrdCount;
                double hY    = (model.YEnd - model.YStart) / thrdCount;

                for (int i = 0; i < thrdCount; i++)
                {
                    double xnStep = model.XStart + hX * i;
                    double xkStep = model.XStart + hX * (i + 1);

                    tasks.Add(new Task <double>(() =>
                                                SurfaceAreaService.CalculateSurfaceArea(
                                                    xnStep, xkStep,
                                                    model.YStart, model.YEnd,
                                                    model.Steps / thrdCount,
                                                    outFileName)));
                }

                var startTime = Stopwatch.StartNew();

                tasks.ForEach(t => t.Start());
                Task.WaitAll(tasks.ToArray());
                var res = tasks.Sum(t => t.Result);

                startTime.Stop();

                timeArr.Add(startTime.ElapsedMilliseconds);
            }

            return(new ObjectResult(new { threadsArr = threadsArr, timeArr = timeArr.ToArray() }));
        }
예제 #8
0
        public async Task <ActionResult> GetAccuracyChart(SurfaceInfoViewModel model)
        {
            var exactAreaResult = await GetExactArea(model);

            string outFileName = $"{DateTime.Now.ToString("yymmssfff")}-accuracy-testing.txt";

            var accuracyArr = new List <double>();
            var threadsArr  = new[] { 1, 2, 3, 5, 10, 15, 30 };

            foreach (var thrdCount in threadsArr)
            {
                var    tasks = new List <Task <double> >();
                double hX    = (model.XEnd - model.XStart) / thrdCount;
                double hY    = (model.YEnd - model.YStart) / thrdCount;

                for (int i = 0; i < thrdCount; i++)
                {
                    double xnStep = model.XStart + hX * i;
                    double xkStep = model.XStart + hX * (i + 1);

                    tasks.Add(new Task <double>(() =>
                                                SurfaceAreaService.CalculateSurfaceArea(
                                                    xnStep, xkStep,
                                                    model.YStart, model.YEnd,
                                                    model.Steps / thrdCount,
                                                    outFileName)));
                }
                tasks.ForEach(t => t.Start());
                Task.WaitAll(tasks.ToArray());

                var res = tasks.Sum(t => t.Result);


                accuracyArr.Add(Math.Abs(res - exactAreaResult));
            }

            return(new ObjectResult(new { threadsArr, accuracyArr = accuracyArr.ToArray() }));
        }
예제 #9
0
        private async Task <double> GetExactArea(SurfaceInfoViewModel model)
        {
            HttpClient client = new HttpClient();

            client.BaseAddress = new Uri("http://localhost:5000");

            var formContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("xstart", Convert.ToString(model.XStart)),
                new KeyValuePair <string, string>("xend", Convert.ToString(model.XEnd)),
                new KeyValuePair <string, string>("ystart", Convert.ToString(model.YStart)),
                new KeyValuePair <string, string>("yend", Convert.ToString(model.YEnd)),
                new KeyValuePair <string, string>("step", Convert.ToString(DefStep)),
            });

            var response = await client.PostAsync("get_exact_data", formContent);

            if (response.IsSuccessStatusCode)
            {
                return(Convert.ToDouble(await response.Content.ReadAsStringAsync()));
            }
            throw new InvalidOperationException("Невозможно найти точную площадь");
        }