Цель состоит в том, чтобы обеспечить полное использование доступных ядер при конвертации поплавков в строки в одном приложении Delphi. Я думаю, что эта проблема относится к общей обработке строки. Тем не менее, в моем примере я специально использую метод FloatToStr.
То, что я делаю (я сохранил это очень просто, поэтому вокруг реализации не так много двусмысленности):
- Использование Delphi XE6
- Создайте объекты потоков, которые наследуются от TThread, и запустите их.
- В процедуре выполнения потока он преобразует большое количество дублируется в строки методом FloatToStr.
- Чтобы упростить, эти двойники - это одна и та же константа, поэтому нет общий или глобальный ресурс памяти, необходимый для потоков.
Несмотря на то, что используются несколько ядер, использование CPU% всегда будет превышать количество одного ядра. Я понимаю, что это проблема. Поэтому у меня есть некоторые конкретные вопросы.
Простым способом выполнения одной операции может быть множество экземпляров приложения и, следовательно, более полное использование доступного процессора. Возможно ли сделать это эффективно в пределах одного исполняемого файла? То есть назначить потокам разные идентификаторы процессов на уровне ОС или какое-то эквивалентное подразделение, распознанное ОС? Или это просто невозможно сделать из коробки Delphi?
По области: Я знаю, что есть разные диспетчеры памяти, и другие группы пытались изменить некоторые из более низких уровней использования asm lock http://synopse.info/forum/viewtopic.php?id=57 Но я задаю этот вопрос в том смысле, что не делаю ничего на таком низком уровне.
Спасибо
Привет. Мой код преднамеренно очень прост:
TTaskThread = class(TThread)
public
procedure Execute; override;
end;
procedure TTaskThread.Execute;
var
i: integer;
begin
Self.FreeOnTerminate := True;
for i := 0 to 1000000000 do
FloatToStr(i*1.31234);
end;
procedure TfrmMain.Button1Click(Sender: TObject);
var
t1, t2, t3: TTaskThread;
begin
t1 := TTaskThread.Create(True);
t2 := TTaskThread.Create(True);
t3 := TTaskThread.Create(True);
t1.Start;
t2.Start;
t3.Start;
end;
Это "тестовый код", где CPU (через монитор производительности) выходит на 25% (у меня 4 ядра). Если линия FloatToStr заменяется на нестрочную операцию, например. Power (i, 2), то монитор производительности показывает ожидаемое 75% -ное использование. (Да, есть более эффективные способы измерения этого, но я думаю, что этого достаточно для объема этого вопроса)
Я достаточно подробно изучил этот вопрос. Цель вопроса заключалась в том, чтобы сформулировать суть проблемы в очень простой форме.
Я спрашиваю об ограничениях при использовании метода FloatToStr. И спрашивает, есть ли воплощение внедрения, которое позволит лучше использовать доступные ядра.
Спасибо.