Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2015, 09:42   #1
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию Периодические задержки при выполнении программы

Выполняю задачу, требуется произвести вычисления, настолько быстро, насколько это позволяют ресурсы системы, пусть даже в ущерб всем остальным процессам.
При анализе производительности обратил внимание на следующую особенность. Как правило участки кода выполняются за более-менее одинаковое время, однако, периодически происходят непонятные мне задержки, достаточно длительные.

Я попытался сделать упрощенную модель программы, чтобы показать, то, что я имею в виду.
В программе итеративный процесс, на каждой итерации длинный внутренний цикл, имитирующий вычисления.
Далее, на каждом цикле запоминаем время окончания вычисления. После этого находим продолжительность каждой итерации. Находим среднее время итерации. После чего ищем итерации, продолжительность которых более чем в три раза выше средней и выводим их.
Если посмотреть на продолжительность итераций, то в большинстве случаев они практически одинаковые (порядка 70 мкс в моем случае).Но есть итерации,которые более чем в 8 раз больше среднего.

Следует отметить также, что процессор во время выполнения программы загружается где-то процентов на 13%. Т.е. свободных ресурсов процессора - "выше крыши", процессор используется неэффективно, и программа может быть выполнена гораздо быстрее.Пробовал увеличивать приоритет процесса и потока до максимальных - эффекта практически нет.

Вопросы:

1. Из-за чего происходят большие периодические задержки в выполнении программы, и как от них избавится ?
2. Почему процессорное время используется неэффективно, как задействовать все ресурсы процессора для выполнения программы ?

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;
using System.Threading;
using System.Runtime;
using System.Runtime.CompilerServices;


namespace PerfomanceTest
{
    class Program
    {
        static void Main(string[] args)
        {


            CPerfomanceTest p = new CPerfomanceTest();
            Console.ReadKey();
        }
    }

    public class CPerfomanceTest
    {
        public CPerfomanceTest()
        {
         
           
            List<double> lstTicks = new List<double>();
            List<double> lstTicksDelta = new List<double>();
            
            const int numIter = 100000;
            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 0; i < numIter; i++)
            {                             
                //Какие-то вычисления
                for (int j = 0; j < 100000; j++) ;

                //запоминаем врмя с начала итерации в микросекундах
                lstTicks.Add(sw.ElapsedTicks * 0.1);                               
            }

            sw.Stop();

            double sum =0;
            double av = 0;

                                       
            for (int i = 1; i < numIter; i++)
            {
                //определяем продолжительность каждой итерации 
                double delta = lstTicks[i] - lstTicks[i - 1];
                lstTicksDelta.Add(delta);                             
            }

            for (int i = 1; i < numIter-1; i++)            
                sum += lstTicksDelta[i];

            
            //находим среднее время итерации
            av = sum / (numIter - 2);

            Console.WriteLine("Average time: "+av);

            Console.WriteLine("");
            Console.WriteLine("Large deviation from average:");

            for (int i = 0; i < numIter-1; i++)            
                //находим отклонение от среднего  времени выполнения итерации в три раза
                if (lstTicksDelta[i] > 3 * av)                
                    Console.WriteLine(i +" -- "+   lstTicksDelta[i]);

                            
            Console.WriteLine("Press any key");
            Console.ReadKey();

        }

    }
}
constant_ural вне форума Ответить с цитированием
Старый 21.12.2015, 10:44   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
требуется произвести вычисления, настолько быстро, насколько это позволяют ресурсы системы
Такое на С/С++ обычно пишут. Больше возможностей для оптимизаций, нет GC и прочего оверхеда.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.12.2015, 12:46   #3
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию

Цитата:
Такое на С/С++ обычно пишут. Больше возможностей для оптимизаций, нет GC и прочего оверхеда.
Ладно переформулируем, на "максимально возможно на дотнет"
constant_ural вне форума Ответить с цитированием
Старый 21.12.2015, 13:07   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

1. Из-за чего происходят большие периодические задержки в выполнении программы, и как от них избавится ?
---
Да никак, это сборщик мусора включается в работу. Хотя можно попробовать аллоцировать меньше объектов, тогда работы для GC будет куда меньше.

2. Почему процессорное время используется неэффективно, как задействовать все ресурсы процессора для выполнения программы ?
---
Выполнять в несколько потоков, тогда больше ядер будет задействовано.


Мелкие советы:
1) При создании списка ЗАРАНЕЕ укажите его размер, он вам известен. Это предотвратит многократное копирование данных внутреннего масива в листе и создание новых массивов (см. внутреннее устройство List<T>)
Код:
            List<double> lstTicks = new List<double>(numIter);
            List<double> lstTicksDelta = new List<double>(numIter);
P.S. а еще лучше - сразу создайте "double[] blablabla = new double[numIter]" без лишних оберток

2) "sw.ElapsedTicks * 0.1" - глупое умножение, пустая трата времени. Оно ничего не дает, а выполняется на каждой итерации

3) Все тесты должны выполняться в собранной в режиме Release программе со всеми включенными оптимизациями, и ни в коем случае не в режиме отладки в VS.

4) Самое важное: посмотрите хорошую лекцию о том, как ПРАВИЛЬНО выполнять оценку производительности приложений. https://www.youtube.com/watch?v=RL21wPsiy3o и почитайте про методы оптимизации http://habrahabr.ru/post/165729/
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 21.12.2015 в 13:10.
Luuzuk вне форума Ответить с цитированием
Старый 21.12.2015, 13:14   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Вот неплохая статья как мне показалось. Статья.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.12.2015, 13:38   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Вот неплохая статья как мне показалось. Статья.
Угу. Ссылку на неё же я постом выше и оставлял
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 21.12.2015, 14:14   #7
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Угу. Ссылку на неё же я постом выше и оставлял
Да, спасибо. Эту статью я тоже читал ранее. Вот, в частности в этой статье написано, что слишком много потоков это может быть тоже вредно из-за временных затрат на переключения контекста. Кто-нибудь сталкивался с такой проблемой ?
constant_ural вне форума Ответить с цитированием
Старый 21.12.2015, 14:28   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Ладно переформулируем, на "максимально возможно на дотнет"
Так а написать критичный кусок на С++ (может быть с помощью C++/CLI) и подключать к основной дотнет программе не вариант?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.12.2015, 20:47   #9
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию

Цитата:
Так а написать критичный кусок на С++ (может быть с помощью C++/CLI) и подключать к основной дотнет программе не вариант?
Почему не вариант, один из дальнейших возможных вариантов. Просто хочется "с наименьшей кровью" все сделать. Плюс ко всему,как я понял, еще потери производительности от перехода в нейтив и назад могут быть. Еще проблема в том что на плюсах опыт-то есть, но интегрировать все это в дотнет пока не приходилось, если не сложно, скажите в какую сторону копать и что читать.
constant_ural вне форума Ответить с цитированием
Старый 22.12.2015, 00:35   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от constant_ural Посмотреть сообщение
Да, спасибо. Эту статью я тоже читал ранее. Вот, в частности в этой статье написано, что слишком много потоков это может быть тоже вредно из-за временных затрат на переключения контекста. Кто-нибудь сталкивался с такой проблемой ?
если ядро одно, а потоков 50, да это вредно.
при курсе 1 к 1 обычно все норм.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выполнении программы crymchanin Общие вопросы C/C++ 8 30.01.2013 15:37
ошибка при выполнении программы ST@LKER Общие вопросы C/C++ 8 03.12.2011 22:38
Ошибка при выполнении программы Гурам Общие вопросы Delphi 1 18.11.2010 18:53
При выполнении программы ошибка. Cyber Помощь студентам 12 02.10.2010 17:16
Ошибки при выполнении программы grustniy Общие вопросы Delphi 2 04.09.2010 07:19