Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 05.08.2013
Сообщений: 90
1

Скорость работы программы с потоками и без

09.01.2018, 11:53. Показов 4560. Ответов 22
Метки нет (Все метки)

Написал небольшую программу с потоками. Решил проверить как будет работать быстрее - с потоками или без.
Если в двух словах: 1 функция, создаю 4 потока, запускаю их и по их завершению считаю время. Затем запускаю ту же самую функцию 4 раза без потоков. Оказывается, что без потоков быстрее (см. скрин)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Program
    {
        static void Main(string[] args) //точка входа в программу 
        { //создаем 4 потока, в качестве параметров передаем имя Выполняемой функции 
           
            Stopwatch sw;
            for (int i = 0; i < 10; i++)
            {
                sw = new Stopwatch();
                sw.Start();
                Thread th_1 = new Thread(WriteString);
                Thread th_2 = new Thread(WriteString);
                Thread th_3 = new Thread(WriteString);
                Thread th_4 = new Thread(WriteString);
           
                // запускаем каждый поток, в качестве параметра передаем номер потока 
                th_1.Start("1"); th_2.Start("2"); th_3.Start("3"); th_4.Start("4");
 
 
                th_1.Join(); th_2.Join(); th_3.Join(); th_4.Join();
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
 
 
            }
            Console.WriteLine();
            for (int i = 0; i < 10; i++)
            {
                sw = new Stopwatch();
                sw.Start();
                WriteString("1");
                WriteString("2");
                WriteString("3");
                WriteString("4");
                sw.Stop();
                Console.WriteLine("!"+sw.Elapsed);
 
 
            }
            Console.ReadKey();
        }
        static void WriteString(object _Data)
        {
            //для получения строки используем преобразование типов: // приводим переменную _Data к типу string и записываем // в переменную str_for_out 
            string str_for_out = (string) _Data; // теперь поток 1 тысячу раз выведит полученную строку (свой номер) 
            for (int i = 0; i <= 10; i++) Console.Write(str_for_out);
        }
Отсюда резонный вопрос - есть ли смысл использовать потоки, если мне нужно будет (не в этой программе, конечно) считать различные вещи (просто счётная математическая программа)
Миниатюры
Скорость работы программы с потоками и без  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2018, 11:53
Ответы с готовыми решениями:

Скорость работы программы
Здравствуйте, не подскажите примерами, как можно посчитать скорость работы части программы,...

Скорость работы программы
Задание: Пусть дан такой массив X X = 1 2 0 4 5 6 7 8 9 -11 12 13 14 18 82 21 0 -5 6 27...

Скорость работы программы с использованием БД
Захотел сделать текстовую игру, и весь текст беру из бд. Беда в том, что если закрывать соединения...

Потоки, увеличить скорость работы программы
как увеличить скорость работы программы входные параметры 8,00000 0,01 5 0 0 0 4 4 0 4 4 5...

22
Эксперт .NET
8222 / 5331 / 1266
Регистрация: 25.05.2015
Сообщений: 16,201
Записей в блоге: 14
09.01.2018, 12:24 2
Лучший ответ Сообщение было отмечено Mastersland как решение

Решение

Цитата Сообщение от Mastersland Посмотреть сообщение
Оказывается, что без потоков быстрее (см. скрин)
А если заменить
C#
1
for (int i = 0; i <= 10; i++) Console.Write(str_for_out);
на
C#
1
for (int i = 0; i <= 10; i++) Thread.Sleep(10);
, то получится наоборот:
00:00:00.1950158
00:00:00.1205340
00:00:00.1287914
00:00:00.1207979
00:00:00.1200453
00:00:00.1208753
00:00:00.1218174
00:00:00.1330626
00:00:00.1207439
00:00:00.1209783

!00:00:00.4720626
!00:00:00.4655619
!00:00:00.4703742
!00:00:00.4695834
!00:00:00.4717350
!00:00:00.4699589
!00:00:00.4664722
!00:00:00.4644008
!00:00:00.4646238
!00:00:00.4700016
Вы пытаетесь ломиться из разных потоков в один поток вывода. Это не очень благоприятно сказывается на быстродействии.

Цитата Сообщение от Mastersland Посмотреть сообщение
Отсюда резонный вопрос - есть ли смысл использовать потоки, если мне нужно будет (не в этой программе, конечно) считать различные вещи (просто счётная математическая программа)
Имеет смысл, если действия выполняются дольше нескольких миллисекунд, выносить их в отдельные потоки, чтобы GUI не подвисал.

Помимо потоков, нелишне будет освоить и таски:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleAppMastersland
{
    class Program
    {
        static void Main(string[] args) //точка входа в программу 
        { //создаем 4 потока, в качестве параметров передаем имя Выполняемой функции 
 
            Stopwatch sw;
            for (int i = 0; i < 10; i++)
            {
                sw = new Stopwatch();
                sw.Start();
                Task t1 = new Task(WriteString, "1");
                Task t2 = new Task(WriteString, "2");
                Task t3 = new Task(WriteString, "3");
                Task t4 = new Task(WriteString, "4");
 
                // запускаем каждый поток, в качестве параметра передаем номер потока 
                t1.Start();
                t2.Start();
                t3.Start();
                t4.Start();
 
 
                Task.WaitAll(t1, t2, t3, t4);
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
            }
 
            Console.WriteLine();
 
            for (int i = 0; i < 10; i++)
            {
                sw = new Stopwatch();
                sw.Start();
                WriteString("1");
                WriteString("2");
                WriteString("3");
                WriteString("4");
                sw.Stop();
                Console.WriteLine("!" + sw.Elapsed);
            }
 
            Console.ReadKey();
        }
        static void WriteString(object _Data)
        {
            //для получения строки используем преобразование типов: // приводим переменную _Data к типу string и записываем // в переменную str_for_out 
            string str_for_out = (string)_Data; // теперь поток 1 тысячу раз выведит полученную строку (свой номер) 
            for (int i = 0; i <= 10; i++) Thread.Sleep(10);// Console.Write(str_for_out);
        }
    }
}
1
3 / 3 / 1
Регистрация: 05.08.2013
Сообщений: 90
09.01.2018, 12:31  [ТС] 3
Спасибо) а чем Task отличается от Thread в глобальном смысле? вижу, что код примерно одинаковый
0
Эксперт .NET
8222 / 5331 / 1266
Регистрация: 25.05.2015
Сообщений: 16,201
Записей в блоге: 14
09.01.2018, 12:45 4
Просто я его написал так, чтобы было примерно похоже.
Task поновее будет, и более высокоуровневый. Thread создаёт отдельный поток всегда, а Task только в случае необходимости.
Также Task используется в async/await, для ещё более простого применения асинхронности.
Если есть возможность, всегда старайтесь использовать Task вместо Thread.
0
Эксперт .NET
9806 / 7178 / 1142
Регистрация: 21.01.2016
Сообщений: 27,286
09.01.2018, 12:46 5
Mastersland, таски - тоже потоки (под капотом - теже самые), но более удобны в использовании, а так же являются частью механизма асинхронного выполнения (async\await).
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 12:00 6
А есть ли разница по скорости работы в использовании Task вместо Thread?

Я создаю количество потоков поддерживаемое процессором и в каждый поток отдельно друг от друга проводит вычисления.
Я создаю пул потоков и ставлю задачу в очередь пула. Как только какой то поток завершит работу, вместо него запустится следующий.

Может можно как то ускорить работу?
0
Эксперт .NET
9806 / 7178 / 1142
Регистрация: 21.01.2016
Сообщений: 27,286
16.01.2018, 12:08 7
Цитата Сообщение от xxxspeed Посмотреть сообщение
А есть ли разница по скорости работы в использовании Task вместо Thread?
Нет. Оба этих класса - только обёртки над одной и той же функциональностью ОС.

Добавлено через 1 минуту
Цитата Сообщение от xxxspeed Посмотреть сообщение
Может можно как то ускорить работу?
Наверное можно. Нужно только понять, что и где у вас тормозит. Из описания выше этого не ясно.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 12:19 8
Вот моя прога, посмотрите пожалуйста)

PCtest.rar
0
Эксперт .NET
9806 / 7178 / 1142
Регистрация: 21.01.2016
Сообщений: 27,286
16.01.2018, 12:21 9
xxxspeed, лучше словами опишите что плохо работает и приведите фрагмент кода.
0
1132 / 936 / 239
Регистрация: 15.06.2012
Сообщений: 3,651
Записей в блоге: 1
16.01.2018, 12:28 10
xxxspeed, что конкретно тебя интересует?
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 12:32 11
Словами тяжело, так то все работает. Думал мож че поменять, чтоб работало быстрее.
Интересует распределение вычислений, может не правильно сделано.

А можно как нибудь распределить вычисления не только по потокам одного компьютера, а но и еще по всем компьютерам сети?
0
Эксперт .NET
8222 / 5331 / 1266
Регистрация: 25.05.2015
Сообщений: 16,201
Записей в блоге: 14
16.01.2018, 16:38 12
Цитата Сообщение от xxxspeed Посмотреть сообщение
А можно как нибудь распределить вычисления не только по потокам одного компьютера, а но и еще по всем компьютерам сети?
Можно. Самое очевидное - запилить программу, которая умеет находить свои копии или вычислительные модули в сети и давать им задание.
Может и готовые библиотеки для этого есть.
0
aquaMakc
16.01.2018, 17:15
  #13

Не по теме:

Цитата Сообщение от Rius Посмотреть сообщение
Можно. Самое очевидное - запилить программу, которая умеет находить свои копии или вычислительные модули в сети и давать им задание.
Может и готовые библиотеки для этого есть.
Я даже знаю, кто сейчас придёт в эту тему и расскажет про WCF.

0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 17:55 14
Цитата Сообщение от Rius Посмотреть сообщение
Можно. Самое очевидное - запилить программу, которая умеет находить свои копии или вычислительные модули в сети и давать им задание.
Может и готовые библиотеки для этого есть.
Решить можешь помочь?
0
Эксперт .NET
9806 / 7178 / 1142
Регистрация: 21.01.2016
Сообщений: 27,286
16.01.2018, 17:56 15
xxxspeed, что решить? Вы проблему-то не озвучили.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 17:58 16
Цитата Сообщение от Usaga Посмотреть сообщение
что решить? Вы проблему-то не озвучили.
Цитата Сообщение от xxxspeed Посмотреть сообщение
А можно как нибудь распределить вычисления не только по потокам одного компьютера, а но и еще по всем компьютерам сети?
Цитата Сообщение от Rius Посмотреть сообщение
запилить программу, которая умеет находить свои копии или вычислительные модули в сети и давать им задание.
Rius, ответил на мой вопрос
0
Эксперт .NET
8222 / 5331 / 1266
Регистрация: 25.05.2015
Сообщений: 16,201
Записей в блоге: 14
16.01.2018, 17:59 17
Я не занимаюсь решением чужих задач.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 304
16.01.2018, 18:17 18
Цитата Сообщение от Rius Посмотреть сообщение
Я не занимаюсь решением чужих задач.
Понятно, мысль понял, буду разбираться как связать несколько программ по сети
0
Эксперт .NET
9806 / 7178 / 1142
Регистрация: 21.01.2016
Сообщений: 27,286
16.01.2018, 18:27 19
xxxspeed, один из вариантов уже озвучили - WCF.
0
insite2012
16.01.2018, 18:37     Скорость работы программы с потоками и без
  #20

Не по теме:

Цитата Сообщение от aquaMakc Посмотреть сообщение
Я даже знаю, кто сейчас придёт в эту тему и расскажет про WCF.
А вот и не расскажу. :p

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2018, 18:37

Как увеличить скорость работы программы?
Всем привет! Программа проходит 6/8 тестов (тесты неизвестны), а на последние 2 превышен лимит...

Что влияет на скорость работы программы
Добрый день! Столкнулась с проблемой: медленно работает программа! Задача: посчитать интеграл в...

Надо увеличить скорость работы программы
std::string separators(&quot;.:,;()-?!'+-/|&quot;); std::map&lt;std::string, int&gt; repeatedWords; size_t...

Что влияет на скорость запуска и работы программы
Здраствуйте ув. програмисты! Есть вопрос (хотя скорее проблема) упала скорость запуска и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru