Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Diagnostics;
- using System.Threading;
- namespace MatrixLab
- {
- class Matrix // класс матрицы
- {
- public static int size = 3000;
- public double[,] m = new double[size, size];
- public Matrix() // конструктор заполняющий матрицу случайными числами
- {
- Random random = new Random();
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- m[i, j] = random.Next(1000) / 100.0;
- }
- }
- class Program
- {
- static void SinM(Matrix matrix1, Matrix matrix2, int thNum, int thCount) // сложная функция от суммы двух матриц
- {
- double[,] matrixSin = new double[Matrix.size, Matrix.size];
- for (int i = Matrix.size / thCount * (thNum - 1); i < Matrix.size / thCount * thNum; i++)
- for (int j = 0; j < Matrix.size; j++)
- {
- //Console.WriteLine(i + ": " + j);
- matrix1.m[i, j] += matrix2.m[i, j];
- matrixSin[i, j] = Math.Sin(matrix1.m[i, j]);
- }
- }
- static void Main(string[] args)
- {
- Matrix matrix1 = new Matrix(); // объявление и заполнение матриц
- Matrix matrix2 = new Matrix();
- Stopwatch sWatch = new Stopwatch(); // объект класса, позволяющего измерять затраченное время
- sWatch.Start();
- SinM(matrix1, matrix2, 1, 1);
- sWatch.Stop();
- Console.WriteLine("Однопоточный метод: " + sWatch.ElapsedMilliseconds);
- int thrCount = 8;
- Thread[] threads = new Thread[thrCount];
- for (int n = 2; n <= thrCount; n++)
- {
- matrix1 = new Matrix();
- for(int k = 1; k < n; k++)
- {
- threads[k - 1] = new Thread(delegate ()
- {
- SinM(matrix1, matrix2, k, n);
- });
- }
- sWatch.Restart();
- for (int h = 1; h < n; h++)
- {
- threads[h - 1].Start();
- }
- for (int h = 1; h < n; h++)
- {
- threads[h - 1].Join();
- }
- sWatch.Stop();
- Console.WriteLine("Параллельный метод, время при " + n + " потоках: " + sWatch.ElapsedMilliseconds);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement