Материал: Исследование вычислительной эффективности веб-технологий

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Приложение разработано для вычисления площади фигуры методом Монте-Карло. Программа реализована на языке программирования высокого уровня С#.

Для работы приложения требуется наличие следующих программных пакетов:

·        операционная система MS Windows XP или более поздняя версия;

·        наличие обозревателя MS Internet Explorer 5.0 или выше;

·        Microsoft .Net Framework 3.0 или старше.

Программа в дополнительной настройке не нуждается.


6.5    Руководство программиста


Приложение разработано для вычисления площади фигуры методом Монте-Карло. Данное приложение состоит из двух частей (клиентской и серверной). В клиентской части реализован интерфейс WPF. Серверным приложением является веб-служба ASMX/C#.

Проект состоит из следующих файлов:

1)   MainWindow.aspx- файл содержащий в себе веб-форму;

2)      MainWindow.aspx.cs - файл содержащий в себе код для обработки событий происходящих на форме;

3)      Web.config - файл содержащий в себе настройки для корректной работы приложения на базе ASMX/C#

4)      WS_MonteKarlo.asmx - файл отвечающий за серверную часть;

5)      IceCream.cs - файл, содержащий классы IceCream, Triangle, Circle, Rectangle

)        Point.cs - файл, содержащий класс Point.

Для корректной работы приложения требуется:

·  операционная система Windows 2000 или старше;

·        Microsoft .Net Framework 3.0 или старше;

·  128 Мб оперативной памяти;

·        наличие 30 Мб свободного места на жестком диске.

Для запуска программы необходимо запустить проект App3.

Входными данными являются:

·  координаты точек.

Выходными данными являются:

·  таблица с информацией о работе метода Монте-Карло:

·  количество точек для данного опыта;

·        количество попавших в фигуру точек;

·        площадь фигуры, вычисленная методом Монте-Карло;

·        площадь фигуры, вычисленная по правилам геометрии;

·        погрешность вычислений;

·        время вычислений.

6.6    Руководство пользователя


Приложение разработано для вычисления площади треугольника методом Монте-Карло.

Программа выполнится успешно если компьютер удовлетворяет системным требованиям указанным в пункте 6.6.

Получите у человека, который разворачивает приложения, адрес и введите его в браузере. Пример адреса, который вам будет предоставлен - «#"863722.files/image028.gif">

Рис.19. Результаты работы приложения на базе WPF/ASMX/C#


7       АНАЛИЗ ВЫЧИСЛИТЕЛЬНОЙ ЭФФЕКТИВНОСТИ


Исследование вычислительной сложности алгоритма производится путем определения зависимости времени вычисления площади фигуры от количества генерируемых точек для метода Монте-Карло. Результаты представлены в таблице 1.

Таблица 1. Сравнение вычислительной эффективности приложений

Количество точек

Время выполнения приложения, мс


Настольное приложение WPF/XBAP

WEB приложение на базе Asp/JScript

Веб-приложение на базе WPF/ASMX/C#

1000

2

39

1

10000

6

653

2

100000

48

5053

18

1000000

500

44898

191

10000000

5355

438337

1745


Из таблицы видно, что приложение на базе WPF/ASMX/C# оказалось самым производительным. Также самым медленным по времени выполнения является веб-приложение на базе ASP/JScript. Это связано с тем, что JavaScript чувствителен к количеству переменных и из-за большого количества переменных приложение выполняется медленнее, чем все остальные.

Исследования проводились на ЭВМ со следующими характеристиками:

·        процессор - Intel® Core™ i5-3210M CPU @2.50GHz 2.50GHz;

·        оперативная память - 4096 Мб;

·        операционная система - Windows 7 SP1;

·        видеокарта - NVIDIA GeForce 610M 2048Mb.


ЗАКЛЮЧЕНИЕ


В ходе работы были разработаны три приложения: настольное приложение WPF/XBAP, веб-приложение на базе ASP/JScript, приложение на базе WPF/ASMX/C#, решающие одну и ту же задачу приближенного вычисления площади фигуры методом Монте-Карло. По полученным результатам была исследована вычислительная эффективность различных технологий программирования, а также были закреплены знания, полученные в ходе изучения курса "Технологии программирования".

Список литературы


1.     ГОСТ 19.106-78 ЕСПД. Требования к программным документам, выполненным печатным способом.

2.      ГОСТ 19.401-78 ЕСПД. Текст программы. Требования к содержанию и оформлению.

.        ГОСТ 19.402-78 ЕСПД. Описание программы.

.        ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.

.        ГОСТ 2.10 -95 «Общие требования к текстовым документам».

.        ГОСТ 19.701 - 90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

.        ГОСТ 19.503-79 Руководство системного программиста. Требования к содержанию и оформлению.

.        ГОСТ 19.504-79 Руководство программиста. Требования к содержанию и оформлению.

.        ГОСТ 19.505-79 Руководство пользователя. Требования к содержанию и оформлению.

.        Компьютерное оформление отчетных документов / Составитель Т.И. Матикашвили, ТулГУ, Тула, 2000. -36 с.

11.    Библиотека Microsoft MSDN - URL: <http://msdn.microsoft.com/ru-ru/library>

.        Шилдт Г. - C# 4.0 полное руководство - Москва: Вильямс, 2011 1056 с.

.        Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования Москва: Вильямс, 2011. - 528 c.

.        Никсон Р. - Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript и CSS - Питер, 2013. - 560 с.

.        Эндрю Троелсен - Язык программирования C# 5.0 и платформа .NET 4.5 Москва: Вильямс, 2013. - 1311 с.

ПРИЛОЖЕНИЕ

Файл Point.h (Файлы настольного приложения на базе WPF/C#)

using System;System.Collections.Generic;System.Linq;System.Text;

//using System.Threading.Tasks;

WPF_MonteKarlo

{class Point

{x, y;(float a, float b) { x = a; y = b; }

float PointX

{

{ return x; }

}float PointY

{

{ return y; }

}

}

Файл IceCream.cs

System;System.Collections.Generic;System.Linq;System.Text;

WPF_MonteKarlo

{IceCream

{abe;ab;abcd;(Point a, Point b, Point e)

{= new Triangle(a, b, e);= new Circle(a, b);= new Rectangle(ab.MinX, abe.MaxX, abe.MinY, abe.MaxY);

}bool PointInIceCream(Point randP)

{(randP.PointX>(ab.CentrPoint.PointX))

{ return abe.PointInLines(randP);}

{ return ab.PointInCircle(randP); }

}float realSquare() { return (abe.Square() + ab.Square());}float minX

{

{ab.MinX;

}

}float maxX

{

{abe.MaxX;

}

}float minY

{

{abe.MinY;

}

}float maxY

{

{abe.MaxY;

}

}float MonteKarloSquare(int count, out int numberPoints, out float rel_delta)

{rand = new Random();= 0;

//DateTime start_date_time = DateTime.Now;(int k = 0; k < count; k++)

{p = new Point(minX + (float)(rand.NextDouble() * (maxX - minX)),+ (float)(rand.NextDouble() * (maxY - minY)));(PointInIceCream(p))

{++;

}

}

//DateTime end_date_time = DateTime.Now;MK_Square = abcd.Square() * ((float)numberPoints / (float)count);_delta = (float)Math.Round((Math.Abs((MK_Square - realSquare()) * 100) / realSquare()) * 10000) / (float)10000.0;MK_Square;

}

}

Triangle

{a, b, e;k1;k2;(Point p1, Point p2, Point p3)

{= p1; b = p2; e = p3;= (e.PointY - a.PointY) / (e.PointX - a.PointX);= (e.PointY - b.PointY) / (e.PointX - b.PointX);

}

float Square()

{

ab = (float)Math.Sqrt(Math.Pow((a.PointX - b.PointX), 2) + Math.Pow((a.PointY - b.PointY), 2));ae = (float)Math.Sqrt(Math.Pow((a.PointX - e.PointX), 2) + Math.Pow((a.PointY - e.PointY), 2));be = (float)Math.Sqrt(Math.Pow((b.PointX - e.PointX), 2) + Math.Pow((b.PointY - e.PointY), 2));polperim = (ab + ae + be) / 2.0f;(float)Math.Sqrt((polperim * (polperim - ab) * (polperim - ae) * (polperim - be)));

}

bool PointInLines(Point p)

{((((p.PointX - a.PointX) * k1 + a.PointY) >= p.PointY) || (((p.PointX - b.PointX) * k2 + b.PointY) <= p.PointY))

{true;

}

{false;

}

}

float MaxX

{

{e.PointX;

}

}

float MinY

{

{a.PointY;

}

}

float MaxY

{

{b.PointY;

}

}

}Circle

{Centr;r;(Point p1, Point p2)

{= (p2.PointY - p1.PointY) / 2;= new Point(p1.PointX, p1.PointY + r);

}

float Square()

{(float)(Math.PI * Math.Pow(r, 2) / 2.0);

}

bool PointInCircle(Point p1)

{(p1.PointX < Centr.PointX)

{((Math.Pow(p1.PointX - Centr.PointX, 2) + Math.Pow(p1.PointY - Centr.PointY, 2)) <= Math.Pow(r, 2));

}{ return false; }

}

float MinX

{

{Centr.PointX - r;

}

}

Point CentrPoint

{

{Centr;

}

}

}

Rectangle

{MinX, MaxX, MinY, MaxY;(float MiX, float MaX, float MiY, float MaY)

{= MiX;= MaX;= MiY;= MaY;

}float Square()

{(MaxX - MinX) * (MaxY - MinY);

}

}

}

Файл Page1.xaml

<Page x:Class="app1.Page1"="http://schemas.microsoft.com/winfx/2006/xaml/presentation":x="http://schemas.microsoft.com/winfx/2006/xaml":mc="http://schemas.openxmlformats.org/markup-compatibility/2006":d="http://schemas.microsoft.com/expression/blend/2008":Ignorable="d":DesignHeight="300" d:DesignWidth="300"="Page1">

<Grid Margin="0,0,-326,0">

<TextBox x:Name="KoordinX_A" HorizontalAlignment="Left" Height="23" Margin="61,52,0,0" TextWrapping="Wrap" Text="-8" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<TextBox x:Name="KoordinX_B" HorizontalAlignment="Left" Height="23" Margin="61,75,0,0" TextWrapping="Wrap" Text="-8" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<TextBox x:Name="KoordinX_D" HorizontalAlignment="Left" Height="23" Margin="61,98,0,0" TextWrapping="Wrap" Text="37" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<TextBox x:Name="KoordinY_A" HorizontalAlignment="Left" Height="23" Margin="146,52,0,0" TextWrapping="Wrap" Text="-9" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<TextBox x:Name="KoordinY_B" HorizontalAlignment="Left" Height="23" Margin="146,75,0,0" TextWrapping="Wrap" Text="17" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<TextBox x:Name="KoordinY_D" HorizontalAlignment="Left" Height="23" Margin="146,98,0,0" TextWrapping="Wrap" Text="-9" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>

<Button x:Name="Button1" Content="Расчёт" HorizontalAlignment="Left" Margin="243,49,0,0" VerticalAlignment="Top" Width="149" RenderTransformOrigin="0.427,0.455" Click="Button1_Click"/>

<ListBox x:Name="List" HorizontalAlignment="Left" Height="153" Margin="0,147,0,0" VerticalAlignment="Top" Width="626"/>

<Label Content="A" HorizontalAlignment="Left" Margin="10,49,0,0" VerticalAlignment="Top"/>

<Label Content="B" HorizontalAlignment="Left" Margin="10,73,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.623,0.128"/>

<Label Content="D" HorizontalAlignment="Left" Margin="10,98,0,0" VerticalAlignment="Top"/>

<Label Content="X" HorizontalAlignment="Left" Margin="68,21,0,0" VerticalAlignment="Top"/>

<Label Content="Y" HorizontalAlignment="Left" Margin="153,21,0,0" VerticalAlignment="Top"/>

<Button Content="Очистить" HorizontalAlignment="Left" Margin="243,73,0,0" VerticalAlignment="Top" Width="149" Click="Button2_Click"/>

<Button Content="Контрольный пример" HorizontalAlignment="Left" Margin="243,99,0,0" VerticalAlignment="Top" Width="149" Click="Button3_Click"/>

</Grid>

</Page>

Файл Page1.xaml.cs

System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;System.Windows;System.Windows.Controls;System.Windows.Data;System.Windows.Documents;System.Windows.Input;System.Windows.Media;System.Windows.Media.Imaging;System.Windows.Navigation;System.Windows.Shapes;

app1

{

/// <summary>

/// Логика взаимодействия для Page1.xaml

/// </summary>partial class Page1 : Page

{Page1()

{();

}

ax = -8;bx = -8;dx = 37;ay = -9;by = 17;dy = -9;

bool check()

{result = true; // ошибок нетNumber;Error = "";

(float.TryParse(KoordinY_A.Text, out Number)) // проверка координаты Y точки А

{(float.Parse(KoordinY_A.Text) >= float.Parse(KoordinY_B.Text))

{+= "Координата Y точки A не может быть больше координаты Y точки В ";

KoordinY_A.Text = ay.ToString();= false;

}(float.Parse(KoordinY_A.Text) > float.Parse(KoordinY_D.Text))

{+= "Координата Y точки A не может быть больше координаты Y точки D";

KoordinY_A.Text = ay.ToString();= false;

}

}

{= false;

}

(float.TryParse(KoordinY_B.Text, out Number)) // проверка координаты Y точки B

{(float.Parse(KoordinY_B.Text) <= float.Parse(KoordinY_A.Text))

{

+= "Координата Y точки B не может быть меньше координаты Y точки А";

KoordinY_B.Text = by.ToString();= false;

}(float.Parse(KoordinY_B.Text) <= float.Parse(KoordinY_D.Text))

{+= "Координата Y точки B не может быть меньше координаты Y точки D";

KoordinY_B.Text = by.ToString();= false;

}

}

{= false;

}

(float.TryParse(KoordinX_A.Text, out Number)) //проверка координаты Х точки А

{(float.Parse(KoordinX_A.Text) >= float.Parse(KoordinX_D.Text))

{+= "Координата X точки A не может быть больше координаты X точки D";

KoordinX_A.Text = ax.ToString();= false;

}

}

{= false;

}

(float.TryParse(KoordinX_B.Text, out Number)) //проверка координаты Х точки B

{(float.Parse(KoordinX_B.Text) >= float.Parse(KoordinX_D.Text))

{+= "Координата X точки B не может быть больше координаты X точки D";

KoordinX_B.Text = bx.ToString();= false;

}

}

{= false;

}(float.TryParse(KoordinX_D.Text, out Number)) //проверка координаты Х точки Е

{((float.Parse(KoordinX_D.Text) <= float.Parse(KoordinX_A.Text)) || (float.Parse(KoordinX_D.Text) <= float.Parse(KoordinX_B.Text)))

{+= "Координата X точки D не может быть меньше координаты X точки А и В";

KoordinX_D.Text = dx.ToString();= false;

}

}

{= false;

}

(float.TryParse(KoordinY_D.Text, out Number)) // проверка координаты Y точки Е

{((float.Parse(KoordinY_D.Text) < float.Parse(KoordinY_A.Text)))

{+= "Координата Y точки D не может быть меньше координаты Y точки А";

KoordinY_D.Text = dy.ToString();= false;

}((float.Parse(KoordinY_D.Text) >= float.Parse(KoordinY_B.Text)))

{+= "Координата Y точки D не может быть больше координаты Y точки В";

KoordinY_D.Text = dy.ToString();= false;

}

}

{= false;

}(result == false)

{.Show(Error, "Введено некорректное значение координат", MessageBoxButton.OK, MessageBoxImage.Warning);result;

}

{result;

}

}

void LostFocusTB(object sender, RoutedEventArgs ee)

{EventTextBox = (TextBox)sender;Number = 0.0f;TextInTextBox = EventTextBox.Text.Replace(".", ",");(float.TryParse(TextInTextBox, out Number))

{(EventTextBox.Equals(KoordinX_A)) // проверка координаты X точки А

{_B.Text = KoordinX_A.Text;= float.Parse(KoordinX_A.Text);= float.Parse(KoordinX_B.Text);

}

(EventTextBox.Equals(KoordinX_B)) // проверка координаты X точки B

{_A.Text = KoordinX_B.Text;= float.Parse(KoordinX_B.Text);= float.Parse(KoordinX_A.Text);

}(EventTextBox.Equals(KoordinX_D)) // проверка координаты X точки D

{= float.Parse(KoordinX_D.Text);

}(EventTextBox.Equals(KoordinY_A)) // проверка координаты Y точки A

{_D.Text = ay.ToString();= float.Parse(KoordinY_D.Text);= float.Parse(KoordinY_A.Text);

}(EventTextBox.Equals(KoordinY_B)) // проверка координаты Y точки B

{= float.Parse(KoordinY_B.Text);

}(EventTextBox.Equals(KoordinY_D)) // проверка координаты Y точки D

{= float.Parse(KoordinY_A.Text);= float.Parse(KoordinY_D.Text);_A.Text = dy.ToString();

}

(KoordinX_A.Text != "" && KoordinX_B.Text != "" && KoordinX_D.Text != "" && KoordinY_A.Text != ""

&& KoordinY_B.Text != "" && KoordinY_D.Text != "")

{.IsEnabled = true;

}

{.IsEnabled = false;

}

}

{cur_result = MessageBox.Show("Введено некорректное значение координаты\n",

//"Будет поставлено предыдущее значение",

"Введено некорректное значение координаты", MessageBoxButton.OK,

MessageBoxImage.Exclamation);(cur_result == MessageBoxResult.OK)

{(EventTextBox.Equals(KoordinX_A))

{_A.Text = ax.ToString();

}(EventTextBox.Equals(KoordinX_B))

{_B.Text = bx.ToString();

}(EventTextBox.Equals(KoordinX_D))

{_D.Text = dx.ToString();

}(EventTextBox.Equals(KoordinY_A))

{_A.Text = ay.ToString();

}(EventTextBox.Equals(KoordinY_B))

{_B.Text = by.ToString();

}(EventTextBox.Equals(KoordinY_D))

{_D.Text = ay.ToString();

}

}

}

}void Button1_Click(object sender, RoutedEventArgs e)

{(check())

{.Items.Clear();a = new Point(ax, ay);b = new Point(bx, by);d = new Point(dx, dy);icecream = new IceCream(a, b, d);perc;one_line;

List.Items.Add("Кол-во точек " + "Попавшие точки " + "S Монте-Карло " + "Реальная S " + "Погрешность " + "Время расчёта, мc");

float square = icecream.realSquare();(int i = 3; i < 8; i++)

{space = " ";numberPoints = 0;rel_delta = 0;MK_Square = 0;start_date_time = DateTime.Now;_Square = icecream.MonteKarloSquare((int)Math.Pow(10, i), out numberPoints, out rel_delta);end_date_time = DateTime.Now;arv_time = end_date_time - start_date_time;(int j = 1; j < 9 - i; j++) { space += " "; }= MK_Square / square;(perc >= 1) { perc = perc - 1; } else { perc = 1 - perc; }_line = Math.Pow(10, i) + space + " " + numberPoints.ToString() + space + " " + MK_Square.ToString(format: "F") + " " +.ToString(format: "F") + " " + perc.ToString(format: "P") + " " + arv_time.TotalMilliseconds;.Items.Add(one_line); //List.Items.Add("____________________________");

}

}{ }

}void Button2_Click(object sender, RoutedEventArgs ee)

{_A.Text = KoordinX_B.Text =_D.Text = KoordinY_A.Text =_B.Text = KoordinY_D.Text = "";.IsEnabled = false;

}

void Button3_Click(object sender, RoutedEventArgs ee)

{= bx = -8;= 37;= dy = -9;= 17;

_A.Text = ax.ToString();_B.Text = bx.ToString();_D.Text = dx.ToString();_A.Text = ay.ToString();_B.Text = by.ToString();_D.Text = dy.ToString();.IsEnabled = true;

}

}

}

Файл MonteKarlo.html (Файлы веб-приложения на базе ASP/Jscript)



<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Расчет площади методом Монте-Карло</title>

<script>changeAX() {.getElementById("bx").value = document.getElementById("ax").value;

}changeBX() {.getElementById("ax").value = document.getElementById("bx").value;

}Reset() {.KoordinX_A.value = "";.KoordinX_B.value = "";.KoordinX_D.value = "";.KoordinY_A.value = "";.KoordinY_B.value = "";.KoordinY_D.value = "";

}Example() {.KoordinX_A.value = "10";.KoordinX_B.value = "10";.KoordinX_D.value = "40";.KoordinY_A.value = "0";.KoordinY_B.value = "10";.KoordinY_D.value = "0";

}

</script>

</script>

</head>

<body>

<form action="MonteKarlo.asp" method="POST" name="MonteKarlo">

<div id="container">

<img src="icecream2.jpg" width="50%" align="right">

<table border="2" width="49%" height="25%" bgcolor="Azure" bordercolor="Black">

<tr>

<th colspan="3">Координаты треугольника ABD</th>

</tr>

<tr>

<td width="14%">Точка А:</td>

<td width="43%"><input type="text" value="10" name="KoordinX_A" size="20" onchange="changeAX();" id="ax"></td>