[sword-devel] SwordReader PocketPC and SmartPhone CAB files.

DM Smith dmsmith555 at yahoo.com
Mon Jul 7 11:27:44 MST 2008


On Jul 7, 2008, at 1:41 PM, David Trotz wrote:

> Troy,
>>
>> You of all people should know this... :)  SWORD stores all the tags
>> inline in the text.  When you start turning things OFF is when all  
>> the
>> filters have to do work to remove things.  If everything is left on,
>> then the text is just handed back as it was stored.  I'm still not
>> convinced. :)
>>
> I should have known it, but I was honestly confused, but it does make
> more sense the way you describe it. My guess is I need a better way to
> grow my text buffer. It must be what is slowing me down so much.  
> 'Cause
> if I push in a single very long string I can render very fast, but  
> when
> I push in a verse at a time, I render very slowly. I will do some more
> testing.

I've run into this before. Here are some things I have tried. Maybe  
one of them will work well in your situation:
1) Over-allocate for growth.
When allocating exactly for growth (e.g. 1 verse at a time) the  
algorithm is O(n^^2)

Using a doubling algorithm (everytime you run out of space, allocate  
to the next 2^^n boundary, or allocate 2x what you need. This will be  
O(nlogn), IIRC.

I've tried a doubling algorithm, whose impact is that it can grossly  
over allocate.

It would be better to use an algorithm that starts out by aggressive  
over-allocation, but eases up with time. If you know nothing about  
your input, then the following might be useful. I'll be replacing  
Lucene's doubling algorithm with the following taken from Python:
	/* This over-allocates proportional to the list size, making room
	 * for additional growth.  The over-allocation is mild, but is
	 * enough to give linear-time amortized behavior over a long
	 * sequence of appends() in the presence of a poorly-performing
	 * system realloc().
	 * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
	 */
	new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;

I think you can do better when you know something about the input. For  
example, you can know the average size of a verse and the maximum  
length of a chapter. Together you can use these to create a custom  
series for growth. It is also possible to cheaply get the size of each  
chapter in the module. This could be useful in creating a heuristic  
estimate.

2) Consumer-producer. I don't know if it is possible to have threads  
or co-processes. But you might be able to arrange for a producer to  
provide the next desired verse and a consumer to render the HTML.

3) Use "pages" for large output. Currently, the user can only see a  
bit at a time and has to do something to see the next bit. So in a way  
the user is used to paging.

We do this in Bible Desktop when the output is more than 50 verses.  
(The user can configure this limit and we are changing it to 200  
because common desktop hardware is getting better.) Visually we use  
bottom tabs, but our users find it confusing and we are looking for  
something more obvious.

In Him,
	DM







More information about the sword-devel mailing list