From 2f5b84cfc7f88ca1acaf5f248f5ac018846a1f51 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 23 Oct 2023 08:32:07 +0200 Subject: [PATCH] make repeatedly used regexps static for some performance boost --- src/librssguard/core/message.cpp | 10 +++++++--- src/librssguard/gui/reusable/timespinbox.cpp | 2 +- src/librssguard/network-web/downloader.cpp | 18 +++++++++++++----- src/librssguard/network-web/networkfactory.cpp | 4 +++- src/librssguard/network-web/webfactory.cpp | 4 +++- .../services/gmail/gmailnetworkfactory.cpp | 1 - .../services/greader/greadernetwork.cpp | 4 +++- .../services/standard/parsers/atomparser.cpp | 7 +++++-- .../services/standard/parsers/feedparser.cpp | 4 +++- .../services/standard/parsers/jsonparser.cpp | 5 +++-- .../services/standard/parsers/rdfparser.cpp | 5 +++-- .../services/standard/parsers/rssparser.cpp | 5 +++-- 12 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/librssguard/core/message.cpp b/src/librssguard/core/message.cpp index 20c735f1f..2e1468783 100644 --- a/src/librssguard/core/message.cpp +++ b/src/librssguard/core/message.cpp @@ -76,19 +76,23 @@ Message::Message() { } void Message::sanitize(const Feed* feed, bool fix_future_datetimes) { + static QRegularExpression reg_spaces(QString::fromUtf8(QByteArray("[\xE2\x80\xAF]"))); + static QRegularExpression reg_whites(QSL("[\\s]{2,}")); + static QRegularExpression reg_news(QSL("([\\n\\r])|(^\\s)")); + // Sanitize title. m_title = qApp->web()->stripTags(qApp->web()->unescapeHtml(m_title)); m_title = m_title // Remove non-breaking spaces. - .replace(QRegularExpression(QString::fromUtf8(QByteArray("[\xE2\x80\xAF]"))), QSL(" ")) + .replace(reg_spaces, QSL(" ")) // Shrink consecutive whitespaces. - .replace(QRegularExpression(QSL("[\\s]{2,}")), QSL(" ")) + .replace(reg_whites, QSL(" ")) // Remove all newlines and leading white space. - .remove(QRegularExpression(QSL("([\\n\\r])|(^\\s)"))) + .remove(reg_news) // Remove non-breaking zero-width spaces. .remove(QChar(65279)); diff --git a/src/librssguard/gui/reusable/timespinbox.cpp b/src/librssguard/gui/reusable/timespinbox.cpp index 44608e050..91aca8f72 100644 --- a/src/librssguard/gui/reusable/timespinbox.cpp +++ b/src/librssguard/gui/reusable/timespinbox.cpp @@ -21,7 +21,7 @@ double TimeSpinBox::valueFromText(const QString& text) const { return value; } else { - QRegularExpression rx(QSL("\\b[0-9]{1,}\\b")); + static QRegularExpression rx(QSL("\\b[0-9]{1,}\\b")); QStringList numbers; int pos = 0; int count = 0; diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp index 472beb3f5..38b2ff970 100644 --- a/src/librssguard/network-web/downloader.cpp +++ b/src/librssguard/network-web/downloader.cpp @@ -274,7 +274,9 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) { QString content_type = reply->header(QNetworkRequest::KnownHeaders::ContentTypeHeader).toString(); QString boundary = content_type.mid(content_type.indexOf(QL1S("boundary=")) + 9); - QRegularExpression regex(QL1S("--") + boundary + QL1S("(--)?(\\r\\n)?")); + + static QRegularExpression regex(QL1S("--") + boundary + QL1S("(--)?(\\r\\n)?")); + QStringList list = QString::fromUtf8(data).split(regex, #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 Qt::SplitBehaviorFlags::SkipEmptyParts); @@ -289,12 +291,18 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) { for (const QString& http_response_str : list) { // We separate headers and body. HttpResponse new_part; + + static QRegularExpression reg_headers(QSL("\\r\\r?\\n")); + static QRegularExpression reg_body(QSL("(\\r\\r?\\n){2,}")); + static QRegularExpression reg_whites(QSL("[\\n\\r]+")); + int start_of_http = http_response_str.indexOf(QL1S("HTTP/1.1")); - int start_of_headers = http_response_str.indexOf(QRegularExpression(QSL("\\r\\r?\\n")), start_of_http); - int start_of_body = http_response_str.indexOf(QRegularExpression(QSL("(\\r\\r?\\n){2,}")), start_of_headers + 2); + int start_of_headers = http_response_str.indexOf(reg_headers, start_of_http); + int start_of_body = http_response_str.indexOf(reg_body, start_of_headers + 2); + QString body = http_response_str.mid(start_of_body); - QString headers = http_response_str.mid(start_of_headers, start_of_body - start_of_headers) - .replace(QRegularExpression(QSL("[\\n\\r]+")), QSL("\n")); + QString headers = + http_response_str.mid(start_of_headers, start_of_body - start_of_headers).replace(reg_whites, QSL("\n")); auto header_lines = headers.split(QL1C('\n'), #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 diff --git a/src/librssguard/network-web/networkfactory.cpp b/src/librssguard/network-web/networkfactory.cpp index 875180a21..52b4cf2e4 100644 --- a/src/librssguard/network-web/networkfactory.cpp +++ b/src/librssguard/network-web/networkfactory.cpp @@ -157,7 +157,9 @@ QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code) } QString NetworkFactory::sanitizeUrl(const QString& url) { - return QString(url).replace(QRegularExpression(QSL("[^\\w\\-.~:\\/?#\\[\\]@!$&'()*+,;=% \\|]")), {}); + static QRegularExpression reg_non_url(QSL("[^\\w\\-.~:\\/?#\\[\\]@!$&'()*+,;=% \\|]")); + + return QString(url).replace(reg_non_url, {}); } QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList& urls, diff --git a/src/librssguard/network-web/webfactory.cpp b/src/librssguard/network-web/webfactory.cpp index 568dc8efe..40ebf836d 100644 --- a/src/librssguard/network-web/webfactory.cpp +++ b/src/librssguard/network-web/webfactory.cpp @@ -160,7 +160,9 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const { } QString WebFactory::stripTags(QString text) { - return text.remove(QRegularExpression(QSL("<[^>]*>"))); + static QRegularExpression reg_tags(QSL("<[^>]*>")); + + return text.remove(reg_tags); } QString WebFactory::unescapeHtml(const QString& html) { diff --git a/src/librssguard/services/gmail/gmailnetworkfactory.cpp b/src/librssguard/services/gmail/gmailnetworkfactory.cpp index 5e96bce8f..59febf7dc 100644 --- a/src/librssguard/services/gmail/gmailnetworkfactory.cpp +++ b/src/librssguard/services/gmail/gmailnetworkfactory.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include GmailNetworkFactory::GmailNetworkFactory(QObject* parent) diff --git a/src/librssguard/services/greader/greadernetwork.cpp b/src/librssguard/services/greader/greadernetwork.cpp index 0d6e385a0..398f44285 100644 --- a/src/librssguard/services/greader/greadernetwork.cpp +++ b/src/librssguard/services/greader/greadernetwork.cpp @@ -923,7 +923,9 @@ QString GreaderNetwork::convertShortStreamIdToLongStreamId(const QString& stream } QString GreaderNetwork::simplifyStreamId(const QString& stream_id) const { - return QString(stream_id).replace(QRegularExpression(QSL("\\/\\d+\\/")), QSL("/-/")); + static QRegularExpression reg(QSL("\\/\\d+\\/")); + + return QString(stream_id).replace(reg, QSL("/-/")); } QStringList GreaderNetwork::decodeItemIds(const QString& stream_json_data, QString& continuation) { diff --git a/src/librssguard/services/standard/parsers/atomparser.cpp b/src/librssguard/services/standard/parsers/atomparser.cpp index 4a842a6a2..773688eda 100644 --- a/src/librssguard/services/standard/parsers/atomparser.cpp +++ b/src/librssguard/services/standard/parsers/atomparser.cpp @@ -68,8 +68,9 @@ QList AtomParser::discoverFeeds(ServiceRoot* root, const QUrl& ur IOFactory::writeFile("aaaa", data); // 2. - QRegularExpression rx(QSL(ATOM_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); - QRegularExpression rx_href(QSL(ATOM_HREF_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx(QSL(ATOM_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx_href(QSL(ATOM_HREF_REGEX_MATCHER), + QRegularExpression::PatternOption::CaseInsensitiveOption); rx_href.optimize(); @@ -208,6 +209,8 @@ QList AtomParser::discoverFeeds(ServiceRoot* root, const QUrl& ur QPair> AtomParser::guessFeed(const QByteArray& content, const QString& content_type) const { + Q_UNUSED(content_type) + QString xml_schema_encoding = QSL(DEFAULT_FEED_ENCODING); QString xml_contents_encoded; QString enc = diff --git a/src/librssguard/services/standard/parsers/feedparser.cpp b/src/librssguard/services/standard/parsers/feedparser.cpp index 9d85fd416..e4aad0751 100644 --- a/src/librssguard/services/standard/parsers/feedparser.cpp +++ b/src/librssguard/services/standard/parsers/feedparser.cpp @@ -195,7 +195,9 @@ QList FeedParser::messages() { } // Url. - new_message.m_url = new_message.m_url.replace(QRegularExpression(QSL("[\\t\\n]")), QString()); + static QRegularExpression reg_non_url(QSL("[\\t\\n]")); + + new_message.m_url = new_message.m_url.replace(reg_non_url, {}); } return messages; diff --git a/src/librssguard/services/standard/parsers/jsonparser.cpp b/src/librssguard/services/standard/parsers/jsonparser.cpp index 08df7c872..f25d45ce7 100644 --- a/src/librssguard/services/standard/parsers/jsonparser.cpp +++ b/src/librssguard/services/standard/parsers/jsonparser.cpp @@ -54,8 +54,9 @@ QList JsonParser::discoverFeeds(ServiceRoot* root, const QUrl& ur } // 2. - QRegularExpression rx(QSL(JSON_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); - QRegularExpression rx_href(QSL(JSON_HREF_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx(QSL(JSON_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx_href(QSL(JSON_HREF_REGEX_MATCHER), + QRegularExpression::PatternOption::CaseInsensitiveOption); rx_href.optimize(); diff --git a/src/librssguard/services/standard/parsers/rdfparser.cpp b/src/librssguard/services/standard/parsers/rdfparser.cpp index 7a475b65a..87358e02c 100644 --- a/src/librssguard/services/standard/parsers/rdfparser.cpp +++ b/src/librssguard/services/standard/parsers/rdfparser.cpp @@ -55,8 +55,9 @@ QList RdfParser::discoverFeeds(ServiceRoot* root, const QUrl& url } // 2. - QRegularExpression rx(QSL(RSS_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); - QRegularExpression rx_href(QSL(RSS_HREF_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx(QSL(RSS_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx_href(QSL(RSS_HREF_REGEX_MATCHER), + QRegularExpression::PatternOption::CaseInsensitiveOption); rx_href.optimize(); diff --git a/src/librssguard/services/standard/parsers/rssparser.cpp b/src/librssguard/services/standard/parsers/rssparser.cpp index 8bfce44e8..1e8f703c7 100644 --- a/src/librssguard/services/standard/parsers/rssparser.cpp +++ b/src/librssguard/services/standard/parsers/rssparser.cpp @@ -55,8 +55,9 @@ QList RssParser::discoverFeeds(ServiceRoot* root, const QUrl& url } // 2. - QRegularExpression rx(QSL(RSS_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); - QRegularExpression rx_href(QSL(RSS_HREF_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx(QSL(RSS_REGEX_MATCHER), QRegularExpression::PatternOption::CaseInsensitiveOption); + static QRegularExpression rx_href(QSL(RSS_HREF_REGEX_MATCHER), + QRegularExpression::PatternOption::CaseInsensitiveOption); rx_href.optimize();