There is a method in SourceFileArray 
#localProcessReadStreamAtFileIndex:atPosition:ifPresent:ifAbsent: which uses a 
ProccessLocalVariable called ProccessAndSessionLocalSourcesFileArray (see 
#localProcessReadOnlyCopy). Changing the last line in 
#readStreamAt:ifPresent:ifAbsent: to use this local process one makes the time 
to run this snippet:

[ 1 systemNavigation browseMethodsWithSourceString: 'Morph' matchCase: false ] 
timeProfile

From ~ 10 seconds to ~ 3 seconds (Windows).

However I cannot see that the file handles created by this processLocalVariable 
to ever be closed, so I suspect those are leaked? In that case there might be 
the need to implement some “clean up” mechanism for ProccessLocalVariables 
before they are changed/nilled when a process changes.

Another approach could be to not use a ProccessLocalVariabe at all, but extend 
the SourceFilesArray class to also hold one read only handle for each of its 
files, and use these in readStreamAtFileIndex:::… . I guess that it is also 
necessary then to have semaphore protecting the two last lines such that 
setting the position in the stream and reading from it cannot be changed by 
other threads.

readStreamAtFileIndex: index atPosition: position ifPresent: presentBlock 
ifAbsent: absentBlock

               | stream  result|
               stream := self readOnlyFileAt: index.
               stream ifNil: [ ^ absentBlock value ].        "sources file not 
available"

               position > stream size ifTrue: [ ^ absentBlock value ].

               readSema critical: [
                              stream position: position.
                              result := presentBlock value: stream
               ].

               ^ result


Best regards,
Henrik


From: Pharo-dev [mailto:[email protected]] On Behalf Of Nicolai 
Hess
Sent: Thursday, May 19, 2016 9:31 AM
To: Pharo Development List <[email protected]>
Subject: Re: [Pharo-dev] From a mooc user: method source with it' take so long 
in Pharo 5

Squeak caches the opened readonly file(handle). It does not have to reopen the 
file on every call for reading (readonly).

2016-05-18 19:12 GMT+02:00 stepharo <[email protected]<mailto:[email protected]>>:
I am wondering why does the search 'method source with it' take so long in 
Pharo 5? On my PC, When I select the text 'menu' and search for all 'method 
source with it', in Squeak 5 it takes 3 seconds. In Pharo 5 it takes 21 seconds.


Reply via email to