GreenMap

Лабораторная 3 по ААС

Mar 20th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Threading;
  5.  
  6. namespace Lab_3_AAC
  7. {
  8.     class Program
  9.     {
  10.         static int[] MessagesCountList = { 100, 500, 1000 };
  11.         static int[] MessagesSizeList = { 50, 100, 200 };
  12.         static int[] ThreadCountList = { 6, 12, 24 };
  13.         static string Buffer;
  14.         //M общие
  15.         static int ProcessIndex;
  16.         static bool bEmpty;
  17.         static bool finish;
  18.         //M3
  19.         static AutoResetEvent[] state = new AutoResetEvent[2];
  20.         static List<string> result = new List<string>();
  21.         //M4
  22.         static SemaphoreSlim semaphore;
  23.         static void Main(string[] args)
  24.         {
  25.             int ParamAmounts = MessagesCountList.Length * MessagesSizeList.Length * ThreadCountList.Length;
  26.             string avgText = "Среднее время первого метода: " + FirstMethod()/ParamAmounts + "\n" +
  27.                 "Среднее время второго метода: " + SecondMethod()/ParamAmounts + "\n" +
  28.                 "Среднее время третьего метода: " + ThirdMethod()/ParamAmounts + "\n" +
  29.                 "Среднее время четвертого метода: " + FourthMethod()/ParamAmounts + "\n" +
  30.                 "Среднее время пятого метода: " + FivesMethod()/ParamAmounts + "\n";
  31.             Console.WriteLine(avgText);
  32.             Console.ReadLine();
  33.         }
  34.         static string[] SetMessages(int indexMesCount, int indexMesSize)
  35.         {
  36.             string[] result = new string[MessagesCountList[indexMesCount]];
  37.             Random rand = new Random();
  38.             for (int i = 0; i < MessagesCountList[indexMesCount]; i++)
  39.             {
  40.                 result[i] = RepeatTheChar("ABCDE"[rand.Next(4)], MessagesSizeList[indexMesSize]);
  41.             }
  42.             return result;
  43.         }
  44.         static string RepeatTheChar(char c, int count)
  45.         {
  46.             string result = "";
  47.             for (int i = 0; i < count; i++)
  48.             {
  49.                 result += c;
  50.             }
  51.             return result;
  52.         }
  53.         static float FirstMethod()
  54.         {
  55.             float allTime = 0f;
  56.             for (int ThreadCountIndex = 0; ThreadCountIndex < ThreadCountList.Length; ThreadCountIndex++)
  57.             {
  58.                 for (int MessageCountIndex = 0; MessageCountIndex < MessagesCountList.Length; MessageCountIndex++)
  59.                 {
  60.                     for (int MessageSizeIndex = 0; MessageSizeIndex < MessagesSizeList.Length; MessageSizeIndex++)
  61.                     {
  62.                         string[] Messages = SetMessages(MessageCountIndex, MessageSizeIndex);
  63.                         ProcessIndex = 0;
  64.                         result.Clear();
  65.                         bEmpty = true;
  66.                         finish = false;
  67.                         Stopwatch time = new Stopwatch();
  68.                         time.Start();
  69.                         Thread[] writers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  70.                         Thread[] readers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  71.                         for (int i = 0; i < writers.Length; i++)
  72.                         {
  73.                             writers[i] = new Thread(WriterM1);
  74.                             writers[i].Start(Messages);
  75.                         }
  76.                         for (int i = 0; i < readers.Length; i++)
  77.                         {
  78.                             readers[i] = new Thread(ReaderM1);
  79.                             readers[i].Start();
  80.                         }
  81.                         for (int i = 0; i < writers.Length; i++)
  82.                         {
  83.                             writers[i].Join();
  84.                         }
  85.                         finish = true;
  86.                         for (int i = 0; i < readers.Length; i++)
  87.                         {
  88.                             readers[i].Join();
  89.                         }
  90.                         time.Stop();
  91.                         Console.WriteLine("Время при коллич потоков: {0}, коллич сообщений: {1}, размере сообщений {2}: {3} ms",
  92.                             ThreadCountList[ThreadCountIndex], MessagesCountList[MessageCountIndex], MessagesSizeList[MessageSizeIndex], time.ElapsedMilliseconds);
  93.                         allTime += time.ElapsedMilliseconds;
  94.                     }
  95.                 }
  96.             }
  97.             return allTime;
  98.         }
  99.         static float SecondMethod()
  100.         {
  101.             float allTime = 0f;
  102.             for (int ThreadCountIndex = 0; ThreadCountIndex < ThreadCountList.Length; ThreadCountIndex++)
  103.             {
  104.                 for (int MessageCountIndex = 0; MessageCountIndex < MessagesCountList.Length; MessageCountIndex++)
  105.                 {
  106.                     for (int MessageSizeIndex = 0; MessageSizeIndex < MessagesSizeList.Length; MessageSizeIndex++)
  107.                     {
  108.                         string[] Messages = SetMessages(MessageCountIndex, MessageSizeIndex);
  109.                         ProcessIndex = 0;
  110.                         result.Clear();
  111.                         bEmpty = true;
  112.                         finish = false;
  113.                         Stopwatch time = new Stopwatch();
  114.                         time.Start();
  115.                         Thread[] writers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  116.                         Thread[] readers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  117.                         for (int i = 0; i < writers.Length; i++)
  118.                         {
  119.                             writers[i] = new Thread(WriterM2);
  120.                             writers[i].Start(Messages);
  121.                         }
  122.                         for (int i = 0; i < readers.Length; i++)
  123.                         {
  124.                             readers[i] = new Thread(ReaderM2);
  125.                             readers[i].Start();
  126.                         }
  127.                         for (int i = 0; i < writers.Length; i++)
  128.                         {
  129.                             writers[i].Join();
  130.                         }
  131.                         finish = true;
  132.                         for (int i = 0; i < readers.Length; i++)
  133.                         {
  134.                             readers[i].Join();
  135.                         }
  136.                         time.Stop();
  137.                         Console.WriteLine("Время при коллич потоков: {0}, коллич сообщений: {1}, размере сообщений {2}: {3} ms",
  138.                             ThreadCountList[ThreadCountIndex], MessagesCountList[MessageCountIndex], MessagesSizeList[MessageSizeIndex], time.ElapsedMilliseconds);
  139.                         allTime += time.ElapsedMilliseconds;
  140.                     }
  141.                 }
  142.             }
  143.             return allTime;
  144.         }
  145.         static float ThirdMethod()
  146.         {
  147.             float allTime = 0f;
  148.             for (int ThreadCountIndex = 0; ThreadCountIndex < ThreadCountList.Length; ThreadCountIndex++)
  149.             {
  150.                 for (int MessageCountIndex = 0; MessageCountIndex < MessagesCountList.Length; MessageCountIndex++)
  151.                 {
  152.                     for (int MessageSizeIndex = 0; MessageSizeIndex < MessagesSizeList.Length; MessageSizeIndex++)
  153.                     {
  154.                         string[] Messages = SetMessages(MessageCountIndex, MessageSizeIndex);
  155.                         ProcessIndex = 0;
  156.                         result.Clear();
  157.                         finish = false;
  158.                         state[0] = new AutoResetEvent(false);
  159.                         state[1] = new AutoResetEvent(true);
  160.                         Stopwatch time = new Stopwatch();
  161.                         time.Start();
  162.                         Thread[] writers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  163.                         Thread[] readers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  164.                         for (int i = 0; i < writers.Length; i++)
  165.                         {
  166.                             writers[i] = new Thread(WriterM3);
  167.                             writers[i].Start(Messages);
  168.                         }
  169.                         for (int i = 0; i < readers.Length; i++)
  170.                         {
  171.                             readers[i] = new Thread(ReaderM3);
  172.                             readers[i].Start();
  173.                         }
  174.                         for (int i = 0; i < writers.Length; i++)
  175.                         {
  176.                             writers[i].Join();
  177.                         }
  178.                         finish = true;
  179.                         for (int i = 0; i < readers.Length; i++)
  180.                         {
  181.                             while (readers[i].IsAlive)
  182.                             {
  183.                                 state[0].Set();
  184.                             }
  185.                             readers[i].Join();
  186.                         }
  187.                         time.Stop();
  188.                         Console.WriteLine("Время при коллич потоков: {0}, коллич сообщений: {1}, размере сообщений {2}: {3} ms",
  189.                             ThreadCountList[ThreadCountIndex], MessagesCountList[MessageCountIndex], MessagesSizeList[MessageSizeIndex], time.ElapsedMilliseconds);
  190.                         allTime += time.ElapsedMilliseconds;
  191.                     }
  192.                 }
  193.             }
  194.             return allTime;
  195.         }
  196.         static float FourthMethod()
  197.         {
  198.             float allTime = 0f;
  199.             for (int ThreadCountIndex = 0; ThreadCountIndex < ThreadCountList.Length; ThreadCountIndex++)
  200.             {
  201.                 for (int MessageCountIndex = 0; MessageCountIndex < MessagesCountList.Length; MessageCountIndex++)
  202.                 {
  203.                     for (int MessageSizeIndex = 0; MessageSizeIndex < MessagesSizeList.Length; MessageSizeIndex++)
  204.                     {
  205.                         string[] Messages = SetMessages(MessageCountIndex, MessageSizeIndex);
  206.                         ProcessIndex = 0;
  207.                         result.Clear();
  208.                         bEmpty = true;
  209.                         finish = false;
  210.                         semaphore = new SemaphoreSlim(ThreadCountList[ThreadCountIndex], ThreadCountList[ThreadCountIndex]);
  211.                         Stopwatch time = new Stopwatch();
  212.                         time.Start();
  213.                         Thread[] writers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  214.                         Thread[] readers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  215.                         for (int i = 0; i < writers.Length; i++)
  216.                         {
  217.                             writers[i] = new Thread(WriterM4);
  218.                             writers[i].Start(Messages);
  219.                         }
  220.                         for (int i = 0; i < readers.Length; i++)
  221.                         {
  222.                             readers[i] = new Thread(ReaderM4);
  223.                             readers[i].Start();
  224.                         }
  225.                         for (int i = 0; i < writers.Length; i++)
  226.                         {
  227.                             writers[i].Join();
  228.                         }
  229.                         finish = true;
  230.                         for (int i = 0; i < readers.Length; i++)
  231.                         {
  232.                             readers[i].Join();
  233.                         }
  234.                         time.Stop();
  235.                         Console.WriteLine("Время при коллич потоков: {0}, коллич сообщений: {1}, размере сообщений {2}: {3} ms",
  236.                             ThreadCountList[ThreadCountIndex], MessagesCountList[MessageCountIndex], MessagesSizeList[MessageSizeIndex], time.ElapsedMilliseconds);
  237.                         allTime += time.ElapsedMilliseconds;
  238.                     }
  239.                 }
  240.             }
  241.             return allTime;
  242.         }
  243.         static float FivesMethod()
  244.         {
  245.             float allTime = 0f;
  246.             for (int ThreadCountIndex = 0; ThreadCountIndex < ThreadCountList.Length; ThreadCountIndex++)
  247.             {
  248.                 for (int MessageCountIndex = 0; MessageCountIndex < MessagesCountList.Length; MessageCountIndex++)
  249.                 {
  250.                     for (int MessageSizeIndex = 0; MessageSizeIndex < MessagesSizeList.Length; MessageSizeIndex++)
  251.                     {
  252.                         string[] Messages = SetMessages(MessageCountIndex, MessageSizeIndex);
  253.                         ProcessIndex = 0;
  254.                         result.Clear();
  255.                         bEmpty = true;
  256.                         finish = false;
  257.                         Stopwatch time = new Stopwatch();
  258.                         time.Start();
  259.                         Thread[] writers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  260.                         Thread[] readers = new Thread[ThreadCountList[ThreadCountIndex] / 2];
  261.                         for (int i = 0; i < writers.Length; i++)
  262.                         {
  263.                             writers[i] = new Thread(WriterM5);
  264.                             writers[i].Start(Messages);
  265.                         }
  266.                         for (int i = 0; i < readers.Length; i++)
  267.                         {
  268.                             readers[i] = new Thread(ReaderM5);
  269.                             readers[i].Start();
  270.                         }
  271.                         for (int i = 0; i < writers.Length; i++)
  272.                         {
  273.                             writers[i].Join();
  274.                         }
  275.                         finish = true;
  276.                         for (int i = 0; i < readers.Length; i++)
  277.                         {
  278.                             readers[i].Join();
  279.                         }
  280.                         time.Stop();
  281.                         Console.WriteLine("Время при коллич потоков: {0}, коллич сообщений: {1}, размере сообщений {2}: {3} ms",
  282.                             ThreadCountList[ThreadCountIndex], MessagesCountList[MessageCountIndex], MessagesSizeList[MessageSizeIndex], time.ElapsedMilliseconds);
  283.                         allTime += time.ElapsedMilliseconds;
  284.                     }
  285.                 }
  286.             }
  287.             return allTime;
  288.         }
  289.         static void WriterM1(Object o)
  290.         {
  291.             while (ProcessIndex < ((string[])o).Length)
  292.             {
  293.                 if (bEmpty)
  294.                 {
  295.                     try
  296.                     { Buffer = ((string[])o)[ProcessIndex++]; }
  297.                     catch { break; }
  298.                     bEmpty = false;
  299.                 }
  300.             }
  301.         }
  302.         static void ReaderM1()
  303.         {
  304.             while (!finish)
  305.             {
  306.                 if (!bEmpty)
  307.                 {
  308.                     result.Add(Buffer);
  309.                     bEmpty = true;
  310.                 }
  311.             }
  312.         }
  313.         static void WriterM2(Object o)
  314.         {
  315.             while (ProcessIndex < ((string[])o).Length)
  316.             {
  317.                 lock ("write")
  318.                 {
  319.                     if (bEmpty)
  320.                     {
  321.                         try
  322.                         { Buffer = ((string[])o)[ProcessIndex++]; }
  323.                         catch { break; }
  324.                         bEmpty = false;
  325.                     }
  326.                 }
  327.             }
  328.         }
  329.         static void ReaderM2()
  330.         {
  331.             while (!finish)
  332.             {
  333.                 if (!bEmpty)
  334.                 {
  335.                     lock ("read")
  336.                     {
  337.                         if (!bEmpty)
  338.                         {
  339.                             result.Add(Buffer);
  340.                             bEmpty = true;
  341.                         }
  342.                     }
  343.                 }
  344.             }
  345.         }
  346.         static void ReaderM3()
  347.         {
  348.             var evFull = state[0] as AutoResetEvent;
  349.             var evEmpty = state[1] as AutoResetEvent;
  350.             while (true)
  351.             {
  352.                 evFull.WaitOne();
  353.                 if (finish) break;
  354.                 // Сигнал о завершении работы
  355.                 result.Add(Buffer);
  356.                 evEmpty.Set();
  357.             }
  358.         }
  359.         static void WriterM3(object o)
  360.         {
  361.             var evFull = state[0] as AutoResetEvent;
  362.             var evEmpty = state[1] as AutoResetEvent;
  363.             while (ProcessIndex < ((string[])o).Length)
  364.             {
  365.                 evEmpty.WaitOne();
  366.                 try { Buffer = ((string[])o)[ProcessIndex++]; }
  367.                 catch { evFull.Set(); break; }
  368.                 evFull.Set();
  369.             }
  370.         }
  371.         static void ReaderM4()
  372.         {
  373.             var semReader = semaphore as SemaphoreSlim;
  374.             while (!finish)
  375.             {
  376.                 if (!bEmpty)
  377.                 {
  378.                     semReader.Wait();
  379.                     if (!bEmpty)
  380.                     {
  381.                         bEmpty = true;
  382.                         result.Add(Buffer);
  383.                     }
  384.                     semReader.Release();
  385.                 }
  386.             }
  387.         }
  388.         static void WriterM4(object o)
  389.         {
  390.             var semWriter = semaphore as SemaphoreSlim;
  391.             while (ProcessIndex < ((string[])o).Length)
  392.             {
  393.                 if (bEmpty)
  394.                 {
  395.                     semWriter.Wait();
  396.                     if (bEmpty)
  397.                     {
  398.                         bEmpty = false;
  399.                         try{ Buffer = ((string[])o)[ProcessIndex++]; }
  400.                         catch { break; }
  401.                     }
  402.                     semWriter.Release();
  403.                 }
  404.             }
  405.         }
  406.         static void WriterM5(Object o)
  407.         {
  408.             while (ProcessIndex < ((string[])o).Length)
  409.             {
  410.                 if (bEmpty)
  411.                 {
  412.                     try{ Buffer = ((string[])o)[Interlocked.Increment(ref ProcessIndex)]; }
  413.                     catch { break; }
  414.                     bEmpty = false;
  415.                 }
  416.             }
  417.         }
  418.         static void ReaderM5()
  419.         {
  420.             while (!finish)
  421.             {
  422.                 if (!bEmpty)
  423.                 {
  424.                     lock ("read")
  425.                     {
  426.                         if (!bEmpty)
  427.                         {
  428.                             result.Add(Buffer);
  429.                             bEmpty = true;
  430.                         }
  431.                     }
  432.                 }
  433.             }
  434.         }
  435.     }
  436. }
Add Comment
Please, Sign In to add comment