From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 55299 invoked by alias); 4 Jun 2015 07:59:46 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 55288 invoked by uid 48); 4 Jun 2015 07:59:41 -0000 From: "neleai at seznam dot cz" To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/66414] New: Regression: string::find ten times slower than strstr Date: Thu, 04 Jun 2015 07:59:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: libstdc++ X-Bugzilla-Version: 4.9.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: neleai at seznam dot cz X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-06/txt/msg00397.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66414 Bug ID: 66414 Summary: Regression: string::find ten times slower than strstr Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: neleai at seznam dot cz Target Milestone: --- Hi, as I seen bug with string::== being slower than using strcmp I decided to check other functions for regressions. Here string::find doesn't simply call optimized strstr and as result its ten times slower in following benchmark on my sandy bridge. #include #include #include using namespace std; int main() { int i; char s[10000]; for (i = 0; i < 10000; i++) s[i] = ((unsigned) rand() % 128) + 1; s[9999] = 0; int sum = 0; std::string foo = s; std::string bar; char *needle = strdup("needle"); for (i = 0; i < 100000; i++) { needle[0] = ((unsigned) rand() % 128) + 1; #ifdef STRSTR sum += (long) strstr(s, needle); #else sum += foo.find(needle); #endif } return sum; }