Moin Moin!
Du verwendest qx(dir ...), das dürfte den Schub ausmachen, denn >dir< ist nicht einmal eine .exe sondern ein Systeminternes Kommando was im Kernel steckt und somit noch flotter ins Dateisystem greift.
Das ist ja mal großer Quatsch. Unter DOS und Windows ist dir ein Buildin des Kommandointerpreters, sei es command.com oder cmd.exe. Unter Unixen aller Art ist es bestenfalls ein Alias für ls, und das ist ein Programm wie jedes andere. Im Kernel treibt sich das dir-Kommando auf keinen Fall rum.
Was die Performance angeht:
Natürlich ist ein in C geschriebenes Programm oft schneller als ein Perl-Script. Aber: Der Aufruf eines externen Programms ist relativ teuer, insbesondere wenn noch ein Kommandointerpreter im Spiel ist.
File::Find ist als eierlegende Wollmilchsau geschrieben, die find-Funktion hat aktuell elf verschiedene Optionen neben dem "wanted"-Callback, die u.a. filtern, sortieren, vor- und nacharbeiten und die Arbeitsreihenfolge ändern können. Natürlich ist so ein Monster nicht mehr unbedingt schnell.
Eine kleine while-Schleife mit einem todo-Array grast einen Dateibaum definitiv schneller als File::Find ab und spart den Child-Prozess ein.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".