2017-07-01 12:26:47 UTC
concerning breaking a text into words, counting them all and eliminating
duplicates. I was in for a surprise. Maybe you are too.
First, to eliminate duplicates and count occurrences. Here is the code.
Very simple, very time efficient: only 40 MILLISECONDS to sort 68,626
words, find and copy 8,984 unique words, prepending a count number and then
* MatchedWords.Sort(gb.ascent + gb.language + gb.IgnoreCase) For i = 0 To
MatchedWords.Max n = 1 For j = i + 1 To MatchedWords.Max If
(Comp(MatchedWords[i], MatchedWords[j], gb.language + gb.ignorecase) = 0)
Then n += 1 Else Break Endif Next
UniqWords.Push(Format(n, "0###") & "#" & MatchedWords[i]) i += (n - 1)
Next UniqWords.Sort(gb.descent + gb.language + gb.ignorecase)*
So, sorting, comparing, copying and sorting again was not the issue.
Preparing to display was. So much so that the following function took me
30+ seconds to add those 8984 words to the TextArea to be displayed:
*Public Sub AppendText(Text As String) TextArea1.text &= TextEnd*
But, I was able to reduce that to 32 MILLISECONDS merely by concatenating
the words into a single string before calling AppendText() just once:
*str = "" For i = 0 To UniqWords.Max str &= UniqWords[i] &
"\n" Next FMain.AppendText(str)*
So, concatenating here is two orders of magnitude faster than concatenating
a TextArea. Even thou both were just string concatenation.
In the end, what was taking 30+ do execute came down to 135 MILLISECONDS!
That's a 222 times reduction.
The lesson I have re-learned one more time: measure, don't guess. What
seems the culprit might not be. And a innocent-looking function might be
Thank you guys for your help. I've learned a lot about Gambas as well as
Telegram: +55 (37) 99988-8868
Wickr ID: fernandocabral
WhatsApp: +55 (37) 99988-8868
Telefone fixo: +55 (37) 3521-2183
Telefone celular: +55 (37) 99988-8868
Enquanto houver no mundo uma só pessoa sem casa ou sem alimentos,
nenhum político ou cientista poderá se gabar de nada.