From a769b347542060e7d7e010c343d4a7d5c1549de0 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 14:05:26 +0300 Subject: QLocale: optimize string usage Use QStringBuilder more. Avoid quadratic behavior when prepending zeros in a loop, prepend whole string intead. Use const API more for CoW types. Change-Id: If114107dc3d9876b9a7c77bc0071878cb6e00892 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/tools/qlocale.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'src/corelib/tools/qlocale.cpp') diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index 7809c513d6..847fc2d55e 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -1072,20 +1072,14 @@ QLocale::Country QLocale::country() const QString QLocale::name() const { Language l = language(); - - QString result = d->languageCode(); - if (l == C) - return result; + return d->languageCode(); Country c = country(); if (c == AnyCountry) - return result; - - result.append(QLatin1Char('_')); - result.append(d->countryCode()); + return d->languageCode(); - return result; + return d->languageCode() + QLatin1Char('_') + d->countryCode(); } static qlonglong toIntegral_helper(const QLocaleData *d, const QChar *data, int len, bool *ok, @@ -2985,12 +2979,14 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group, } } - for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i) - num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0')); + const QChar resultZero = base == 10 ? zero : QChar(QLatin1Char('0')); + const int zeroPadding = precision - num_str.length()/* + cnt_thousand_sep*/; + if (zeroPadding > 0) + num_str.prepend(QString(zeroPadding, resultZero)); if ((flags & Alternate || flags & ShowBase) && base == 8 - && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0'))) + && (num_str.isEmpty() || num_str.at(0).unicode() != QLatin1Char('0'))) num_str.prepend(QLatin1Char('0')); // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds @@ -3009,8 +3005,8 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group, else if (base == 2 && flags & Alternate) num_pad_chars -= 2; - for (int i = 0; i < num_pad_chars; ++i) - num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0')); + if (num_pad_chars > 0) + num_str.prepend(QString(num_pad_chars, resultZero)); } if (flags & CapitalEorX) -- cgit v1.2.3