Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
LirG
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 80
1

Почему многопоточность не ускоряет выполнение кода

12.11.2012, 16:10. Просмотров 719. Ответов 9
Метки нет (Все метки)

В массиве string[10] содержится строки длиной в сотни знаков, каждая строка обрабатывается отдельным потоком, каждый поток запускает новый экземпляр класса для обработки, но значительного прироста скорости обработки не наблюдается. В чем может быть причина?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 16:10
Ответы с готовыми решениями:

Файлы, сеть, многопоточность: оптимизация кода
Оговорюсь сразу, использую .NET 4.0. Это в случае будущих рекомендаций в пользу...

Выполнение кода
На одном из сайтов прочитал, что в .NET программах невозможно выполнение кода в...

Последовательное выполнение кода
Как можно реализовать последовательность выполнения кода Пока 1 часть не...

Выполнение кода в потоке
Почему код в потоке выполняется по разному? Напишу псевдокод - так будет...

Выполнение кода без перекомпиляции
У каждого проекта, написанного на с#, а также запущенного , есть .sln,...

9
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
12.11.2012, 16:14 2
эм... в том что у тебя не 10-ядерный проц?
0
LirG
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 80
12.11.2012, 16:20  [ТС] 3
4-ядерный. Проблема в том, что один поток обработает весь массив почти с такой же скоростью как 10 потоков. Загрузка процессора при этом 40 - 50 %. Один поток 5%.
0
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
12.11.2012, 16:22 4
значит итоговые действия занимают настолько мало времени, что процессор практически столько-же времени обрабатывает прервывания и переключение на другой поток.

сколько времени обрабатывается одна строка?
0
LirG
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 80
12.11.2012, 16:28  [ТС] 5
30 секунд
0
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
12.11.2012, 16:39 6
ну тут два варианта: либо немного кривоватый поток, либо винде разрешено сразу использовать 4 ядра процессора для вычисления операций в одном процессе (ну, как-то так). Хотя конечно лучше дождаться мнений гуру, они как-то умудряются знать всё)
1
nike00
56 / 56 / 14
Регистрация: 06.04.2012
Сообщений: 185
12.11.2012, 17:36 7
Насколько я помню, не рекомендуется запускать больше потоков чем 2*количество ядер, в вашем случается получается 8 потоков, а вообще да, иногда накладней стартовать новый поток чем обработать все по-очереди, если используете .NET 4.0+ почитайте о применении Parallel.For и Parallel.ForEach
1
kolorotur
Эксперт .NET
10710 / 8870 / 2220
Регистрация: 17.09.2011
Сообщений: 15,257
Завершенные тесты: 1
12.11.2012, 17:52 8
Покажите код, где у вас происходит создание потоков и код метода, который выполняется в этих потоках.
Очень часто бывает, что человек малость перемудрил с синхронизацией и в итоге все 10 потоков выполняются последовательно, а не параллельно.
0
LirG
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 80
12.11.2012, 19:23  [ТС] 9
Цитата Сообщение от kolorotur Посмотреть сообщение
Покажите код, где у вас происходит создание потоков и код метода, который выполняется в этих потоках.
Очень часто бывает, что человек малость перемудрил с синхронизацией и в итоге все 10 потоков выполняются последовательно, а не параллельно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Thread th_0; Thread th_1; Thread th_2; Thread th_3; Thread th_4; Thread th_5;
private void Zapusk_potokov()
        {
            th_0 = new Thread(PTK_0); th_0.Start();
            th_1 = new Thread(PTK_1); th_1.Start();
            th_2 = new Thread(PTK_2); th_2.Start();
            th_3 = new Thread(PTK_3); th_3.Start();
            th_4 = new Thread(PTK_4); th_4.Start();
            th_5 = new Thread(PTK_5); th_5.Start();
        }
 
CLP P_0; CLP P_1; CLP P_2; CLP P_3; CLP P_4; CLP P_5;
void PTK_0() { P_0 = new CLP(); P_0.Preobrazovat_v_chisla(SMRF[0], 0); SM_Chislovoj_kod[0] = P_0.SM_Chislovoj_kod[0]; }
        void PTK_1() { P_1 = new CLP(); P_1.Pr_v_chisla(SMRF[1], 1); SM_Chislovoj_kod[1] = P_1.SM_Chislovoj_kod[1]; }
        void PTK_2() { P_2 = new CLP(); P_2.Pr_v_chisla(SMRF[2], 2); SM_Chislovoj_kod[2] = P_2.SM_Chislovoj_kod[2]; }
        void PTK_3() { P_3 = new CLP(); P_3.Pr_v_chisla(SMRF[3], 3); SM_Chislovoj_kod[3] = P_3.SM_Chislovoj_kod[3]; }
        void PTK_4() { P_4 = new CLP(); P_4.Pr_v_chisla(SMRF[4], 4); SM_Chislovoj_kod[4] = P_4.SM_Chislovoj_kod[4]; }
        void PTK_5() { P_5 = new CLP(); P_5.Pr_v_chisla(SMRF[5], 5); SM_Chislovoj_kod[5] = P_5.SM_Chislovoj_kod[5]; }
 
private class CLP
{
     //Обработка своей части массива string 
}
0
cyberwalk
2 / 2 / 0
Регистрация: 13.06.2012
Сообщений: 20
13.11.2012, 15:41 10
Цитата Сообщение от nike00 Посмотреть сообщение
Насколько я помню, не рекомендуется запускать больше потоков чем 2*количество ядер, в вашем случается получается 8 потоков, а вообще да, иногда накладней стартовать новый поток чем обработать все по-очереди, если используете .NET 4.0+ почитайте о применении Parallel.For и Parallel.ForEach
Да, действительно, непонятно, зачем 10 потоков, если всего 4 ядра?
3 потока максимум будет эффективно работать.
1
13.11.2012, 15:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 15:41

На сколько хештаблица ускоряет поиск элемента?
Словарь в Collections.Generic использует хеш значения. Как посчитать на сколько...

Как реализовать динамическое выполнение кода
Добрый день! Пишу программу, которая ищет ошибке в базе данных. Программа...

Как посмотреть выполнение кода в отладочном режиме
Существует программа, которая визуально показывает (указателями или как-то еще)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru