Please excuse my clarification but... this is a Pharo issue not a Squeak issue. Squeak is fine and always has been.
Time to display my package-cache directory in Squeak 4.3: < 1 second Time to display my package-cache directory in Pharo 1.4: > 5 minutes and still waiting before I give up and kill -9.. On Wed, May 9, 2012 at 5:33 PM, Schwab,Wilhelm K <[email protected]> wrote: > This is one of those things that I find shocking. Squeak has been around for > 15+ years, and still has no efficient way to get files matching a wildcard > pattern (I sure couldn't find it), FFI does not (easily) support callbacks, > etc. > > > > > ________________________________________ > From: [email protected] > [[email protected]] on behalf of Nicolas Cellier > [[email protected]] > Sent: Wednesday, May 09, 2012 6:18 PM > To: Pharo Development > Subject: [Pharo-project] FileList efficiency could hardly be worse > > The efficiency of FileList>>listForPattern: is something which should > deserve a bit more care. > > It tries to sort the files, for example by name, but wants to display > directory first > ^ [ :x :y | |xIsDir| > ((xIsDir := x isDirectory) = y isDirectory) > ifTrue: [ x basename <= y basename ] > ifFalse: [ > "directories always precede files" > xIsDir ]] > > Alas, this isDirectory test cost you an arm: > > FileReference>>isDirectory > ^ filesystem isDirectory: path > > FileSystem>>isDirectory: aResolvable > "Resolve the argument, and answer true if the result refers > to a directory, false if it refers to a file or doesn't exist." > > ^ store isDirectory: (self resolve: aResolvable) > > FileSystemStore>>isDirectory: aPath > aPath isRoot ifTrue: [ ^ true ]. > self > nodeAt: aPath > ifPresent: [ :entry | ^ self basicIsDirectory: entry ] > ifAbsent: [ ^ false ]. > > DiskStore>>nodeAt: aPath ifPresent: presentBlock ifAbsent: absentBlock > | name| > aPath isRoot ifTrue: [ ^ presentBlock value: self rootNode ]. > "| encodedPath encodedBasename entry | > encodedPath := Primitives encode: (self stringFromPath: aPath parent). > encodedBasename := Primitives encode: aPath basename. > entry := Primitives lookupDirectory: encodedPath filename: > encodedBasename. > ^ entry == #badDirectoryPath > ifTrue: absentBlock > ifFalse: [ > entry at: 1 put: aPath basename. > presentBlock value: entry ]." > name := aPath basename. > self > directoryAt: aPath parent > ifAbsent: absentBlock > nodesDo: > [ :entry | > (self filename: (entry at: 1) matches: name) > ifTrue: [ ^ presentBlock value: entry ] ]. > ^ absentBlock value > > Arghh, it scans the whole parent directory again! > If sort is O(n log n), then we transform it into O(2 n^2 log n). > > Try to browse your package-cache if you're not a chicken. > Seriously, it's unusable... > > Nicolas > >
