Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему потоки работают неравномерно: разница в производительности в многопоточном приложении на Delphi-7

Delphi , Компоненты и Классы , Потоки

Почему потоки работают неравномерно: разница в производительности в многопоточном приложении на Delphi-7

Вопрос о неравномерной работе потоков в многопоточном приложении является актуальным для разработчиков, использующих технологии многозадачности. Рассмотрим ситуацию, когда в приложении на Delphi-7 создается 100 потоков, каждый из которых выполняет простую операцию инкрементирования 64-битного счетчика. Ожидается, что после 10-15 секунд работы все потоки будут иметь примерно одинаковое количество инкрементов, однако наблюдается значительная разница в производительности.

Контекст проблемы:

Исходный код приложения использует класс TThread для создания потоков. Каждый поток в цикле увеличивает значение своего локального счетчика. Приложение компилируется с оптимизациями и запускается вне среды IDE. Используется 32-битная версия Delphi-7, а также 64-битная Windows 7 Professional с включенным гипертрейдингом на 4-ядерном процессоре Intel i7.

Наблюдения и результаты:

После выполнения программы, некоторые потоки выполняют всего около 230 миллионов инкрементов, в то время как другие — более 2 миллиардов. Это противоречит ожиданиям, что в операционной системе с преemptive multitasking каждый поток получит свой временной слот в режиме round-robin.

Альтернативный ответ:

Пользователь делится своим опытом и результатами экспериментов. Он отмечает, что удаление вызова inherited в методе Execute не влияет на поведение программы. Также упоминается, что отключение приоритетного буста потоков не приводит к изменению распределения времени выполнения. Пользователь проводит дополнительные эксперименты с 32-битным и 64-битным исполнимым файлом, а также с использованием функции Sleep(0) для принудительной отдачи процессорного времени, что приводит к еще более неравномерным результатам.

Подтвержденный ответ:

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

Обсуждение:

Система планирования задач в Windows не использует строгий round-robin, а основывается на приоритетах потоков. Существуют различные факторы, влияющие на распределение времени выполнения потоков, включая случайные события, работу других процессов и особенности архитектуры процессора.

Выводы:

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

program MultithreadedApp;

{$APPTYPE CONSOLE}

uses
  Classes,
  SysUtils;

type
  TMyThread = class(TThread)
  private
    FCount: Int64;
  public
    constructor Create;
    procedure Execute; override;
    property Count: Int64 read FCount;
  end;

{ TMyThread }

constructor TMyThread.Create;
begin
  inherited Create(True);
  FCount := 0;
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
    Inc(FCount);
end;

var
  Threads: TArray<TMyThread>;
  I: Integer;
begin
  SetLength(Threads, 100);
  for I := Low(Threads) to High(Threads) do
    Threads[I] := TMyThread.Create(False);
  for I := Low(Threads) to High(Threads) do
    Threads[I].Resume;
  // Здесь должен быть код для ожидания завершения потоков
  // и вывод результатов
end.

Приведенный выше код демонстрирует базовый пример многопоточного приложения на Delphi, где создается 100 потоков, каждый из которых выполняет простую операцию. Важно понимать, что реальное поведение приложения может отличаться от ожидаемого из-за множества факторов, включая планирование операционной системы и архитектуру процессора.

Создано по материалам из источника по ссылке.

Контекст проблемы заключается в изучении причин неравномерной работы потоков в многопоточном приложении на Delphi-7, где наблюдается значительная разница в производительности между потоками при выполнении одинаковых операций.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:20:32/0.0037059783935547/0