Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index



        Large autocorrect databases cause quite some slowness on first
keystroke for people; turns out we had quite a gratuitous N^2 on load
there involving some ICU collation goodness ;-)

        It's still not ideal to have a multi-second freeze, but at least it's
half the length it was ;-)

        Review appreciated,

        Thanks,

                Michael.

On Sat, 2012-04-28 at 06:32 +0000, wrote:
https://bugs.freedesktop.org/show_bug.cgi?id=46805

--- Comment #22 from tommy27 <barta@quipo.it> 2012-04-27 23:32:34 PDT ---
ok, I downloaded the:
master~2012-04-27_21.25.23_LibO-Dev_3.6.0alpha0_Win_x86_install_en-US.msi

and made comparative testings.
...
1 large autocorrect database (acor_.dat)
time to see the white space

LibO    3.5.2 --> 9 seconds
LibOdev 3.6.0 --> 5 seconds

2 large autocorrect databases (acor_.dat ; acor_it-IT.dat)
time to see the white space

LibO    3.5.2 --> 14 seconds
LibOdev 3.6.0 -->  9 seconds

-- 
michael.meeks@suse.com  <><, Pseudo Engineer, itinerant idiot
From b269dced445494891a8e6e8d1d62b931a31dddbd Mon Sep 17 00:00:00 2001
From: Michael Meeks <michael.meeks@suse.com>
Date: Thu, 26 Apr 2012 11:59:02 +0100
Subject: [PATCH] fdo#46805 - special-case appending items to autocorrect
 lists

---
 editeng/source/misc/svxacorr.cxx |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index f459af0..ce5c71c 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -68,6 +68,7 @@
 #include <com/sun/star/ucb/NameClash.hpp>
 #include <xmloff/xmltoken.hxx>
 #include <vcl/help.hxx>
+#include <rtl/logfile.hxx>
 
 #define CHAR_HARDBLANK      ((sal_Unicode)0x00A0)
 
@@ -233,15 +234,27 @@ void SvxAutocorrWordList::DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL )
 }
 
 
+// Keep the list sorted ...
 sal_Bool SvxAutocorrWordList::Seek_Entry( const SvxAutocorrWordPtr aE, sal_uInt16* pP ) const
 {
     register sal_uInt16 nO  = SvxAutocorrWordList_SAR::Count(),
             nM,
             nU = 0;
+
     if( nO > 0 )
     {
         CollatorWrapper& rCmp = ::GetCollatorWrapper();
         nO--;
+
+        // quick check of the end of the list
+        if (rCmp.compareString( aE->GetShort(),
+                                (*((SvxAutocorrWordPtr*)pData + nO))->GetShort() ) > 0)
+        {
+            if( pP ) *pP = nO + 1;
+            return sal_False;
+        }
+
+        // Incredibly crude sort algorithm, should use some partitioning search.
         while( nU <= nO )
         {
             nM = nU + ( nO - nU ) / 2;
@@ -2169,6 +2182,7 @@ SvxAutocorrWordList* SvxAutoCorrectLanguageLists::LoadAutocorrWordList()
         OSL_ENSURE( xXMLParser.is(), "XMLReader::Read: com.sun.star.xml.sax.Parser service 
missing" );
         if( xXMLParser.is() )
         {
+            RTL_LOGFILE_PRODUCT_CONTEXT( aLog, "AutoCorrect Import" );
             uno::Reference< xml::sax::XDocumentHandler > xFilter = new SvXMLAutoCorrectImport( 
xServiceFactory, pAutocorr_List, rAutoCorrect, xStg );
 
             // connect parser and filter
-- 
1.7.9


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.