Сообщение Потоки, net, потеря производительности от 11.02.2015 7:59
Изменено 13.02.2015 13:35 Кодт
Здравствуйте, друзья!
Заранее прощу прощения! Я сам тракторист, но черт меня дернул заняться программированием(еще и на паскале). Опишу ситуацию по мере сил.
Но надеюсь опытные спецы без особого труда подскажут хотя бы где искать проблему.
Проблема:
Сделал программу с потоками, но при увеличении потоков польза от них падает неописуемо:
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) — фейспалм)
Вопросы:
Не подскажите, в чем может быть проблема столь жестокой потери производительности, при отсутствии общих данных (все запихал в класс) и индивидуальном экземпляре класса для каждого потока?
Почему нет увеличения размера программы в оперативной памяти соответственно количеству потоков?
Заранее прощу прощения! Я сам тракторист, но черт меня дернул заняться программированием(еще и на паскале). Опишу ситуацию по мере сил.
Но надеюсь опытные спецы без особого труда подскажут хотя бы где искать проблему.
Проблема:
Сделал программу с потоками, но при увеличении потоков польза от них падает неописуемо:
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) — фейспалм)
Вопросы:
Не подскажите, в чем может быть проблема столь жестокой потери производительности, при отсутствии общих данных (все запихал в класс) и индивидуальном экземпляре класса для каждого потока?
Почему нет увеличения размера программы в оперативной памяти соответственно количеству потоков?
Потоки, net, потеря производительности
Здравствуйте, друзья!
Заранее прощу прощения! Я сам тракторист, но черт меня дернул заняться программированием(еще и на паскале). Опишу ситуацию по мере сил.
Но надеюсь опытные спецы без особого труда подскажут хотя бы где искать проблему.
Проблема:
Сделал программу с потоками, но при увеличении потоков польза от них падает неописуемо:
1 поток = 4% (загрузки сервера с 32 процессорами)
5 потоков — 12%
10 потоков — 15%
20 потоков — 18%
30 потоков — 18%
Предельная производительность всего в ТРИ раза больше(при 5ти потоках — дальше ухудшение), чем при одном потоке.
Исходные данные:
Программа в общем виде (схематично)
Комментарий.
Класс делал так, чтобы никаких общих данных не было, т.е. в поток попадает уникальный экземпляр класса (WorkObject)
Если создаю 30 потоков — программа не увеличивается в памяти в размерах, как будто бы использует общий код(не знаю как классы располагаются в памяти и тд)
Т.е. казалось бы ничто не должно было предвещать беды, а в результата — просто катастрофа.
(есть исходный код, но он на pascal abc (pascalabc.net) — фейспалм)
Вопросы:
Не подскажите, в чем может быть проблема столь жестокой потери производительности, при отсутствии общих данных (все запихал в класс) и индивидуальном экземпляре класса для каждого потока?
Почему нет увеличения размера программы в оперативной памяти соответственно количеству потоков?
Заранее прощу прощения! Я сам тракторист, но черт меня дернул заняться программированием(еще и на паскале). Опишу ситуацию по мере сил.
Но надеюсь опытные спецы без особого труда подскажут хотя бы где искать проблему.
Проблема:
Сделал программу с потоками, но при увеличении потоков польза от них падает неописуемо:
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) — Кодт