Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Периодические задержки при выполнении программы, Периодические задержки при выполнении пр 
:(
    Опции темы
constant
Дата 21.12.2015, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



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

Я попытался сделать упрощенную модель программы, чтобы показать, то, что я имею в виду.
В программе итеративный процесс, на каждой итерации  длинный внутренний цикл, имитирующий вычисления.
Далее, на каждом цикле запоминаем время окончания вычисления. После  этого находим продолжительность каждой итерации. Находим среднее время итерации. После чего ищем итерации, продолжительность которых более чем в три раза выше средней и выводим их. 
Если посмотреть на продолжительность итераций, то в большинстве случаев они практически одинаковые (порядка 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();

        }

    }
}

PM MAIL   Вверх
chupachups
Дата 22.12.2015, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



1) Windows + .NET = никогда не позволят тебе загрузить процессор на 100%, в моем случае процессор загрузился только на 25%.
2) Никогда не определяй производительность запуская программу из студии, особенно с включенным параметром "Enable the Visual Studio hosting process".
3) Даже тестовый код оптимизируй по максимуму (5 запусков, ни одного превышения):
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Threading;

namespace PerfomanceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            CPerfomanceTest p = new CPerfomanceTest();

            ThreadStart ts = new ThreadStart(p.Start);
            Thread t = new Thread(ts);
            t.IsBackground = true;
            t.Priority = ThreadPriority.Highest;
            t.Start();
            t.Join();

            p.Results();
            Console.ReadKey();
        }
    }

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

        public CPerfomanceTest()
        {
        }

        public void Start()
        {
            for (int i = 0; i < numIter; i++)
            {
                sw.Restart();
                //Какие-то вычисления
                for (int j = 0; j < numIter; j++)
                {
                    int a = 5 * j;
                }
                //запоминаем время с начала итерации в микросекундах
                double ticks = sw.ElapsedTicks;
                lstTicks.Add(ticks * 0.1);
            }
        }
        public void Results()
        {
            //находим среднее время итерации
            double avg = lstTicks.Average();

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

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

            lstTicks.Where(val => val > 3 * avg)
                .ToList().ForEach(over => Console.WriteLine(String.Format("{0}  ---  {1:n2}", over, over / avg)));

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


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
sgrey
Дата 23.12.2015, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Такое поведение программы вплне ожидаемо. Очень трудно нагрузить процессор полностью вычислениями в одном потоке. А причин задержек может быть множество - может context switch происходит в этот момент, а может неудачно в линию кэша попала часть массива, а может ещё много чего и без самих вычислений нельзя сказать точно что происходит. 
Код только из студии запускался? Так нельзя, нужно его отдельно запускать и измерять производительность.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.