From a48e9af146ee1d7571934994065e7164fd323f18 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Wed, 14 Sep 2011 13:38:39 +0200 Subject: Boost performance of QChar::isLetter Make it inline; add fast checks for ascii letters; add fallback function that uses the fastcall calling convention. On ia32, this change makes isLetter ~370x faster for ascii letters, ~250x faster for non-letter ascii characters, and ~1.5x faster for non-ascii characters. Note that this change is NOT binary compatible. Also add an autotest with expected results from before the optimization, to ensure that the behavior is the same. Change-Id: I06f8d3d43114537cee5567e670898cef6494c20a Reviewed-on: http://codereview.qt-project.org/4903 Reviewed-by: Qt Sanity Bot Reviewed-by: Lars Knoll --- src/corelib/tools/qchar.cpp | 11 +++++++++-- src/corelib/tools/qchar.h | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index 5d4769d7f0..a1978037c1 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -556,17 +556,24 @@ bool QChar::isPunct() const } /*! + \fn bool QChar::isLetter() const + Returns true if the character is a letter (Letter_* categories); otherwise returns false. */ -bool QChar::isLetter() const + +/*! + \internal + \overload +*/ +bool QChar::isLetter(ushort ucs2) { const int test = FLAG(Letter_Uppercase) | FLAG(Letter_Lowercase) | FLAG(Letter_Titlecase) | FLAG(Letter_Modifier) | FLAG(Letter_Other); - return FLAG(qGetProp(ucs)->category) & test; + return FLAG(qGetProp(ucs2)->category) & test; } /*! diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h index 801cb7d699..fc5a9b051d 100644 --- a/src/corelib/tools/qchar.h +++ b/src/corelib/tools/qchar.h @@ -234,7 +234,11 @@ public: bool isPunct() const; bool isSpace() const; bool isMark() const; - bool isLetter() const; + inline bool isLetter() const { + return (ucs >= 'a' && ucs <= 'z') + || (ucs <= 'Z' && ucs >= 'A') + || (ucs > 127 && isLetter(ucs)); + } bool isNumber() const; bool isLetterOrNumber() const; inline bool isDigit() const @@ -317,6 +321,7 @@ public: private: static bool QT_FASTCALL isDigit(ushort ucs2); + static bool QT_FASTCALL isLetter(ushort ucs2); #ifdef QT_NO_CAST_FROM_ASCII QChar(char c); -- cgit v1.2.3