From patchwork Tue Sep 14 10:29:08 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 64691 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 860F9B6F0D for ; Tue, 14 Sep 2010 20:29:23 +1000 (EST) Received: (qmail 18902 invoked by alias); 14 Sep 2010 10:29:21 -0000 Received: (qmail 18875 invoked by uid 22791); 14 Sep 2010 10:29:19 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from vsmtp4.tin.it (HELO vsmtp4.tin.it) (212.216.176.224) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 14 Sep 2010 10:29:12 +0000 Received: from [192.168.0.4] (79.36.29.105) by vsmtp4.tin.it (8.5.113) id 4BCE3CBE0B3F37BB; Tue, 14 Sep 2010 12:29:08 +0200 Message-ID: <4C8F4E74.9010302@oracle.com> Date: Tue, 14 Sep 2010 12:29:08 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100714 SUSE/3.0.6 Thunderbird/3.0.6 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ Subject: [v3] Add an hash performance test, rename some tests X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, checked x86_64-linux, committed to mainline. Paolo. /////////////////////// 2010-09-14 Matt Austern Paolo Carlini * testsuite/performance/21_strings/hash.cc: New. 2010-09-14 Paolo Carlini * testsuite/performance/21_strings/string_append.cc: Rename to... * testsuite/performance/21_strings/append-1.cc: ... this. * testsuite/performance/21_strings/string_append_2.cc: Rename to... * testsuite/performance/21_strings/append-2.cc: ... this. * testsuite/performance/21_strings/string_cons_input_iterator.cc: Rename to... * testsuite/performance/21_strings/cons_input_iterator.cc: ... this. * testsuite/performance/21_strings/string_copy_cons_and_dest.cc: Rename to... * testsuite/performance/21_strings/copy_cons_and_dest.cc: ... this. * testsuite/performance/21_strings/string_find.cc: Rename to... * testsuite/performance/21_strings/find.cc: ... this. Index: testsuite/performance/21_strings/string_append.cc =================================================================== --- testsuite/performance/21_strings/string_append.cc (revision 164270) +++ testsuite/performance/21_strings/string_append.cc (working copy) @@ -1,77 +0,0 @@ - // Copyright (C) 2003, 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include -#include -#include - -using namespace std; - -void -test_append_char(int how_much) -{ - string buf; // no preallocation - for (int i = 0; i < how_much; ++i) - buf.append(static_cast(1) , 'x'); -} - -void -test_append_string(int how_much) -{ - string s(static_cast(1) , 'x'); - string buf; // no preallocation - for (int i = 0; i < how_much; ++i) - buf.append(s); -} - -void -run_benchmark1(int how_much) -{ - using namespace __gnu_test; - time_counter time; - resource_counter resource; - start_counters(time, resource); - test_append_char(how_much); - stop_counters(time, resource); - report_performance(__FILE__, "char", time, resource); -} - -void -run_benchmark2(int how_much) -{ - using namespace __gnu_test; - time_counter time; - resource_counter resource; - start_counters(time, resource); - test_append_string(how_much); - stop_counters(time, resource); - report_performance(__FILE__, "string", time, resource); -} - -// libstdc++/5380 -// libstdc++/4960 -int main() -{ - run_benchmark1(100000); - run_benchmark2(100000); - run_benchmark1(1000000); - run_benchmark2(1000000); - run_benchmark1(10000000); - run_benchmark2(10000000); -} Index: testsuite/performance/21_strings/string_append_2.cc =================================================================== --- testsuite/performance/21_strings/string_append_2.cc (revision 164270) +++ testsuite/performance/21_strings/string_append_2.cc (working copy) @@ -1,46 +0,0 @@ -// Copyright (C) 2004, 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include - -// Short strings didn't grow quickly... -void test01() -{ - using namespace __gnu_test; - time_counter time; - resource_counter resource; - - start_counters(time, resource); - for (unsigned i = 0; i < 200000; ++i) - { - std::string a; - for (unsigned j = 0; j < 400; ++j) - a.append(1, 'x'); - } - stop_counters(time, resource); - - report_performance(__FILE__, "", time, resource); - clear_counters(time, resource); -} - -int main() -{ - test01(); - return 0; -} Index: testsuite/performance/21_strings/string_cons_input_iterator.cc =================================================================== --- testsuite/performance/21_strings/string_cons_input_iterator.cc (revision 164270) +++ testsuite/performance/21_strings/string_cons_input_iterator.cc (working copy) @@ -1,49 +0,0 @@ -// Copyright (C) 2004, 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include - -#include - -void benchmark(long len) -{ - using namespace std; - using namespace __gnu_test; - - time_counter time; - resource_counter resource; - - istringstream isstr(string(len, 'a')); - - start_counters(time, resource); - string str((istreambuf_iterator(isstr)), - istreambuf_iterator()); - stop_counters(time, resource); - - report_performance(__FILE__, "", time, resource); - clear_counters(time, resource); -} - -int main() -{ - benchmark(500000); - benchmark(5000000); - benchmark(50000000); - return 0; -} Index: testsuite/performance/21_strings/string_copy_cons_and_dest.cc =================================================================== --- testsuite/performance/21_strings/string_copy_cons_and_dest.cc (revision 164270) +++ testsuite/performance/21_strings/string_copy_cons_and_dest.cc (working copy) @@ -1,52 +0,0 @@ -// Copyright (C) 2006, 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include - -void benchmark(long len) -{ - using namespace std; - using namespace __gnu_test; - - time_counter time; - resource_counter resource; - - start_counters(time, resource); - string a("1"); - for (long i = 0; i < len; ++i) - { - string ss1(a); - string ss2(ss1); - string ss3(ss2); - string ss4(ss3); - string ss5(ss4); - } - stop_counters(time, resource); - - report_performance(__FILE__, "", time, resource); - clear_counters(time, resource); -} - -int main() -{ - benchmark(1000000); - benchmark(10000000); - benchmark(100000000); - return 0; -} Index: testsuite/performance/21_strings/hash.cc =================================================================== --- testsuite/performance/21_strings/hash.cc (revision 0) +++ testsuite/performance/21_strings/hash.cc (revision 0) @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +vector +random_strings(int n, int len) +{ + string s(len, '\0'); + unordered_set result_set; + random_device rd; + while (result_set.size() < n) + { + result_set.insert(s); + unsigned int tmp = rd(); + tmp %= len * 256; + s[tmp / 256] = tmp % 256; + } + return vector(result_set.begin(), result_set.end()); +} + +int +main(int argc, char **argv) +{ + using namespace __gnu_test; + time_counter time; + resource_counter resource; + + int string_size = 71; + int num_strings = 6000000; + if (argc > 1) + { + string_size = atoi(argv[1]); + if (argc > 2) + num_strings = atoi(argv[2]); + } + + // Construct random strings. + vector v = random_strings(num_strings, string_size); + + // Time hashing. + size_t tmp = 0; // prevent compiler from optimizing away all the work + start_counters(time, resource); + for (int i = 0; i < num_strings; i++) + tmp += hash()(v[i]); + stop_counters(time, resource); + + if (tmp != 0 || argc < 9) // use tmp to prevent compiler optimization + report_performance(__FILE__, "", time, resource); + + clear_counters(time, resource); + + return 0; +} Index: testsuite/performance/21_strings/string_find.cc =================================================================== --- testsuite/performance/21_strings/string_find.cc (revision 164270) +++ testsuite/performance/21_strings/string_find.cc (working copy) @@ -1,96 +0,0 @@ - // Copyright (C) 2004, 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include - -void -test_pair(const std::string& s, const std::string& f, int n) -{ - std::string::size_type sz = 0; - - for (int i = 0; i < n; ++i) - sz = s.find(f); -} - -int main() -{ - using namespace std; - using namespace __gnu_test; - - time_counter time; - resource_counter resource; - - const unsigned int iterations = 2000000; - - string s, f; - s = "aabbaabbaaxd adbffdadgaxaabbbddhatyaaaabbbaabbaabbcsy"; - f = "aabbaabbc"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "1", time, resource); - clear_counters(time, resource); - - f = "aabbb"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "2", time, resource); - clear_counters(time, resource); - - f = "xd"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "3", time, resource); - clear_counters(time, resource); - - s = "dhruv is a very very good boy ;-)"; - f = "very"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "4", time, resource); - clear_counters(time, resource); - - f = "bad"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "5", time, resource); - clear_counters(time, resource); - - f = "extra irritating"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "6", time, resource); - clear_counters(time, resource); - - s = "this is a very this is a very this is a verty this is a very " - "this is a very long sentence"; - f = "this is a very long sentence"; - start_counters(time, resource); - test_pair(s, f, iterations); - stop_counters(time, resource); - report_performance(__FILE__, "7", time, resource); - clear_counters(time, resource); - - return 0; -}