Allocate argvs at once.
Allocate argv
& argvw
& their data in one memory region. (I would also prefer this entire thing to be done on demand rather than at the beginning of each application, though... i.e. turn argv
etc. into properties or functions or so.)
Compiling this program with -gh: Use heaptrace unit
:
begin
end.
and running without parameters gives (numbers might vary depending on the path to the executable):
used in System startup
before after
x64 320 128
i386 176 96
Running this program:
begin
writeln(GetFPCHeapStatus.CurrHeapUsed);
end.
with the following parameters:
-i src.mkv
-i 0.png -i 1.png -i 2.png -i 3.png -i 4.png -i 5.png -i 6.png -i 7.png -i 8.png -i 9.png
-i 10.png -i 11.png -i 12.png -i 13.png -i 14.png -i 15.png -i 16.png -i 17.png -i 18.png -i 19.png
-i 20.png -i 21.png -i 22.png -i 23.png -i 24.png -i 25.png -i 26.png -i 27.png -i 28.png -i 29.png
-i 30.png -i 31.png -i 32.png -i 33.png -i 34.png -i 35.png -i 36.png -i 37.png -i 38.png -i 39.png
-i 40.png -i 41.png -i 42.png -i 43.png -i 44.png -i 45.png -i 46.png -i 47.png -i 48.png -i 49.png
-i 50.png -i 51.png -i 52.png -i 53.png -i 54.png -i 55.png -i 56.png -i 57.png -i 58.png -i 59.png
-i 60.png -i 61.png -i 62.png -i 63.png -i 64.png -i 65.png -i 66.png -i 67.png -i 68.png -i 69.png
-i 70.png -i 71.png -i 72.png -i 73.png -i 74.png -i 75.png -i 76.png -i 77.png -i 78.png -i 79.png
-filter_complex_script:v f.txt -c:v libx264 -crf 0 -preset veryfast -c:a copy r.mkv
gives:
before after
x64 11296 5536
i386 7008 4128
Finally, surrounding setup_arguments
with QueryPerformanceCounter
s and rebuilding FPC with FPCUpDeluxe shows the speedup from 35 to 6 ms over 300 FPC invocations, which means 100 μs per invocation on average.