00001
00002
00003
00004
00005 #ifndef BALL_COMMON_H
00006 # include <BALL/common.h>
00007 #endif
00008
00009 #ifndef BALL_SYSTEM_TIMER_H
00010 # include <BALL/SYSTEM/timer.h>
00011 #endif
00012
00013 #include <string>
00014
00019 #define START_SECTION(name, weight) \
00020 BENCHMARK::section_time = BENCHMARK::timer.getCPUTime();\
00021 BENCHMARK::section_name = #name;\
00022 BENCHMARK::section_weight = weight;
00023
00024
00028 #define END_SECTION \
00029 BENCHMARK::timer.stop();\
00030 BENCHMARK::section_time = BENCHMARK::timer.getCPUTime() - BENCHMARK::section_time;\
00031 if (BENCHMARK::verbose > 0)\
00032 {\
00033 std::cout << BENCHMARK::section_name << ": " \
00034 << BENCHMARK::section_time << " s"\
00035 << " (weight = " << BENCHMARK::section_weight << ")" << std::endl;\
00036 }\
00037 BENCHMARK::total_time += BENCHMARK::section_time * BENCHMARK::section_weight;\
00038
00039
00044 #define STATUS(a) \
00045 if (BENCHMARK::verbose > 0)\
00046 {\
00047 std::cout << " status: " << a << std::endl;\
00048 }
00049
00050
00059 #define START_TIMER \
00060 BENCHMARK::timer.start();\
00061
00062
00071 #define STOP_TIMER \
00072 BENCHMARK::timer.stop();
00073
00079 #define START_BENCHMARK(class_name, overall_weight, version)\
00080 \
00081 \
00082 namespace BENCHMARK {\
00083 int verbose = 0;\
00084 bool all_tests = true;\
00085 int exception = 0;\
00086 string exception_name = "";\
00087 const char* version_string = version;\
00088 string section_name = "";\
00089 float section_weight = 1.0;\
00090 float weight = overall_weight;\
00091 float total_time;\
00092 float section_time;\
00093 BALL::Timer timer;\
00094 }\
00095 \
00096 \
00097 int main(int argc, char **argv)\
00098 {\
00099 \
00100 if (argc == 2) {\
00101 if (!strcmp(argv[1], "-v"))\
00102 BENCHMARK::verbose = 1;\
00103 };\
00104 \
00105 if ((argc > 2) || ((argc == 2) && (BENCHMARK::verbose == 0))) {\
00106 std::cerr << "Execute a benchmark for the " #class_name " class." << std::endl;\
00107 std::cerr << "Overall weight of the test: " << BENCHMARK::weight << std::endl;\
00108 \
00109 std::cerr << "On successful operation, the total CPU time (in seconds)," << std::endl;\
00110 std::cerr << "is printed." << std::endl;\
00111 std::cerr << "If called with an argument of -v, " << argv[0] << " detailed" << std::endl;\
00112 std::cerr << "information about individual benchmarks is printed." << std::endl;\
00113 return 1;\
00114 }\
00115 \
00116 if (BENCHMARK::verbose > 0)\
00117 std::cout << "Version: " << BENCHMARK::version_string << std::endl;\
00118 \
00119 try {\
00120
00121
00124 #define END_BENCHMARK \
00125 \
00126 }\
00127 \
00128 catch (BALL::Exception::FileNotFound& e)\
00129 {\
00130 BENCHMARK::all_tests = false;\
00131 if (BENCHMARK::verbose > 1)\
00132 {\
00133 if (BENCHMARK::exception == 1) \
00134 BENCHMARK::exception++;\
00135 std::cout << std::endl << " (caught exception of type ";\
00136 std::cout << e.getName();\
00137 if ((e.getLine() > 0) && (!(e.getFile() == "")))\
00138 std::cout << " outside a benchmark block, which was thrown in line " << e.getLine() << " of file " << e.getFile();\
00139 std::cout << " while looking for file " << e.getFilename();\
00140 std::cout << " - unexpected!) " << std::endl;\
00141 }\
00142 }\
00143 \
00144 catch (BALL::Exception::GeneralException& e)\
00145 {\
00146 BENCHMARK::all_tests = false;\
00147 if (BENCHMARK::verbose > 1)\
00148 {\
00149 if (BENCHMARK::exception == 1) \
00150 BENCHMARK::exception++;\
00151 std::cout << std::endl << " (caught exception of type ";\
00152 std::cout << e.getName();\
00153 if ((e.getLine() > 0) && (!(e.getFile() == "")))\
00154 std::cout << " outside a benchmark block, which was thrown in line " << e.getLine() << " of file " << e.getFile();\
00155 std::cout << " - unexpected!) " << std::endl;\
00156 }\
00157 }\
00158 \
00159 catch (...)\
00160 {\
00161 BENCHMARK::all_tests = false;\
00162 if (BENCHMARK::verbose > 1)\
00163 {\
00164 std::cout << std::endl << " (caught unidentified and unexpected exception outside a benchmark block!) " << std::endl;\
00165 }\
00166 }\
00167 \
00168 \
00169 if (!BENCHMARK::all_tests)\
00170 {\
00171 std::cout << "(" << BENCHMARK::weight * BENCHMARK::total_time << ")" << std::endl;\
00172 return 1;\
00173 } else {\
00174 std::cout << BENCHMARK::weight * BENCHMARK::total_time << std::endl;\
00175 return 0;\
00176 }\
00177 }\
00178