realbasic-nug
[Top] [All Lists]

Re: StyledText.ParagraphCount() is too expensive (styled EditField)

To: REALbasic NUG <realbasic-nug at lists dot realsoftware dot com>
Subject: Re: StyledText.ParagraphCount() is too expensive (styled EditField)
From: "Tomis E." <gostcoder at yahoo dot com>
Date: Sun, 30 Apr 2006 22:08:41 -0700 (PDT)
Delivered-to: realbasic-nug at lists dot realsoftware dot com
Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:Received:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=sCgYRibCojcmMWe1uUiRb3Z4SAjoFrxd1XWrOM17IKCWSiJcyPV3KIsCTFNCZdGFt5Tgbm9ywnSPfHLXOfTNWsja7tZto2U/hcXXv1mRE5dJO478JuLv9020FAa9/OuEdsuMH9ELMHOTnhTwsgkBbHxtK/vydS9PDog7q42tkys= ;
Another potential optimization would be to use a timer instead of firing off on 
every keypress. A
period of 1 second would feel "instant" enough I'd think, and it could reduce 
the CPU usage
significantly.

On each keydown I'd have something like

if tmrWordCount.mode<>1 then
tmrWordCount.mode=1
end

And then tmrWordCount's action event would call the word count procedures. This 
way, you limit the
call to a minimum of getting called every second. 

Note that when you change a timer's mode, it's internal counter starts over, so 
you need that "if
- then" block, otherwise it wouldn't update until the user hadn't been typing 
for 1 second. That
would probably reduce CPU usage even more, though it might make the live word 
count feel sluggish.

Hope that helps,
~ Tomis


--- Marcel <p dot marcel dot list at gmx dot de> wrote:

> Hello everybody!
> 
> Maybe somebody finds this trick useful:
> (... and maybe someone finds a trap, I haven't seen?)
> 
> I make heavy use of styled EditFields in my project. After playing  
> around, I found out that the call of the method...
> 
>    aNumberOfParagraphs = anEditField.StyledText.ParagraphCount()
> 
> ... is very time consuming.  About a second (!) for 30 paragraphs on  
> a 1,25 GHz G4.
> 
> Because I have to test the number of paragraphs after each keystroke,  
> you can imagine that this timeframe isn't acceptable at all.
> When I count the EndOfLines in my text with ...
> 
>    aNumberOfParagraphs = CountFields(anEditField.Text, EndOfLine)
> 
> ... I get (almost) the right value. I just recognized that "empty"  
> lines in the text don't generate a paragraph in a styled EditField.  
> So I removed them before counting ...
> 
>    aNumberOfParagraphs = CountFields(ReplaceAll(aField.Text,  
> (EndOfLine + EndOfLine), EndOfLine), EndOfLine)
> 
> This was almost working, I just saw that multiple empty lines in a  
> row were not eliminated right. Using a grep sequence finally solved  
> it...
> 
>    aRegEx.SearchPattern = "^[\f\n\r]+"
>    aRegEx.ReplacementPattern = ""
>    aTextToCount = aField.Text
>    do
>      aRegExMatch=aRegEx.Search(aTextToCount)
>      if (aRegExMatch <> Nil) then
>        aTextToCount = aRegEx.Replace(aTextToCount)
>      end
>    loop until (aRegExMatch = Nil)
>    aParaLastIndex = CountFields(aTextToCount, EndOfLine)
> 
> In my tests the above CountFields() call always returns the same  
> values as the ParagraphCount() call. It needs always a processing  
> time of about 1 tick (1/60 of a second), with up to 70 paragraphs and  
> 16,000 chars tested.
> 
> Maybe you want to replace the ParagraphCount() calls in your code and  
> try it. I would be very interested in feedback. Can I trust this  
> "work-around"? Does someone has any objections arising, I do not see?
> 
> Thanks and best wishes,
> Marcel
> 
> _______________________________________________
> Unsubscribe or switch delivery mode:
> <http://www.realsoftware.com/support/listmanager/>
> 
> Search the archives of this list here:
> <http://support.realsoftware.com/listarchives/lists.html>
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>


<Prev in Thread] Current Thread [Next in Thread>