Давно не работал с FPC, но встала тут задача ускорить работу древнего скрипта, не моего, на VBA, ибо люди жалуются...
Как выяснилось - основная проблема была в жутко медленном обходе больших строк...
Кто не знает, в VBA вообще нет операции, типа Строка(Номер символа). Для этого используются операции создания субстроки и приведения типа субстроки, то есть все это выглядит как Asc(Mid(Строка,Номер символа, 1)).... с соответствующей скоростью работы.. Только один прогон цикла по строке, без любой работы,
For j = 1 To Len(s)
a = Asc(Mid(s, j, 1))
Next j
занимает 1 СЕКУНДУ работы скрипта.. Это явно много.
.. Написал по-быстрому некую тестовую DLL, и к работоспособности её у меня нет вопросов...
library project1;
{$mode objfpc}{$H+}
uses
Classes
{ you can add units after this };
Function BB(Addr: Pointer;Index : longint): Integer; stdcall;
begin
result := integer((Addr+Index shl 1)^);
end;
exports
BB;
begin
end.
В VBA на Win64 она подключается как
Private Declare PtrSafe Function BB Lib "E:\lazarus\forVBA\project1.dll" (ByVal Arr As LongPtr, ByVal Index As Long) As Integer
... и работает всё нормально
А дальше проблемы...
1. производительность. Цикл обхода строки
p = StrPtr(s)
For j = 1 To Len(s)
a = BB(p, j)
Next j
занимает 18 СЕКУНД....... И это компилятор, против интерпретатора VBA
2...Повключал все оптимизации и убрал все что связано с отладкой, но все равно 269824 кб, что реально очень много....
Как нибуть и что-то из этого решаемо????