МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
Звіт
До лабораторної роботи № 10
З дисципліни : "Конструювання програмного забезпечення"
Варіант 3
Як відомо, у мові програмування С# існує 3 можливі передачі параметрів у функцію, для прикладу void DoSmthg1(ref x), void DoSmthg2(out x), void DoSmthg3(x). Визначити додаткові потреби пам’яті та швидкості для усіх трьох способів передачі параметрів. У процедурі DoSmthg обчислити нове значення змінної x.
1. Дані комп'ютера з параметрами на яких відбувалось порівняльне тестування швидкодії та потреб оперативної пам'яті :
Процесор – Intel Quad-Core 2.4 Ghz, ОЗП 4 Гб , Операційна система: Windows 7 Ultimate x64.
2.Дані чисельних експериментів.
Час виклику функцій з параметром який передається через ref
15 тис. раз, c
Час виклику функцій з параметром який передається через out
15 тис. раз, c
Час виклику функцій з параметром який передається , без ref і out
15 тис. раз, c
ОЗП для функцій з параметром який передається через ref
15 тис. раз, cMB
ОЗП для функцій з параметром який передається через out
15 тис. раз, cMB
ОЗП для функцій з параметром який передається без ref і out 15 тис. раз, cMB
Експеримент №1
0.002
0.041
0.037
36.78
37.10
37.41
Експеримент №2
0.002
0.037
0.038
35.08
36.11
36.42
Експеримент №3
0.002
0.039
0.037
35.82
36.13
36.44
Експеримент №4
0.003
0.039
0.037
35.83
36.14
36.45
Експеримент
№5
0.001
0.041
0.038
35.79
36.10
36.42
Виглад диспетчера задач після виконання програми:
3) Усереднені дані обчислювальних експериментів
фукцій з параметром який передається через ref
фукцій з параметром який передається через
out
функцій з параметром який передається , без ref і out
Середні потреби оперативної пам’яті, 15 тис викликів, MB
35.86
36.32
36.62
Середній час 15 тис викликів, с
0.002
0.039
0.037
Код програми:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication2
{
class Program
{
static void Met1(ref int i, int f)
{
i = 300;
if (f > 0)
{
--f;
--i;
Met1(ref i, f);
}
}
static void Met2(out int i,int f)
{
i = 300;
if (f > 0)
{
--f;
--i;
Met2(out i, f);
}
}
static void Met3( int i, int f)
{
i = 300;
//i++;
if (f > 0)
{
--f;
--i;
Met3( i, f);
}
}
static void Main()
{
int Z = 250;
int f = 15000;
int i=15000;
int k = 0;
DateTime Time1 = DateTime.Now;
for (k = 0; k < Z; k++)
Met1(ref k,f);
DateTime Time2 = DateTime.Now;
Console.WriteLine("Передаємо параметр через ref = {0}", Time2 - Time1);
Process[] processlist = Process.GetProcessesByName("ConsoleApplication2.vshost");
Console.WriteLine(processlist[0].PagedMemorySize64 / 1024.0 / 1024.0);
Time1 = DateTime.Now;
for (k = 0; k < Z; k++)
Met2(out i,f);
Time2 = DateTime.Now;
Console.WriteLine(" Передаємо параметр через out= {0}", Time2 - Time1);
processlist = Process.GetProcessesByName("ConsoleApplication2.vshost");
Console.WriteLine(processlist[0].PagedMemorySize64 / 1024.0 / 1024.0);
Time1 = DateTime.Now;
for (k = 0; k < Z; k++)
Met3( k,f);
Time2 = DateTime.Now;
Console.WriteLine(" Просто передаємо параметр= {0}", Time2 - Time1);
Process[] processlist3 = Process.GetProcessesByName("ConsoleApplication2.vshost");
Console.WriteLine(processlist3[0].PagedMemorySize64 / 1024.0 / 1024.0);
Console.ReadLine();
}
}
}
Висновок: В даній лабораторній роботі розглядалося швидкодію і затрати в пам’яті для виклику функцій передаючи їм параметри через ref і out, і без ref та out. Малі затрати в часі коли ми передаємо параметр через ref пов’язані з тим, що ми передаємо саме посилання на місце в пам’яті де знаходяться дані. Використовуючи параметр Out передаємо посилання на місце в пам’яті і за тим посиланням копіюємо дані, це і зумовлює більші затрати в часі і в пам’яті. Коли ми передаємо параметр не використовуючи ні ref ні out то ми вже посилання не передаємо, а просто копіюємо дані.