Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
1

Время многопоточного выполнения функции

07.07.2016, 22:26. Показов 1632. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Этот код исполняется за 0.4 сек на моём компьюетере
C#
1
2
3
4
     private void Foo()
      {
            for (int i = 0; i < 100000000; i++) { }
      }
Я вызываю 10 раз foo в потоке и надеюсь, они выполнятся за время соизмеримым со временем выполнения Foo
breakpoint1
C#
1
2
3
4
5
6
7
8
9
10
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
            new Thread(() => { Foo(); }).Start();
breakpoint2
Однако время выполнения строк между breakpoint1 и breakpoint2 = около 2 сек. это для меня долго, нужно около 0.5 сек.
Мои предположения: что кроме этих потоков планировщик обрабатывает и другие. Поправьте если я неправ и помогите добиться нужной скорости.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2016, 22:26
Ответы с готовыми решениями:

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

Прерывание выполнения функции в момент выполнения события
Добрый день, возникла проблема. Есть функция в процессе ее выполнения происходит некое событие,...

Время выполнения функций
нужно посмотреть на чем алгоритмы выполняются эффективнее, использую stopwatch и показывает все...

Время выполнения программы
Подскажите пожалуйста как на C# определить за какое время выполнилась программа... функция какая...

32
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,341
Записей в блоге: 1
08.07.2016, 15:28 21
Author24 — интернет-сервис помощи студентам
olegall, я тебе предлагаю сделать парсер в виде отдельного консольного приложения. С веб-приложением оно никак не будет связано. Парсер будет запускаться по расписанию с помощью Task Scheduler, качать страницы, парсить их, заносить в БД и т.д. Веб-приложению останется только отображать её.
0
19 / 21 / 12
Регистрация: 24.06.2016
Сообщений: 71
08.07.2016, 15:41 22
DataPlanner вообщем то прав... Тут надо учитывать ещё и такие факторы как тип поставленной задачи, количество работы к выполнению, ОС, и даже железо на котором всё это крутится. А так, для примера: хоть сколько нормальный веб-сервер работать в 1 потоке ну просто не может...

Для использования всех ядер процессора для обработки количество потоков как минимум должно равнятся количеству ядер.
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,341
Записей в блоге: 1
08.07.2016, 15:46 23
Цитата Сообщение от olegall Посмотреть сообщение
парсер уже сделан, использовал CsQuery. Я столкнулся с тормозами (времена ответов от сервера) при парсинге с большого количества источников.
Молодец. Значит теперь пора заняться оптимизацией парсера.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
08.07.2016, 15:48 24
Цитата Сообщение от jahtemg Посмотреть сообщение
Для использования всех ядер процессора для обработки количество потоков как минимум должно равнятся количеству ядер
Насколько помню, вам об этом уже неоднократно говорили.
Если вам так хочется попробовать распараллелить вашу работу, то для начала попробуйте использовать TPL. Для чего-то же она существует. Заодно и потренируетесь, лишним не будет.
Ниже элементарный пример.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Net;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            string[] urls = { "http://yandex.ru", "http://google.com", "http://mail.ru", "http://rambler.ru" };
            Stopwatch sw = new Stopwatch();
            sw.Start();
            var result = urls.AsParallel()
                .WithDegreeOfParallelism(Environment.ProcessorCount)
                .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                .Select(url => Parse(url));
            sw.Stop();
            Console.WriteLine(sw.Elapsed.ToString());
            foreach (string res in result) {
                Console.WriteLine(res);
            }
            Console.ReadLine();
        }
        static string Parse(string url) {
            using (WebClient client = new WebClient()) {
                return client.DownloadString(url);
            }
        }
    }
}
0
Эксперт .NET
10559 / 6485 / 1504
Регистрация: 25.05.2015
Сообщений: 19,651
Записей в блоге: 14
08.07.2016, 15:58 25
jahtemg, вообще-то есть некие такие параметры как вычислительная мощность процессоров, вычислительная нагрузка, процессорное время.
По мере приближения суммарной нагрузки к 100% (полной) эффективность и время реакции падает. Количество потоков/задач тут особо не важно, пока планировщик имеет ресурсы на их обработку.
А вот когда говорят о соответствии количества потоков числу ядер, имеют в виду потоки со 100% нагрузкой своего ядра. Хороший пример тому - кодирование видео. Слабенькие или спящие потоки из диспетчера задач - это фигня.

Добавлено через 5 минут
И вот поэтому же приведённое выше явное указание числа процессоров - часто излишне.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 116
08.07.2016, 16:02  [ТС] 26
Мне так и не понятно - мой автономный парсер будет работать на моём домашнем компе 24х7?
0
Эксперт .NET
10559 / 6485 / 1504
Регистрация: 25.05.2015
Сообщений: 19,651
Записей в блоге: 14
08.07.2016, 16:03 27
olegall, планировщик используется на сервере, 24/7.
0
19 / 21 / 12
Регистрация: 24.06.2016
Сообщений: 71
08.07.2016, 16:04 28
Ну так я и говорю, что надо учитывать железо .
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
08.07.2016, 16:06 29
jahtemg, тебе уже 2 человека сказали - гоняй парсер отдельным приложением в фоне сохраняя куда-нибудь результат, а когда пользователь заходит на сайт тупо передавай ему последние полученные значения.
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,341
Записей в блоге: 1
08.07.2016, 16:07 30
Цитата Сообщение от olegall Посмотреть сообщение
Мне так и не понятно - мой автономный парсер будет работать на моём домашнем компе 24х7?
Это тебе решать. Есть необходимость и возможность так делать - значит делай.
0
19 / 21 / 12
Регистрация: 24.06.2016
Сообщений: 71
08.07.2016, 16:13 31
Причём здесь вообще я ? Я не ТС...
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
08.07.2016, 16:14 32
jahtemg, ))) извиняюсь, промахнулся
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
09.07.2016, 03:24 33
Коллеги, поток это всего лишь стек в памяти, которому назначен вектор прерывания. Таблица векторов прерываний реализует многозадачность процессора, хотя на самом деле все выполняется на одном процессоре.

В зависимости от контекста работы программы дополнительное прерывание может улучшить или ухудшить общую производительность процессора, поэтому сводить производительность потока к операциям вычислений или ввода/вывода не совсем корректно, поток должен решать атомарную задачу.
0
09.07.2016, 03:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2016, 03:24
Помогаю со студенческими работами здесь

Время выполнения блока
Здравствуйте, Уважаемы программисты!!! Кто может мне подсказать простую вещь: как вычислить,...

Время выполнения циклов.
Есть массив: int count = 300000000; var arr = new int; И четыре цикла: for (int i = 0; i &lt;...

Остановка выполнения в указанное время
Доброго времени суток. Господа, как заставить приложение прекратить выполнение через 10 секунд...

Измерить время выполнения програмы
Нашел класс Stopwatch на msdn, не совсем понимаю как его использовать. Вот пример оттуда же: ...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru