speed up reading wxFileConfig from wxInputStream by factors of 3.5, 20 and 7 for ANSI/wchar_t/UTF-8 builds respectively (replaces patch 1755969)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47555 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-07-18 23:37:12 +00:00
parent 7a3ba5af83
commit 5ad2b5ce07

View File

@@ -437,8 +437,7 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv)
m_linesTail = NULL; m_linesTail = NULL;
// read the entire stream contents in memory // read the entire stream contents in memory
wxString str; wxWxCharBuffer cbuf;
{
static const size_t chunkLen = 1024; static const size_t chunkLen = 1024;
wxMemoryBuffer buf(chunkLen); wxMemoryBuffer buf(chunkLen);
@@ -459,49 +458,39 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv)
#if wxUSE_UNICODE #if wxUSE_UNICODE
size_t len; size_t len;
str = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len); cbuf = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len);
if ( !len && buf.GetDataLen() ) if ( !len && buf.GetDataLen() )
{ {
wxLogError(_("Failed to read config options.")); wxLogError(_("Failed to read config options."));
} }
#else // !wxUSE_UNICODE #else // !wxUSE_UNICODE
// no need for conversion // no need for conversion
str.assign((char *)buf.GetData(), buf.GetDataLen()); cbuf = wxCharBuffer::CreateNonOwned((char *)buf.GetData());
#endif // wxUSE_UNICODE/!wxUSE_UNICODE #endif // wxUSE_UNICODE/!wxUSE_UNICODE
}
// translate everything to the current (platform-dependent) line // now break it into lines
// termination character
str = wxTextBuffer::Translate(str);
wxMemoryText memText; wxMemoryText memText;
for ( const wxChar *s = cbuf; ; ++s )
// Now we can add the text to the memory text. To do this we extract line
// by line from the translated string, until we've reached the end.
//
// VZ: all this is horribly inefficient, we should do the translation on
// the fly in one pass saving both memory and time (TODO)
const wxChar *pEOL = wxTextBuffer::GetEOL(wxTextBuffer::typeDefault);
const size_t EOLLen = wxStrlen(pEOL);
int posLineStart = str.Find(pEOL);
while ( posLineStart != -1 )
{ {
wxString line(str.Left(posLineStart)); const wxChar *e = s;
while ( *e != '\0' && *e != '\n' && *e != '\r' )
++e;
memText.AddLine(line); // notice that we throw away the original EOL kind here, maybe we
// should preserve it?
memText.AddLine(wxString(s, e));
str = str.Mid(posLineStart + EOLLen); if ( *e == '\0' )
break;
posLineStart = str.Find(pEOL); // skip the second EOL byte if it's a DOS one
if ( *e == '\r' && e[1] == '\n' )
++e;
s = e;
} }
// also add whatever we have left in the translated string.
if ( !str.empty() )
memText.AddLine(str);
// Finally we can parse it all. // Finally we can parse it all.
Parse(memText, true /* local */); Parse(memText, true /* local */);