Index: gcc/libstdc++-v3/testsuite/util/testsuite_performance.h |
diff --git a/gcc/libstdc++-v3/testsuite/util/testsuite_performance.h b/gcc/libstdc++-v3/testsuite/util/testsuite_performance.h |
deleted file mode 100644 |
index 54cf8856701a799bb59c33776862edddddd87075..0000000000000000000000000000000000000000 |
--- a/gcc/libstdc++-v3/testsuite/util/testsuite_performance.h |
+++ /dev/null |
@@ -1,485 +0,0 @@ |
-// -*- C++ -*- |
-// Testing performance utilities for the C++ library testsuite. |
-// |
-// Copyright (C) 2003, 2004, 2005, 2007, 2008, 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/>. |
-// |
- |
-#ifndef _GLIBCXX_PERFORMANCE_H |
-#define _GLIBCXX_PERFORMANCE_H |
- |
-#include <sys/times.h> |
-#include <sys/resource.h> |
-#include <cstdlib> |
-#include <cstring> |
-#include <string> |
-#include <fstream> |
-#include <iomanip> |
-#include <typeinfo> |
-#include <stdexcept> |
-#include <sstream> |
-#include <cxxabi.h> |
-#include <testsuite_common_types.h> |
- |
-#ifdef __linux__ |
-#include <malloc.h> |
-#elif defined (__FreeBSD__) |
-extern "C" |
-{ |
- struct mallinfo |
- { |
- int uordblks; |
- int hblkhd; |
- }; |
- |
- struct mallinfo |
- mallinfo(void) |
- { |
- struct mallinfo m = { (((size_t) sbrk (0) + 1023) / 1024), 0 }; |
- return m; |
- } |
-} |
-#elif !defined (__hpux__) |
-extern "C" |
-{ |
- struct mallinfo |
- { |
- int uordblks; |
- int hblkhd; |
- }; |
- |
- struct mallinfo empty = { 0, 0 }; |
- |
- struct mallinfo |
- mallinfo(void) |
- { return empty; } |
-} |
-#endif |
- |
-namespace __gnu_test |
-{ |
- class time_counter |
- { |
- private: |
- clock_t elapsed_begin; |
- clock_t elapsed_end; |
- tms tms_begin; |
- tms tms_end; |
- |
- public: |
- explicit |
- time_counter() : elapsed_begin(), elapsed_end(), tms_begin(), tms_end() |
- { } |
- |
- void |
- clear() throw() |
- { |
- elapsed_begin = clock_t(); |
- elapsed_end = clock_t(); |
- tms_begin = tms(); |
- tms_end = tms(); |
- } |
- |
- void |
- start() |
- { |
- this->clear(); |
- elapsed_begin = times(&tms_begin); |
- const clock_t err = clock_t(-1); |
- if (elapsed_begin == err) |
- std::__throw_runtime_error("time_counter::start"); |
- } |
- |
- void |
- stop() |
- { |
- elapsed_end = times(&tms_end); |
- const clock_t err = clock_t(-1); |
- if (elapsed_end == err) |
- std::__throw_runtime_error("time_counter::stop"); |
- } |
- |
- size_t |
- real_time() const |
- { return elapsed_end - elapsed_begin; } |
- |
- size_t |
- user_time() const |
- { return tms_end.tms_utime - tms_begin.tms_utime; } |
- |
- size_t |
- system_time() const |
- { return tms_end.tms_stime - tms_begin.tms_stime; } |
- }; |
- |
- class resource_counter |
- { |
- int who; |
- rusage rusage_begin; |
- rusage rusage_end; |
- struct mallinfo allocation_begin; |
- struct mallinfo allocation_end; |
- |
- public: |
- resource_counter(int i = RUSAGE_SELF) : who(i) |
- { this->clear(); } |
- |
- void |
- clear() throw() |
- { |
- memset(&rusage_begin, 0, sizeof(rusage_begin)); |
- memset(&rusage_end, 0, sizeof(rusage_end)); |
- memset(&allocation_begin, 0, sizeof(allocation_begin)); |
- memset(&allocation_end, 0, sizeof(allocation_end)); |
- } |
- |
- void |
- start() |
- { |
- if (getrusage(who, &rusage_begin) != 0 ) |
- memset(&rusage_begin, 0, sizeof(rusage_begin)); |
- malloc(0); // Needed for some implementations. |
- allocation_begin = mallinfo(); |
- } |
- |
- void |
- stop() |
- { |
- if (getrusage(who, &rusage_end) != 0 ) |
- memset(&rusage_end, 0, sizeof(rusage_end)); |
- allocation_end = mallinfo(); |
- } |
- |
- int |
- allocated_memory() const |
- { return ((allocation_end.uordblks - allocation_begin.uordblks) |
- + (allocation_end.hblkhd - allocation_begin.hblkhd)); } |
- |
- long |
- hard_page_fault() const |
- { return rusage_end.ru_majflt - rusage_begin.ru_majflt; } |
- |
- long |
- swapped() const |
- { return rusage_end.ru_nswap - rusage_begin.ru_nswap; } |
- }; |
- |
- inline void |
- start_counters(time_counter& t, resource_counter& r) |
- { |
- t.start(); |
- r.start(); |
- } |
- |
- inline void |
- stop_counters(time_counter& t, resource_counter& r) |
- { |
- t.stop(); |
- r.stop(); |
- } |
- |
- inline void |
- clear_counters(time_counter& t, resource_counter& r) |
- { |
- t.clear(); |
- r.clear(); |
- } |
- |
- void |
- report_performance(const std::string file, const std::string comment, |
- const time_counter& t, const resource_counter& r) |
- { |
- const char space = ' '; |
- const char tab = '\t'; |
- const char* name = "libstdc++-performance.sum"; |
- std::string::const_iterator i = file.begin() + file.find_last_of('/') + 1; |
- std::string testname(i, file.end()); |
- |
- std::ofstream out(name, std::ios_base::app); |
- |
-#ifdef __GTHREADS |
- if (__gthread_active_p()) |
- testname.append("-thread"); |
-#endif |
- |
- out.setf(std::ios_base::left); |
- out << std::setw(25) << testname << tab; |
- out << std::setw(25) << comment << tab; |
- |
- out.setf(std::ios_base::right); |
- out << std::setw(4) << t.real_time() << "r" << space; |
- out << std::setw(4) << t.user_time() << "u" << space; |
- out << std::setw(4) << t.system_time() << "s" << space; |
- out << std::setw(8) << r.allocated_memory() << "mem" << space; |
- out << std::setw(4) << r.hard_page_fault() << "pf" << space; |
- |
- out << std::endl; |
- out.close(); |
- } |
- |
- void |
- report_header(const std::string file, const std::string header) |
- { |
- const char space = ' '; |
- const char tab = '\t'; |
- const char* name = "libstdc++-performance.sum"; |
- std::string::const_iterator i = file.begin() + file.find_last_of('/') + 1; |
- std::string testname(i, file.end()); |
- |
- std::ofstream out(name, std::ios_base::app); |
- |
-#ifdef __GTHREADS |
- if (__gthread_active_p ()) |
- testname.append("-thread"); |
-#endif |
- |
- out.setf(std::ios_base::left); |
- out << std::setw(25) << testname << tab; |
- out << std::setw(40) << header << tab; |
- |
- out << std::endl; |
- out.close(); |
- } |
-} // namespace __gnu_test |
- |
- |
-// Ah, we wish it wasn't so... |
-bool first_container = false; |
-extern const char* filename; |
- |
-typedef std::string::size_type (*callback_type) (std::string&); |
- |
-template<typename Container, int Iter, bool Thread> |
- void |
- write_viz_container(callback_type find_container, const char* filename) |
- { |
- typedef std::string string; |
- |
- // Create title. |
- { |
- const char ws(' '); |
- std::ostringstream title; |
- |
- std::string titlename(filename); |
- std::string::size_type n = titlename.find('.'); |
- if (n != string::npos) |
- titlename = std::string(titlename.begin(), titlename.begin() + n); |
- |
- title << titlename; |
- title << ws; |
- title << Iter; |
- title << ws; |
-#if 0 |
- title << "thread<"; |
- std::boolalpha(title); |
- title << Thread; |
- title << '>'; |
-#endif |
- |
- titlename += ".title"; |
- std::ofstream titlefile(titlename.c_str()); |
- if (!titlefile.good()) |
- throw std::runtime_error("write_viz_data cannot open titlename"); |
- titlefile << title.str() << std::endl; |
- } |
- |
- // Create compressed type name. |
- Container obj; |
- int status; |
- std::string type(abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status)); |
- |
- // Extract fully-qualified typename. |
- // Assumes "set" or "map" are uniquely determinate. |
- string::iterator beg = type.begin(); |
- string::iterator end; |
- string::size_type n = (*find_container)(type); |
- |
- // Find start of fully-qualified name. |
- // Assume map, find end. |
- string::size_type nend = type.find('<', n); |
- if (nend != string::npos) |
- end = type.begin() + nend; |
- |
- string compressed_type; |
- compressed_type += '"'; |
- compressed_type += string(beg, end); |
- compressed_type += '<'; |
-#if 0 |
- typename Container::key_type v; |
- compressed_type += typeid(v).name(); |
-#else |
- compressed_type += "int"; |
-#endif |
- compressed_type += ", A>"; |
- |
- // XXX |
- if (Thread == true) |
- compressed_type += " thread"; |
- compressed_type += '"'; |
- |
- std::ofstream file(filename, std::ios_base::app); |
- if (!file.good()) |
- throw std::runtime_error("write_viz_data cannot open filename"); |
- |
- file << compressed_type; |
- first_container = false; |
- } |
- |
- |
-void |
-write_viz_data(__gnu_test::time_counter& time, const char* filename) |
-{ |
- std::ofstream file(filename, std::ios_base::app); |
- if (!file.good()) |
- throw std::runtime_error("write_viz_data cannot open filename"); |
- |
- // Print out score in appropriate column. |
- const char tab('\t'); |
- int score = time.real_time(); |
- file << tab << score; |
-} |
- |
-void |
-write_viz_endl(const char* filename) |
-{ |
- std::ofstream file(filename, std::ios_base::app); |
- if (!file.good()) |
- throw std::runtime_error("write_viz_endl cannot open filename"); |
- file << std::endl; |
-} |
- |
- |
-// Function template, function objects for the tests. |
-template<typename TestType> |
- struct value_type : public std::pair<const TestType, TestType> |
- { |
- inline value_type& operator++() |
- { |
- ++this->second; |
- return *this; |
- } |
- |
- inline operator TestType() const { return this->second; } |
- }; |
- |
-template<typename Container, int Iter> |
- void |
- do_loop(); |
- |
-template<typename Container, int Iter> |
- void* |
- do_thread(void* p = NULL) |
- { |
- do_loop<Container, Iter>(); |
- return p; |
- } |
- |
-template<typename Container, int Iter, bool Thread> |
- void |
- test_container(const char* filename) |
- { |
- using namespace __gnu_test; |
- time_counter time; |
- resource_counter resource; |
- { |
- start_counters(time, resource); |
- if (!Thread) |
- { |
- // No threads, so run 4x. |
- do_loop<Container, Iter * 4>(); |
- } |
- else |
- { |
-#if defined (_GLIBCXX_GCC_GTHR_POSIX_H) && !defined (NOTHREAD) |
- pthread_t t1, t2, t3, t4; |
- pthread_create(&t1, 0, &do_thread<Container, Iter>, 0); |
- pthread_create(&t2, 0, &do_thread<Container, Iter>, 0); |
- pthread_create(&t3, 0, &do_thread<Container, Iter>, 0); |
- pthread_create(&t4, 0, &do_thread<Container, Iter>, 0); |
- |
- pthread_join(t1, NULL); |
- pthread_join(t2, NULL); |
- pthread_join(t3, NULL); |
- pthread_join(t4, NULL); |
-#endif |
- } |
- stop_counters(time, resource); |
- |
- // Detailed text data. |
- Container obj; |
- int status; |
- std::ostringstream comment; |
- comment << "type: " << abi::__cxa_demangle(typeid(obj).name(), |
- 0, 0, &status); |
- report_header(filename, comment.str()); |
- report_performance("", "", time, resource); |
- |
- // Detailed data for visualization. |
- std::string vizfilename(filename); |
- vizfilename += ".dat"; |
- write_viz_data(time, vizfilename.c_str()); |
- } |
- } |
- |
-template<bool Thread> |
- struct test_sequence |
- { |
- test_sequence(const char* filename) : _M_filename(filename) { } |
- |
- template<class Container> |
- void |
- operator()(Container) |
- { |
- const int i = 20000; |
- test_container<Container, i, Thread>(_M_filename); |
- } |
- |
- private: |
- const char* _M_filename; |
- }; |
- |
- |
-inline std::string::size_type |
-sequence_find_container(std::string& type) |
-{ |
- const std::string::size_type npos = std::string::npos; |
- std::string::size_type n1 = type.find("vector"); |
- std::string::size_type n2 = type.find("list"); |
- std::string::size_type n3 = type.find("deque"); |
- std::string::size_type n4 = type.find("string"); |
- |
- if (n1 != npos || n2 != npos || n3 != npos || n4 != npos) |
- return std::min(std::min(n1, n2), std::min(n3, n4)); |
- else |
- throw std::runtime_error("sequence_find_container not found"); |
-} |
- |
-inline std::string::size_type |
-associative_find_container(std::string& type) |
-{ |
- using std::string; |
- string::size_type n1 = type.find("map"); |
- string::size_type n2 = type.find("set"); |
- if (n1 != string::npos || n2 != string::npos) |
- return std::min(n1, n2); |
- else |
- throw std::runtime_error("associative_find_container not found"); |
-} |
- |
-#endif // _GLIBCXX_PERFORMANCE_H |
- |