Хорошо, у меня есть TListBox, который иногда может вызываться для отображения 43 000 строк!
Я знаю, это вряд ли когда-либо имеет какой-либо смысл, но это так.
Теперь вот текущая проблема:
Использование встроенного метода Sort с его функцией обратного вызова Compare занимает почти целую вечность, много минут.
Итак, я извлекаю строки из списка в простой старый динамический массив ShortStrings, выполняю для него QuickSort(), и это занимает около трех секунд. Ура я думаю!
Немного подумав, я вижу, что QuickSort перемещает все эти строки, в которых нет необходимости, поэтому я исправляю код, чтобы просто перемещать указатели или индексы на строки, и вуаля, сортировка снова намного быстрее, занимает меньше секунды, чтобы отсортировать 43 000 элементов. Большая победа, да?
НО, теперь, если я делаю LB.Items.Add() или LB.Items.Assign для перемещения отсортированных строк в список, ЭТО занимает около 30 секунд! Даже если происходит BEgin/EndUpdate. Если я проследю код, я увижу много всего, что происходит с delete() Insert() INsertObject() и сообщениями Windows, летящими без уважительной причины.
Однако мгновение показывает, что у меня есть все строки в LB.TStrings, мне просто нужно их перетасовать вокруг моего массива QuickSorted(). Это должно быть тривиально, просто переместить несколько указателей.
Но я не вижу видимого способа установить необработанные указатели TStringList. Нет, Exchange() действительно очень медленный.
Любые идеи, как я могу добраться до указателей строк TString? Это должно быть тривиально, но я этого не вижу.
Спасибо,
Джордж