Если честно, я не понимаю что именно можно оптимизировать в моём случае. Для примера я взял процедуру загрузки должностей в таблицу TcxTreeList (компонент DexExpress).
Ниже упрощённый вариант моей процедуры.
Procedure LoadPosts;
Begin
// очищаем таблицу
c := GetTickCount; // измеряем производительность
PostsList.BeginUpdate;
PostsList.Clear;
// считывает элементы из БД
Results := Manager.CreateCriteria<TLiteOrgTree>.AddOrder(TOrder.Asc('ElementOrder')).List;
if Results.Count > 0 then
for i := 0 to Results.Count - 1 do
Begin
Node := PostsList.AddChild(nil); // Добавляем строчку в таблицу
// В зависимости от доступа и типа каждому элементу присваивается одна из иконок в TImageList.
// В ImageList всего загружено 9 иконок размером 16х16.
Node.ImageIndex := Results.Items[i].ElementType;
Node.Texts[0] := Results.Items[i].ElementName; // название должности
End;
Results.Free;
PostsList.EndUpdate;
ShowMessage(FloatToStr(GetTickCount - c) + ' мсек'); // выводим результат, сколько заняло построение таблицы
End.
Обращаю внимание, что процедура LoadPosts не включена в перечень процедур для защиты.
Запаковуем EXE и измеряем производительность:
Чистый EXE без VMProtect - 3,226 сек.
EXE с VMProtect 2.12 без защиты ресурсов - 3,328 мсек
EXE с VMProtect 3.0 без защиты ресурсов - 3,282 мсек
EXE c VMProtect 2.12 и защитой ресурсов - 10,688 мсек
EXE c VMProtect 3.0 и защитой ресурсов - прождал более 5 мин, и закрыл программу
Как видно тормозит именно защита ресурсов, остальные измерения в пределах погрешности.
Выдвигаю предположение, что тормоза из-за работы с иконками. Отвязываю таблицу от TImageList для чистоты эксперемента.
Теперь в таблице никакая графика не используеются. Перекомпилирую EXE и делаю повторные замеры:
Чистый EXE без VMProtect - 3,719 сек.
EXE c VMProtect 2.12 и защитой ресурсов - 12,859 мсек
EXE c VMProtect 3.0 и защитой ресурсов - снова не дождался
Как видим дело не в иконках.
Второе предположние - дело в скинах DevExpress, возможно при построении таблицы идёт запрос к каким-то графическим элементам, которые VMProtect зашифровал.
Отключаю скины (ставлю в настройках NativeStyle = TRUE) и перекомпилирую проект.
Чистый EXE без VMProtect - 3,250 сек.
EXE c VMProtect 3.0 и защитой ресурсов - без изменений
Теперь я в тупике. В таблице всего-то около 500 должностей, что там шифруется и расшифровуется так долго понять не могу. Все необходимые файлы готов сбросить куда скажите.