Вы находитесь на странице: 1из 15

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ


ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ»

(национальный исследовательский университет)

Институт №3 «Системы управления, информатика и электроэнергетика»

Кафедра 304 «Вычислительные машины, системы и сети»

Конструирование ПО

Отчет по курсовой работе по теме

«Сравнение временных параметров выполнения приложений в Java и Win32»

Выполнил студент группы М3О-319Бк-18:

Ананьев Владислав Васильевич

Проверил:

профессор к.304, к.т.н., Гагарин Андрей Петрович

Москва 2020

Оглавление
Задание 2
Теоретическая часть 2
Основная часть 4
Вывод 13

Задание

2
Произвести сравнение временных параметров выполнения приложений в
Java и Win32

Теоретическая часть
Java
Java является популярным языком программирования высокого уровня.
Веб-приложения, мобильные приложения, высокопроизводительные
распределенные системы - вот некоторые примеры приложений на основе
Java. Кроме того, у Java есть много версий; Java SE является стандартной
версией. Java ME предназначена для разработки мобильных приложений, а
Java EE - для приложений уровня предприятия. В плюс ко всему, существуют
интегрированные среды разработки (IDE) со всеми необходимыми
инструментами для разработки приложений на Java.
Кроме того, Java – это чисто объектно-ориентированый язык
программирования, который поддерживает, которое позволяет моделировать
реальные сценарии в вычислительной технике. Однако исходный код Java не
преобразуется напрямую в машинный код. Сначала исходный код
преобразуется в промежуточный код: байт-код. Этот байт-код является
исполняемым на любой платформе, на которой установлена виртуальная
машины Java (JVM). Поэтому Java не зависит от платформы. Кроме того, он
обеспечивает обработку ошибок, проверку ошибок во время компиляции и
проверку во время выполнения. Также есть возможность реализовать
многопоточность и позволяет разрабатывать защищенные приложения.

Win32

Под платформой Win32 подразумеваются все 32-разрядные (32-битные)


операционные системы семейства MS Windows. Для создания приложений
под ОС MS Windows необходим компилятор языка. В нашем случае C++.
Удобнее использовать интегрированную среду разработки, в состав которой
входит нужный компилятор.

C++ — компилируемый, статически типизированный язык
программирования общего назначения. Поддерживает такие парадигмы
программирования, как процедурное программирование, объектно-
ориентированное программирование, обобщённое программирование. Язык
имеет богатую стандартную библиотеку, которая включает в себя
распространённые контейнеры и алгоритмы, ввод-вывод, регулярные
3
выражения, поддержку многопоточности и другие возможности. C++
сочетает свойства как высокоуровневых, так и низкоуровневых языков. В
сравнении с его предшественником — языком C — наибольшее внимание
уделено поддержке объектно-ориентированного и обобщённого
программирования.

Эффективность Java во многом определяется ее компилятором Just-In-


Time (JIT) и поддержкой параллелизма. Компилятор JIT является частью
среды выполнения Java. Он улучшает производительность программ Java,
компилируя байт-коды в машинный код «точно вовремя» для запуска.
Виртуальная машина Java (JVM) напрямую вызывает скомпилированный
код. Поскольку код не интерпретируется, компиляция не требует
процессорного времени и использования памяти. Теоретически это может
сделать программу на Java такой же быстрой, как собственное приложение.

Ключевым, определяющим отличием является то, что приложение


Win32 выполняется на реальном процессоре, без поддержки реального
времени.

Для измерения времени выполнения программы используется способ,


при котором время засекается в самом начале программы и перед выходом из
неё, затем, последняя отсечка вычитается из первой.

4
Основная часть

1. Программа на языке Java, которая 40 раз осуществляет расширение


изначального массива в «1,5 + 1» раз и выводит окончательную размерность
полученного массива вместе с временем, затраченным на выполнение. На
каждой итерации все элементы текущего массива переписываются в новый
массив большего размера, а оставшиеся (пустые, появившиеся за счёт
расширения) элементы заполняются поочередно числами по возрастанию с
шагом «1»

Текст программы на языке Java

package com.company;
public class Main {

public static void main(String[] args) {

int startTime = (int) System.currentTimeMillis();


int[] ints = new int[10];
int count = 0;
int size = 10;
int sizePrev;

for (int i = 0; i < ints.length; i++) {


ints[i] = i;
}

while (count != 40) {


sizePrev = size;
size = (int) (size * 1.5 + 1);
ints = expand(ints,size,sizePrev);
count++;
}

int endTime = (int) System.currentTimeMillis();

int runTime = endTime - startTime;

System.out.println(runTime/1000.0 + "с");
System.out.println(ints.length);

5
static int[] expand(int[] array, int size, int sizePrev) {

int[] newArray = new int[size];

for (int i = 0; i < newArray.length; i++) {


if (i >= sizePrev) {
newArray[i] = i;
} else {
newArray[i] = array[i];
}
}
return newArray;
}
}
Результат работы программы

Текст аналогичного консольного приложения Win32

#include <iostream>
#include <ctime>
using namespace std;

int* expand(int* arrays, size_t size, int sizePrev);

int main()
{
int* ints = new int[10];
int count = 0;
size_t size = 10;
int sizePrev;

for (int i = 0; i < 10; i++) {


ints[i] = i;
};

6
while (count != 40) {

sizePrev = size;
size = size * 1.5 + 1;
ints = expand(ints, size, sizePrev);

count++;
}

int end = clock();

cout << size << " ";


cout << end/1000.0;

int* expand(int* arrays, size_t size, int sizePrev) {

int* newArray = new int[size];

for (size_t i = 0; i < size; i++) {

if (i >= sizePrev) {
newArray[i] = i;
}
else {
newArray[i] = arrays[i];
}
}
return newArray;
}

Результат работы программы:

Сравнивая время выполнения представленных выше приложений


можно заметить, что консольное приложение Win32 осуществляется чуть
больше чем в 1.5 раза быстрее аналогичной на Java.
7
2. Программа на языке Java, которая, в заполненном путём сложения i-й
строки и j-го столбца двумерного массива, определяет максимальный
элемент. Размер данной «матрицы» 22000х22000.

Текст программы на языке Java

package com.company;

public class Main {

public static void main(String[] args) {

long start = System.currentTimeMillis();


int[][] ints = new int[22000][22000];
int size = 22000;

for (int i = 0; i < size; i++) {


for (int j = 0; j < size; j++) {
ints[i][j] = i + j;
}
}

int max = ints[0][0];

for (int i = 0; i < size; i++) {


for (int j = 0; j < size; j++) {
if (ints[i][j] > max) {
max = ints[i][j];
}
}

}
System.out.println(max);
long end = System.currentTimeMillis();
System.out.println((end - start)/1000.0 + "с");
}
}

8
Результат выполнения программы:

Текст аналогичного консольного приложения Win32

#include <iostream>
#include <ctime>
using namespace std;

int main() {
size_t size = 22000;

int** ints = new int*[size];


for (size_t i = 0; i < size; i++) {
ints[i] = new int[size+1];
}

for (size_t i = 0; i < size; i++) {


for (size_t j = 0; j < size; j++) {

ints[i][j] = i+j;
}
}

int max = ints[0][0];

for (size_t i = 0; i < size; i++) {


for (size_t j = 0; j < size; j++) {
if (ints[i][j] > max) {
max = ints[i][j];
}
}
}

9
cout << max;
int end_time = clock();
cout << " " << end_time / 1000.0;

return 0;

Результат выполнения программы:

На данном примере можно заметить, что консольное приложение


Win32 вновь выполнилось быстрее чем аналогичное приложение Java – на
этот раз почти в 2 раза.

10
3. Программа на языке Java, которая поэлементно перемножает две матрицы
размера 100х100 и выводит результат умножения в виде новой матрицы того
же размера в консоль.

Текст программы на языке Java

package com.company;

public class Main {

public static void main(String[] args) {

int start = (int) System.currentTimeMillis();

int[][] ints1 = new int[100][100];


int[][] ints2 = new int[100][100];

int[][] ints3 = new int[100][100];

int size = 100;

for (int i = 0; i < size; i++) {


for (int j = 0; j < size; j++) {
ints1[i][j] = i;
ints2[i][j] = i;
}
}

for (int i = 0; i < size; i++) {


for (int j = 0; j < size; j++) {
ints3[i][j] = ints1[i][j] * ints2[i][j];
}
}

for (int i = 0; i < size; i++) {


for (int j = 0; j < size; j++) {
System.out.print(ints3[i][j] + " ");
}
}

int end = (int) System.currentTimeMillis();

System.out.println((end - start)/1000.0 + "c");

11
}
}

Частичный результат работы программы

Текст аналогичного консольного приложения Win32

#include <ctime>
#include <iostream>

using namespace std;

int main()
{
int start_time = clock();

size_t size = 100;

int ints1[size][size];
int ints2[size][size];

int ints3[size][size];

for (size_t i = 0; i < size; i++) {


for (size_t j = 0; j < size; j++) {
ints1[i][j] = i;
ints2[i][j] = i;
}
12
}

for (size_t i = 0; i < size; i++) {


for (size_t j = 0; j < size; j++) {
ints3[i][j] = ints1[i][j] * ints2[i][j];
}
}

for (size_t i = 0; i < size; i++) {


for (size_t j = 0; j < size; j++) {
cout << ints3[i][j] << " ";
}
}

int end_time = clock(); // конечное время


int search_time = end_time - start_time; // искомое время

cout << (search_time / 1000.0) << "c ";

system("pause");

return 0;
}

Частичный результат работы программы

Как можете заметить, приложение на Java имеет колоссальное


преимущество над консольным приложением Win32, когда дело касается
скорости вывода. Разница практически в 18 раз для матрицы размера
100х100. Это связано с тем, что функциональность C++ в iostream
реализована иначе, чем в Java. В C++ вывод в IOStreams создает внутренний
тип, называемый sentry, перед выводом каждого символа. Например,
ostream:: sentry использует идиому RAII, чтобы гарантировать, что поток
находится в согласованном состоянии. В многопоточном окружении (которое
13
во многих случаях используется по умолчанию) sentry также используется
для блокировки объекта мьютекса и разблокировки его после печати каждого
символа. Операции блокировки / разблокировки Mutex очень дороги, и
именно поэтому происходит такое замедление. Java идет в другом
направлении и блокирует / разблокирует мьютекс только один раз для всей
выходной строки.

14
Вывод

В результате курсовой работы была выполнена поставленная задача, а


именно: произведено сравнение временных параметров выполнения
приложений в Java и Win32. Основываясь на полученных данных, можно
сделать вывод, что в целом Java уступает своему оппоненту практически на
всех испытаниях. И это не удивительно, ведь приложения Win32
выполняются «чисто» на процессоре, код практически напрямую
переводится в машинный. Однако стоит заметить, что С++ довольно сильно
зависит от знаний и навыков программиста. Несовершенный код и незнание
некоторых особенностей выполнения программ может привести к абсолютно
иным результатам. Также следует учитывать, что у всего есть свои
преимущества и свои недостатки и, конечно, нельзя сказать, что Java хуже
своего противника совершенно во всех компонентах.

Номер Время выполнения Время выполнения


программы приложения Java приложения Win32
(с) (с)
1 0.853 0.536
2 1.480 0.756
3 0.044 0.775

15