0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
||||||
1 | ||||||
.NET 4.x Массив потоков. Максимально быстрое выполнение01.06.2014, 13:14. Показов 1896. Ответов 7
Метки нет (Все метки)
Добрый день.
Стоит такая задача: Максимально быстро циклически выполнять определенный метод в течение некоторого времени. Сам метод может выполняться 100-300 мс. В идеале необходимо получать результат выполнения каждую миллисекунду. То есть нужно получить некое плотное покрытие из результатов с интервалом не более 1 мс. Реально ли это сделать? Для проверки сделал такое консольное приложение:
То ли код плохой, то ли это закономерные накладные расходы. Вот как от нее избавиться не пойму. Что пробовал: 1) Использовать Task и Parralel.For вместо Thread, раз уж доступен .NET 4.5 - стало только хуже. Видимо оно как-то там само по себе решает как ему оптимальнее выполняться, но задержки только возросли. 2) Помещать цикл в цикл. И пробовал генерить в цикле потоки, которые уже генерят потоки с циклами. 3) Задавать смещение во времени с помощью Thread.Sleep в надежде, что зеленые участки перекроются и я получу хоть какое-то равномерное покрытие. Ничего не помогло. "Дыры" так и остаются, а их длительность почти не уменьшается. Бьюсь уже который день. Помогите, пожалуйста!
0
|
01.06.2014, 13:14 | |
Ответы с готовыми решениями:
7
Максимально быстрое чтение очень большого файла Максимально быстрое определение количество вхождений подстроки в строку Максимально быстрое копирование и инициализация матрицы, краш кода Быстрое выполнение скрипта на локалхосте и долгое на сервере |
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|
01.06.2014, 16:35 | 2 |
попробуй делать паузы на 1мс в методе нового потока. да и если нужно то можно в каждом новом потоке добавлять еще на 1 мс паузы. тогда ответы будут не одновременно от всех потоков а спустя 1мс от каждого потока
0
|
Неадекват
1494 / 1232 / 246
Регистрация: 02.04.2010
Сообщений: 2,793
|
|
01.06.2014, 18:18 | 3 |
1. Чем обусловлено время выполнения функции 250мс - есть ли возможность ускорить?
2. Какие ресурсы выделены на задачу? 3. DateTime.Now - обновляется раз примерно в 16 мс, возможно ошибка в измерении.
0
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
|
01.06.2014, 21:22 [ТС] | 4 |
Функция что-то отправляет на удаленный сервер и возвращает ответ. Время выполнения зависит от сервера и может колебаться. Повлиять никак нельзя.
Можно пожертвовать все имеющиеся ресурсы. То есть пусть всё "висит", но покрытие будет максимальным. А можно ли как-то иначе измерить? или от этого никуда не деться?
0
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
|
01.06.2014, 23:11 [ТС] | 5 |
Почитал msdn, нашел метод Stopwatch.GetTimestamp. Можно ли его использовать для замеров вместо DateTime.Now, если Stopwatch.IsHighResolution возвращает истину?
Всё равно получаю картину с циклической задержкой
0
|
Неадекват
1494 / 1232 / 246
Регистрация: 02.04.2010
Сообщений: 2,793
|
||||||
02.06.2014, 11:03 | 6 | |||||
И чем он вас не устроил? Он возвращает количество тактов, для получения миллисекунд используйте конструкцию:
0
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
||||||
02.06.2014, 18:07 [ТС] | 7 | |||||
freeba, использовал эту конструкцию и условно разделил "пул" из 40 потоков на 8 параллельно выполняющихся частей:
0
|
Неадекват
1494 / 1232 / 246
Регистрация: 02.04.2010
Сообщений: 2,793
|
|
02.06.2014, 20:21 | 8 |
Тут уж придется выбирать - равномерность или многопоточность, менеджером потоков windows вручную управлять нельзя, когда он соизволит запустить поток, тогда и будет.
Но попробуйте выставить приоритет реального времени.
0
|
02.06.2014, 20:21 | |
02.06.2014, 20:21 | |
Помогаю со студенческими работами здесь
8
Как определять, сколько максимально потоков можно запускать? Быстрое сохранение,загрузка и по нажатию клавиш выполнение действий Поочередное выполнение потоков Параллельное выполнение потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |