Creating many arrays and objects might be slow because they are filled with zeros. (Objects are zeroed by their constructors.)
Instead of ar: array of SomeType, try C-style par: PSomeType allocated with par := GetMem(count * sizeof(SomeType)). Instead of objects, try managed records (or just objects without constructors, destructors, and virtual methods; use ordinary methods instead, i.e. new(obj); obj^.init_method). (Classes are even slower btw: their creation involves the same zeroing, but then does even more stuff.)
If it does not help, the reason might be the memory manager... but first make sure you don’t have heaptrc enabled and run outside of the debugger (I don’t know how, but it sometimes affects my allocation-heavy cases even without heaptrc).