Odd; it's /much/ faster here whether the files are indexed or not,  
probably because it no longer uses waitUntilDone:YES.

Can you try moving the delegate send in the BDSKSearch inside the test  
for time?  That should make it cheaper.  What does sampling show?

On Jan 20, 2008, at 10:49 AM, Christiaan Hofman wrote:

> I get a serious beach ball after these changes.
>
> Christiaan
>
> On 20 Jan 2008, at 7:22 PM, [EMAIL PROTECTED] wrote:
>
>> Revision: 12597
>>          http://bibdesk.svn.sourceforge.net/bibdesk/?
>> rev=12597&view=rev
>> Author:   amaxwell
>> Date:     2008-01-20 10:22:13 -0800 (Sun, 20 Jan 2008)
>>
>> Log Message:
>> -----------
>> Throttle search/flush in the BDSKSearch so we can just send
>> delegate messages in the index.  This gives good progress bar
>> updates without killing indexing.
>>
>> Modified Paths:
>> --------------
>>    trunk/bibdesk/BDSKFileSearch.h
>>    trunk/bibdesk/BDSKFileSearch.m
>>    trunk/bibdesk/BDSKFileSearchIndex.m
>>
>> Modified: trunk/bibdesk/BDSKFileSearch.h
>> ===================================================================
>> --- trunk/bibdesk/BDSKFileSearch.h   2008-01-20 16:20:14 UTC (rev  
>> 12596)
>> +++ trunk/bibdesk/BDSKFileSearch.h   2008-01-20 18:22:13 UTC (rev  
>> 12597)
>> @@ -66,6 +66,7 @@
>>
>>     BDSKSearchPrivateIvars *data;
>>     id delegate;
>> +    CFAbsoluteTime lastUpdateTime;
>> }
>>
>> /*
>>
>> Modified: trunk/bibdesk/BDSKFileSearch.m
>> ===================================================================
>> --- trunk/bibdesk/BDSKFileSearch.m   2008-01-20 16:20:14 UTC (rev  
>> 12596)
>> +++ trunk/bibdesk/BDSKFileSearch.m   2008-01-20 18:22:13 UTC (rev  
>> 12597)
>> @@ -87,6 +87,7 @@
>>
>>         data = [[BDSKSearchPrivateIvars alloc] init];
>>         [self setDelegate:aDelegate];
>> +        lastUpdateTime = CFAbsoluteTimeGetCurrent();
>>     }
>>     return self;
>> }
>> @@ -125,7 +126,8 @@
>>
>>         // if there's a search in progress, we'll cancel it and re-
>> update
>>         // if not, we'll notify the delegate with an empty array,
>> since the index is still working
>> -        if (NULL != search) {
>> +        // throttle the cancel/flush to 10 Hz, since that slows
>> down indexing
>> +        if (NULL != search && (CFAbsoluteTimeGetCurrent() -
>> lastUpdateTime) > 0.1) {
>>             [self cancel];
>>             [self updateSearchResults];
>>         }
>> @@ -170,11 +172,13 @@
>>     SKIndexRef skIndex = [searchIndex index];
>>     NSAssert(NULL != skIndex, @"-[BDSKFileSearchIndex index]
>> returned NULL");
>>
>> -    if (SKIndexFlush(skIndex) ==  FALSE) {
>> +    if (NULL == skIndex || SKIndexFlush(skIndex) ==  FALSE) {
>>         NSLog(@"failed to flush index %@", searchIndex);
>>         return;
>>     }
>>
>> +    lastUpdateTime = CFAbsoluteTimeGetCurrent();
>> +
>>     SKSearchRef skSearch = SKSearchCreate(skIndex, (CFStringRef)
>> searchString, options);
>>     [self setSearch:skSearch];
>>     CFRelease(skSearch);
>>
>> Modified: trunk/bibdesk/BDSKFileSearchIndex.m
>> ===================================================================
>> --- trunk/bibdesk/BDSKFileSearchIndex.m      2008-01-20 16:20:14 UTC
>> (rev 12596)
>> +++ trunk/bibdesk/BDSKFileSearchIndex.m      2008-01-20 18:22:13 UTC
>> (rev 12597)
>> @@ -293,10 +293,6 @@
>>         id anItem = nil;
>>         BDSKMultiValueDictionary *indexedIdentifierURLs =
>> [[[BDSKMultiValueDictionary alloc] init] autorelease];
>>
>> -        // see comment later; may need tuning here since this is
>> much faster than adding new docs to the index
>> -        const int32_t flushInterval = 100;
>> -        int32_t countSinceLastFlush = 10;
>> -
>>         // update the identifierURLs with the items, find items to
>> add and URLs to remove
>>         OSMemoryBarrier();
>>         while(flags.shouldKeepRunning == 1 && (anItem = [itemEnum
>> nextObject])) {
>> @@ -326,16 +322,13 @@
>>                 @synchronized(self) {
>>                     progressValue = (numberIndexed /
>> totalObjectCount) * 100;
>>                 }
>> -                if (countSinceLastFlush-- == 0) {
>> -                    // must update before sending the delegate
>> message
>> -                    pthread_rwlock_wrlock(&rwlock);
>> -                    [identifierURLs
>> addEntriesFromDictionary:indexedIdentifierURLs];
>> -                    pthread_rwlock_unlock(&rwlock);
>> -                    [indexedIdentifierURLs removeAllObjects];
>> -
>> -                    [[OFMessageQueue mainQueue]
>> queueSelectorOnce:@selector(searchIndexDidUpdate) forObject:self
>> withObject:nil];
>> -                    countSinceLastFlush = flushInterval;
>> -                }
>> +                // must update before sending the delegate message
>> +                pthread_rwlock_wrlock(&rwlock);
>> +                [identifierURLs
>> addEntriesFromDictionary:indexedIdentifierURLs];
>> +                pthread_rwlock_unlock(&rwlock);
>> +                [indexedIdentifierURLs removeAllObjects];
>> +
>> +                [self performSelectorOnMainThread:@selector
>> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
>>             }
>>
>>             OSMemoryBarrier();
>> @@ -422,11 +415,7 @@
>>
>>     NSEnumerator *enumerator = [items objectEnumerator];
>>     id anObject = nil;
>> -
>> -    // This threshold is sort of arbitrary; for small batches,
>> frequent updates are better if the delegate has a progress
>> indicator, but for large batches (initial indexing), it can kill
>> performance to be continually flushing and searching while indexing.
>> -    const int32_t flushInterval = [items count] > 20 ? 5 : 1;
>> -    int32_t countSinceLastFlush = flushInterval;
>> -
>> +
>>     // Use a local pool since initial indexing can use a fair
>> amount of memory, and it's not released until the thread's run loop
>> starts
>>     NSAutoreleasePool *pool = [NSAutoreleasePool new];
>>
>> @@ -440,13 +429,10 @@
>>             progressValue = (numberIndexed / totalObjectCount) * 100;
>>         }
>>
>> -        if (countSinceLastFlush-- == 0) {
>> -            [pool release];
>> -            pool = [NSAutoreleasePool new];
>> -
>> -            [self performSelectorOnMainThread:@selector
>> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
>> -            countSinceLastFlush = flushInterval;
>> -        }
>> +        [pool release];
>> +        pool = [NSAutoreleasePool new];
>> +
>> +        [self performSelectorOnMainThread:@selector
>> (searchIndexDidUpdate) withObject:nil waitUntilDone:NO];
>>         OSMemoryBarrier();
>>     }
>>
>>
>>
>> This was sent by the SourceForge.net collaborative development
>> platform, the world's largest Open Source development site.
>>
>> ----------------------------------------------------------------------
>> ---
>> This SF.net email is sponsored by: Microsoft
>> Defy all challenges. Microsoft(R) Visual Studio 2008.
>> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
>> _______________________________________________
>> Bibdesk-commit mailing list
>> [EMAIL PROTECTED]
>> https://lists.sourceforge.net/lists/listinfo/bibdesk-commit
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Bibdesk-develop mailing list
> Bibdesk-develop@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/bibdesk-develop


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Bibdesk-develop mailing list
Bibdesk-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-develop

Reply via email to