Вызывать все медленнее - PullRequest
0 голосов
/ 13 июня 2018

Я исследовал проблемы с производительностью в моем приложении, и оно сводится к тому, что время, необходимое для вызова Invoke, постепенно увеличивалось.Я использую System.Diagnostics.Stopwatch для определения времени самого вызова Invoke, и, хотя он начинается через 20 мс, после нескольких сотен вызовов он составляет около 4000 мс.Ведение журнала показывает, что время постоянно увеличивается (сначала на ~ 2 мс на вызов, затем на ~ 100 мс и более).У меня три вызова, все демонстрируют одинаковое поведение.

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

Проблема не возникала, пока я не попытался загрузить исследование, содержащее более 800 изображений.Ранее мои тестовые наборы были ~ 100 изображений, общим размером от 400 МБ до 16 ГБ.Набор задач имеет размер всего 2 ГБ и занимает около 10 минут, чтобы приблизиться к 50%, а набор 16 ГБ загружается всего за ~ 30 с, что исключает общий размер изображения в качестве проблемы.Для справки: моя машина для разработки имеет 32 ГБ оперативной памяти.Я заверил, что это не содержание вызванного метода, закомментировав все это.

Что я хочу понять, так это как возможно, чтобы время, затрачиваемое на вызов, постепенно увеличивалось?Это на самом деле вещь?Мои стеки вызовов не становятся глубже, Количество потоков одинаково, какой ресурс используется, чтобы вызвать это?Чего мне не хватает!?

public void UpdateThumbnailInfo(Thumbnail thumb, ThumbnailInfo info)
{
    if (InvokeRequired)
        {
            var sw = new Stopwatch();
            sw.Start();
            Invoke((Action<Thumbnail, ThumbnailInfo>) UpdateThumbnailInfo, thumb, info);
            Log.Debug("Update Thumbnail Info Timer: {Time} ms - {File}", (int) sw.ElapsedMilliseconds, info.Filename);
        }
        else
        {
            // Do stuff here
        }
    }

1 Ответ

0 голосов
/ 13 июня 2018

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

Несколько вещей, которые вы можете сделать: * Используйте BeginInvoke вместоInvoke.Поскольку ваша функция имеет тип void, вам не понадобятся EndInvoke * Использование SuspendLayout и ResumeLayout для предотвращения постепенного обновления пользовательского интерфейса, а достаточно всего обновить все один раз, когда все изображения загружены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...