I just checked: 
- Using the old FileDirectory has the advantage that we keep the low level 
entries directory => O(n^n)
- FIleSystem doesn't do that ;) => O(n^3)

we should really switch to the other, direct access primitive!

On 2012-05-11, at 03:20, Chris Muller wrote:
> 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 <bsch...@anest.ufl.edu> 
> 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: pharo-project-boun...@lists.gforge.inria.fr 
>> [pharo-project-boun...@lists.gforge.inria.fr] on behalf of Nicolas Cellier 
>> [nicolas.cellier.aka.n...@gmail.com]
>> 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
>> 
>> 
> 


Reply via email to