Потоки, net, потеря производительности
От: inevity  
Дата: 11.02.15 07:59
Оценка: :)
Здравствуйте, друзья!

Заранее прощу прощения! Я сам тракторист, но черт меня дернул заняться программированием(еще и на паскале). Опишу ситуацию по мере сил.
Но надеюсь опытные спецы без особого труда подскажут хотя бы где искать проблему.

Проблема:
Сделал программу с потоками, но при увеличении потоков польза от них падает неописуемо:
1 поток = 4% (загрузки сервера с 32 процессорами)
5 потоков — 12%
10 потоков — 15%
20 потоков — 18%
30 потоков — 18%
Предельная производительность всего в ТРИ раза больше(при 5ти потоках — дальше ухудшение), чем при одном потоке.

Исходные данные:
Программа в общем виде (схематично)
const
  ThreadCount=10;
type
  WorkClass = class
    //туча кода
  end;

var
  WorkObjects: List<WorkClass>;
  WorkObject: WorkClass;
  ThreadObjects: List<Thread>;
  ThreadObject: Thread;
  
procedure ThreadWork(WorkObject: WorkClass);
begin
  //код, суть которого WorkObject.DoWork();
end;

begin
  WorkObjects:=new List<WorkClass>;
  ThreadObjects:=new List<Thread>;

  for i:=1 to ThreadCount do
  begin
    WorkObject:=new WorkClass; WorkObjects.Add(WorkObject);
    ThreadObject:=new Thread(ThreadWork); ThreadObjects.Add(ThreadObject);
    ThreadObject.Start(WorkObject);
  end;

  //После завершения потоков обрабатываем/суммируем результаты полученных данных из объектов в списке WorkObjects
end.

Комментарий.
Класс делал так, чтобы никаких общих данных не было, т.е. в поток попадает уникальный экземпляр класса (WorkObject)
Если создаю 30 потоков — программа не увеличивается в памяти в размерах, как будто бы использует общий код(не знаю как классы располагаются в памяти и тд)
Т.е. казалось бы ничто не должно было предвещать беды, а в результата — просто катастрофа.
(есть исходный код, но он на pascal abc (pascalabc.net) — фейспалм)

Вопросы:
Не подскажите, в чем может быть проблема столь жестокой потери производительности, при отсутствии общих данных (все запихал в класс) и индивидуальном экземпляре класса для каждого потока?
Почему нет увеличения размера программы в оперативной памяти соответственно количеству потоков?



13.02.15 16:38: (это не Delphi, а PascalABC.Net) — Кодт
Отредактировано 13.02.2015 13:35 Кодт . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.