Производительность нельзя оценивать статически. Для этого вам нужно получить AQTime или какой-либо другой профилировщик производительности для Delphi. Я использую AQtime, и мне это нравится, но я знаю, что это считается дорогим.
Ваш код не будет волшебным образом быстрее, потому что вы переместили его в фоновый поток. Во всяком случае, ваше общее время до тех пор, пока вы не увидите результаты в вашем пользовательском интерфейсе, может стать немного медленнее, если вам придется отправлять много данных из фонового потока в поток переднего плана через некоторые механизмы синхронизации.
Если, однако, вы могли бы выполнять части вашего алгоритма параллельно, то есть разделить свою работу так, чтобы у вас было 2 или более рабочих потоков, обрабатывающих ваши данные, и у вас был четырехъядерный процессор, то ваше общее время выполнения фиксированной нагрузка на работу, может уменьшиться. Это не означает, что код будет работать быстрее, но в зависимости от множества факторов, вы можете получить небольшую выгоду от многопоточности, вплоть до количества ядер на вашем компьютере. Это никогда не приведет к увеличению производительности в 2 раза, если использовать два потока вместо одного, но вы можете повысить производительность на 20-40% в параллельных решениях с несколькими потоками, в зависимости от масштабируемости кучи. под многопоточными нагрузками, и как IO / память / кеш ограничены вашей рабочей нагрузкой.
Что касается повышения приоритетов потоков, то в общем случае все, что вы будете здесь делать, - это нарушить тонкий баланс производительности вашей системы Windows. Повышая приоритеты, вы достигнете (иногда) номинального, но неповторимого и не гарантируемого увеличения производительности. В зависимости от того, что вы делаете в своем коде и от источников данных, игра с приоритетами потоков может привести к появлению незначительных проблем. См. Обеденные философы Проблема для более.
Ваш лучший выбор для оптимизации скорости строковых операций - сначала проверить его и выяснить, где именно он использует большую часть своего времени. Это куча операций? Операции копирования и перемещения в память? Без профилировщика, даже с советами других людей, вы все равно будете совершать кардинальный грех программирования; преждевременная оптимизация. Будьте ориентированы на результаты. Быть научно обоснованным. Мера. Понимаю. Тогда решите.
Сказав это, я видел много ужасного кода в свое время, и есть одна ужасная вещь, которую делают люди, которая полностью убивает производительность их многопоточных приложений; Использование TThread.Synchronize слишком много.
Вот патологический (экстремальный) случай, который, к сожалению, довольно часто встречается в дикой природе:
procedure TMyThread.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;
Проблема здесь заключается в том, что 100% работы действительно выполняется на переднем плане, кроме проверки «если завершено», которая выполняется в контексте потока. Чтобы сделать приведенный выше код еще хуже, добавьте непрерывный сон.
Для быстрого фонового кода потока, используйте Synchronize экономно или не используйте его вообще, и убедитесь, что код, который он вызывает, прост и выполняется быстро, или, что еще лучше, используйте TThread.Queue или PostMessage, если вы действительно можете жить с работой основного потока очереди .