МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
Звіт
До лабораторної роботи № 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 то  ми вже посилання не передаємо, а просто копіюємо дані.