powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Action и производительность
4 сообщений из 4, страница 1 из 1
Action и производительность
    #39889300
voodoos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложении добавил функционал подсчета затраченного времени на выполнение некоторый операций. Операции простые — сложение, вычитание, умножение, деление. Написал класс Watcher, в котором есть метод Run, который принимает Action и в этот методе ведет подсчет времени выполнения операции, как-то вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void Run(Action action)
{
	DateTime start = DateTime.Now;

	action();

	_operations++;
	_interval += (DateTime.Now - start);
}



Обнаружил, что выполнение этих операций в методе Run выполняется дольше в несколько раз. Предположил, что это возможно операции с датами так тормозят в строчке:

Код: c#
1.
_interval += (DateTime.Now - start);



Тормозят, но не на столько. При выполнении 344771728 операций результаты следующие:

1. Выполнение операций без подсчета: 00:40;
2. Выполнение в методе Run, но без подсчета интервала выполнения: 2:15;
3. Выполнение в методе Run с подсчетом интервала: 3:31;

Получается что сжирает больше всего процессорного времени именно делегат.

Разве это нормально?
...
Рейтинг: 0 / 0
Action и производительность
    #39889415
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voodoos
Разве это нормально?

Да, делегат всегда вызывается медленней. И еще для такого подсчета лучше использовать класс StopWatch.
...
Рейтинг: 0 / 0
Action и производительность
    #39889475
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

StopWatch можно обернуть в IDisposable, но не всегда удобно

делегат это высокоуровневый объект, который имеет состояние, хранится в куче, ссылку на метод, и своё поведение по вызову одного, а может и нескольких указателей, конечно он будет работать медленнее.
344771728 это 137,908,691 вызовов в секунду. вполне достаточно.
попробуйте такое количество тасков запустить еще больше огорчитесь
...
Рейтинг: 0 / 0
Action и производительность
    #39890154
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мы делаем так

Код: 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.
        public async Task Consume(ConsumeContext<IOrderRequest> context)
        {
            var sw = new Stopwatch();
            sw.Start();
            var req = context.Message;

            GetOrderResponse data = null;

            try
            {

                data = await _gate.GetOrder(new GetOrderRequest());

                await context.RespondAsync<IOrderResponse>(new { Data = data.Data, TotalCount = data.TotalCountRecords, Error = data.Error });

                var msg = $"From :: ${JsonConvert.SerializeObject(context.Host)}, Id :: {context.MessageId}, Message :: {JsonConvert.SerializeObject(req)}, Response :: {data.Data}, ElapsedMiliseconds :: {sw.ElapsedMilliseconds}";
                _logger.LogInformation(msg);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Request: {JsonConvert.SerializeObject(req)}");
            }

            sw.Stop();
        }
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Action и производительность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]