21/03/2014 12:54, Vincent van Ravesteijn:
Probably the Language class started out as a light-weight object. Now,
however, we store the complete layout translation in it, and thus every
Paragraph has a copy of this translation map, which indeed is quite
over-the-top.
On the other hand, I don't like using pointers instead. It feels fragile
to compare pointers. Why not just a "std::string language" as the key ?
Here is an updated patch doing that. When running under valgrind/massif,
I get the following when loading the user guide:
before: 36.27MB
after : 31.50MB
That's a 13% reduction, not bad!
JMarc
>From f3278ee3038a78cf8ce8720833cc65a5ffe6eade Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date: Fri, 21 Mar 2014 12:24:47 +0100
Subject: [PATCH] Do not store Languages objects in completion words lists
In the current code each paragraph contains a map<Language,
WordList*>, which means that it contains a full copy of the language
object. Since these objects contain translation tables nowadays, this
is a very bad idea.
This patch simply replaces the Language key by a string.
When loading the Userguide on linux/x86_64, the total memory
consumption decreases from 36.27MB to 31.50MB.
---
src/LyX.cpp | 1 +
src/Paragraph.cpp | 4 ++--
src/Text.cpp | 2 +-
src/WordList.cpp | 14 ++++++--------
src/WordList.h | 4 +---
5 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/src/LyX.cpp b/src/LyX.cpp
index 41c69f7..b784831 100644
--- a/src/LyX.cpp
+++ b/src/LyX.cpp
@@ -33,6 +33,7 @@
#include "FuncStatus.h"
#include "HunspellChecker.h"
#include "KeyMap.h"
+#include "Language.h"
#include "LaTeXFonts.h"
#include "LayoutFile.h"
#include "Lexer.h"
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index d32c0be..fe1c6b8 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -499,7 +499,7 @@ public:
TextContainer text_;
typedef set<docstring> Words;
- typedef map<Language, Words> LangWordsMap;
+ typedef map<string, Words> LangWordsMap;
///
LangWordsMap words_;
///
@@ -3866,7 +3866,7 @@ void Paragraph::collectWords()
if (cit == d->fontlist_.end())
return;
Language const * lang = cit->font().language();
- d->words_[*lang].insert(word);
+ d->words_[lang->lang()].insert(word);
}
}
}
diff --git a/src/Text.cpp b/src/Text.cpp
index c4cac88..cdcc200 100644
--- a/src/Text.cpp
+++ b/src/Text.cpp
@@ -2120,7 +2120,7 @@ bool Text::completionSupported(Cursor const & cur) const
CompletionList const * Text::createCompletionList(Cursor const & cur) const
{
- WordList const * list = theWordList(*cur.getFont().language());
+ WordList const * list = theWordList(cur.getFont().language()->lang());
return new TextCompletionList(cur, list);
}
diff --git a/src/WordList.cpp b/src/WordList.cpp
index 762e1b9..3a095af 100644
--- a/src/WordList.cpp
+++ b/src/WordList.cpp
@@ -12,14 +12,11 @@
#include "WordList.h"
-#include "Language.h"
-
#include "support/convert.h"
#include "support/debug.h"
#include "support/docstring.h"
-#include "support/weighted_btree.h"
-
#include "support/lassert.h"
+#include "support/weighted_btree.h"
#include <map>
@@ -28,12 +25,13 @@ using namespace std;
namespace lyx {
///
-map<Language, WordList *> theGlobalWordList;
+typedef map<string, WordList *> GlobalWordList;
+GlobalWordList theGlobalWordList;
-WordList * theWordList(Language const & lang)
+WordList * theWordList(string const & lang)
{
- map<Language, WordList *>::iterator it = theGlobalWordList.find(lang);
+ GlobalWordList::iterator it = theGlobalWordList.find(lang);
if (it != theGlobalWordList.end())
return it->second;
else
@@ -44,7 +42,7 @@ WordList * theWordList(Language const & lang)
void WordList::cleanupWordLists()
{
- map<Language, WordList *>::const_iterator it = theGlobalWordList.begin();
+ GlobalWordList::const_iterator it = theGlobalWordList.begin();
for (; it != theGlobalWordList.end(); ++it)
delete it->second;
theGlobalWordList.clear();
diff --git a/src/WordList.h b/src/WordList.h
index b7f88fb..f57f20b 100644
--- a/src/WordList.h
+++ b/src/WordList.h
@@ -14,8 +14,6 @@
#include "support/docstring.h"
-#include "Language.h"
-
namespace lyx {
class WordList {
@@ -41,7 +39,7 @@ private:
Impl * d;
};
-WordList * theWordList(Language const & lang);
+WordList * theWordList(std::string const & lang);
} // namespace lyx
--
1.7.9.5