I did for both cases a loop from gen1 to rev22. The no persist version took: 4.155s The persist version: 4.651s Pretty amazing, I would have though it's the other way around. Both very fast. On smaller ranges the difference is hardly measurable.
Manfred Am 26.02.2010 um 18:18 schrieb Troy A. Griffitts: > Right, mod++ does call key++. The core difference in the persist case is that > the key persists inside the mod such that mod++ is calling > yourPersistedKey++. It's like symlinking the mod key to your key. But in the > non-persist case there are 2 keys. Your key and the module's internal key. > Calling setKey in a non persistent way merely syncs those 2 keys up. It like > saying setKey("Gen.1.1"). This merely positions the modules internal key to > Gen.1.1. > > As far as speed, the technical details of all this might be trickier than you > imagine. A module's own internal key is always the fastest it can work with. > Sometimes, if all is perfect (same internal ListKey element type with same > v11n), you are correct that the persist method might be slightly faster; > otherwise, the same type of translation will need to occur as when you call > setKey("Gen.1.1"). > > Thanks for getting back with me so soon. If you find speed differences > contrary to my synopsis above, please let me know. We haven't had an > optimization pass for a few revs and you may find some corners we can cut. > > Troy > > > > Manfred Bergmann <manfred.bergm...@me.com> wrote: > >> Hello Troy. >> >> That helped, yes. >> >> So for the example without a persistent key the iteration is still in the >> key but the key has to be set to the module each time before the call to >> RenderText(). >> I thought the use case is the same for both persist and no persist because >> mod++ actually internally calls key.increment() if I'm not mistaken and also >> sets error so that key.Error() is reflected by mod.Error(). >> But the two don't seem to be the same. >> >> I would say that the second approach is the more expensive one because the >> key is copied each time with all it's properties? >> >> >> Regards, >> Manfred >> >> Am 26.02.2010 um 17:13 schrieb Troy A. Griffitts: >> >>> Dear Manfred, What I think you are getting at, is, given: >>> >>> ListKey verses = VerseKey().ParseVerseList("Gen 1:1;4:5-8"); >>> >>> What is the difference between: >>> >>> ---------------------- >>> verses.Persist(true); >>> mod.setKey(verses); >>> for (mod == TOP; !mod.Error(); mod++) { >>> cout << mod.RenderText(); >>> } >>> ====================== >>> for (verses = TOP; !verses.Error(); verses++) { >>> mod.setKey(verses); >>> cout << mod.RenderText(); >>> } >>> ++++++++++++++++++++++ >>> >>> and I think you'll find not too much. I believe the reason you were seeing >>> undesired results and a slower speed was because in your second example, >>> you were initializing mod to Gen.1.1 and incrementing until you reached >>> Gen.4.8, Your first example should iterate 5 verses. Your second example >>> should iterate over a thousand verses. I believe the two examples I've >>> listed above compare apples to apples when it comes to persistent vs. >>> non-persistent keys, and both should only iterated the 5 verses in your >>> parse string. >>> >>> Hope this helps. >>> >>> Troy >>> >>> >>> >>> >>> >>> Manfred Bergmann wrote: >>>> Hi. >>>> Again a SWORD API question. >>>> I'm trying to optimise memory usage and speed issues. >>>> At the moment I believe the API or better SWModule SWKey usage in MacSword >>>> is not as good as it could be. >>>> Now while improving that I came across one or two questions. >>>> First the following code (all code is in Objective-C syntax but is almost >>>> an equivalent to the C++ API): >>>> --------------- >>>> - (void)testLoopWithModulePosWithDiverseReference { >>>> SwordListKey *lk = [SwordListKey listKeyWithRef:@"gen 1:1;4:5-8" >>>> v11n:[mod versification]]; >>>> [lk setPersist:YES]; >>>> [mod setKey:lk]; >>>> NSString *ref = nil; >>>> NSString *rendered = nil; >>>> while(![mod error]) { >>>> ref = [lk keyText]; >>>> rendered = [mod renderedText]; >>>> NSLog(@"%@:%@", ref, rendered); >>>> [mod incKeyPosition]; >>>> } >>>> } >>>> --------------- >>>> This code works and is pretty fast. >>>> The output are only verses as in the reference. That's how it should be. >>>> The module only keeps a reference to the key. >>>> This example: >>>> --------------- >>>> - (void)testLoopWithModulePosNoPersistWithDiverseReference { >>>> SwordListKey *lk = [SwordListKey listKeyWithRef:@"gen 1:1;4:5-8" >>>> v11n:[mod versification]]; >>>> [lk setPosition:BOTTOM]; >>>> SwordVerseKey *bot = [SwordVerseKey verseKeyWithRef:[lk keyText] >>>> v11n:[mod versification]]; >>>> [lk setPosition:TOP]; >>>> [lk setPersist:NO]; >>>> [mod setKey:lk]; >>>> NSString *ref = nil; >>>> NSString *rendered = nil; >>>> while(![mod error] && ([(SwordVerseKey *)[mod getKey] index] <= [bot >>>> index])) { >>>> ref = [[mod getKey] keyText]; >>>> rendered = [mod renderedText]; >>>> NSLog(@"%@:%@", ref, rendered); >>>> [mod incKeyPosition]; >>>> } >>>> } >>>> --------------- >>>> This version however renders all verses from gen 1:1 to gen 4:8. >>>> The only difference is that the module keeps it's own copy of the key. >>>> The boundary check "![mod error]" doesn't work here so I added the index >>>> check mainly because I didn't know otherwise. >>>> How does this loop work with a none persistent key? >>>> Thanks, >>>> Manfred >>>> _______________________________________________ >>>> sword-devel mailing list: sword-devel@crosswire.org >>>> http://www.crosswire.org/mailman/listinfo/sword-devel >>>> Instructions to unsubscribe/change your settings at above >>> >>> >>> _______________________________________________ >>> sword-devel mailing list: sword-devel@crosswire.org >>> http://www.crosswire.org/mailman/listinfo/sword-devel >>> Instructions to unsubscribe/change your settings at above page >> >> >> _______________________________________________ >> sword-devel mailing list: sword-devel@crosswire.org >> http://www.crosswire.org/mailman/listinfo/sword-devel >> Instructions to unsubscribe/change your settings at above page > _______________________________________________ > sword-devel mailing list: sword-devel@crosswire.org > http://www.crosswire.org/mailman/listinfo/sword-devel > Instructions to unsubscribe/change your settings at above page _______________________________________________ sword-devel mailing list: sword-devel@crosswire.org http://www.crosswire.org/mailman/listinfo/sword-devel Instructions to unsubscribe/change your settings at above page