Patchwork [v3] Add an hash<string> performance test, rename some tests

login
register
mail settings
Submitter Paolo Carlini
Date Sept. 14, 2010, 10:29 a.m.
Message ID <4C8F4E74.9010302@oracle.com>
Download mbox | patch
Permalink /patch/64691/
State New
Headers show

Comments

Paolo Carlini - Sept. 14, 2010, 10:29 a.m.
Hi,

checked x86_64-linux, committed to mainline.

Paolo.

///////////////////////
2010-09-14  Matt Austern  <austern@google.com>
	    Paolo Carlini  <paolo.carlini@oracle.com>

	* testsuite/performance/21_strings/hash.cc: New.

2010-09-14  Paolo Carlini  <paolo.carlini@oracle.com>

	* 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.

Patch

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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <ctime>
-#include <iostream>
-#include <string>
-#include <testsuite_performance.h>
-
-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<string::size_type>(1) , 'x');
-}
-
-void
-test_append_string(int how_much)
-{
-  string s(static_cast<string::size_type>(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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <string>
-#include <testsuite_performance.h>
-
-// 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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <iterator>
-#include <sstream>
-
-#include <testsuite_performance.h>
-
-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<char>(isstr)),
-	     istreambuf_iterator<char>());
-  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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <string>
-#include <testsuite_performance.h>
-
-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 <string>
+#include <vector>
+#include <unordered_set>
+#include <cstdlib>
+#include <random>
+#include <testsuite_performance.h>
+
+using namespace std;
+
+vector<string>
+random_strings(int n, int len)
+{
+  string s(len, '\0');
+  unordered_set<string> 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<string>(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<string> 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<string>()(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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <string>
-#include <testsuite_performance.h>
-
-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;
-}