21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/stack_string.hpp"
28 #include "core/ave_deviation_meter.hpp"
29 #include "core/stats_output.hpp"
34 #include <ext/vstring.h>
36 using namespace libjmmcg;
48 #ifdef JMMCG_PERFORMANCE_TESTS
49 const unsigned long test_size=100000000U;
119 BOOST_AUTO_TEST_SUITE(string_tests)
121 BOOST_AUTO_TEST_SUITE(performance_ctor_dtor, *stats_to_csv::make_fixture(
"stack_string_performance_ctor_dtor.csv"))
123 BOOST_AUTO_TEST_CASE_TEMPLATE(small_ctor, T, string_types)
127 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
131 char const src[]=
"small";
132 const auto t1=std::chrono::high_resolution_clock::now();
133 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
136 const auto t2=std::chrono::high_resolution_clock::now();
137 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
140 std::cout<<
typeid(string_t).name()<<
" small string (ctors+dtors)/sec="<<timed_results.first<<std::endl;
141 #ifdef JMMCG_PERFORMANCE_TESTS
142 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
143 BOOST_CHECK(!timed_results.second);
147 BOOST_AUTO_TEST_CASE_TEMPLATE(big_ctor, T, string_types)
151 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
155 char const src[]=
"a very very big string";
156 const auto t1=std::chrono::high_resolution_clock::now();
157 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
160 const auto t2=std::chrono::high_resolution_clock::now();
161 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
164 std::cout<<
typeid(string_t).name()<<
" big string (ctors+dtors)/sec="<<timed_results.first<<std::endl;
165 #ifdef JMMCG_PERFORMANCE_TESTS
166 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
167 BOOST_CHECK(!timed_results.second);
171 BOOST_AUTO_TEST_SUITE_END()
173 BOOST_AUTO_TEST_SUITE(performance_assignment, *stats_to_csv::make_fixture(
"stack_string_performance_assignment.csv"))
175 BOOST_AUTO_TEST_CASE_TEMPLATE(small_assignment, T, string_types)
179 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
183 char const src[]=
"small";
184 const auto t1=std::chrono::high_resolution_clock::now();
185 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
190 const auto t2=std::chrono::high_resolution_clock::now();
191 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
194 std::cout<<
typeid(string_t).name()<<
" small string (ctors+dtors+assignment)/sec="<<timed_results.first<<std::endl;
195 #ifdef JMMCG_PERFORMANCE_TESTS
196 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
197 BOOST_CHECK(!timed_results.second);
201 BOOST_AUTO_TEST_CASE_TEMPLATE(big_assignment, T, string_types)
205 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
209 char const src[]=
"a very very big string";
210 const auto t1=std::chrono::high_resolution_clock::now();
211 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
216 const auto t2=std::chrono::high_resolution_clock::now();
217 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
220 std::cout<<
typeid(string_t).name()<<
" big string (ctors+dtors+assignment)/sec="<<timed_results.first<<std::endl;
221 #ifdef JMMCG_PERFORMANCE_TESTS
222 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
223 BOOST_CHECK(!timed_results.second);
227 BOOST_AUTO_TEST_SUITE_END()
229 BOOST_AUTO_TEST_SUITE(performance_replace, *stats_to_csv::make_fixture(
"stack_string_performance_replace.csv"))
231 BOOST_AUTO_TEST_CASE_TEMPLATE(small_replace, T, string_types)
235 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
239 char const src[]=
"small";
240 const auto t1=std::chrono::high_resolution_clock::now();
241 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
244 s2.replace(std::next(s2.begin()), std::prev(s2.end()), s1.begin(), s1.end());
246 const auto t2=std::chrono::high_resolution_clock::now();
247 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
250 std::cout<<
typeid(string_t).name()<<
" small string (ctors+dtors+replace)/sec="<<timed_results.first<<std::endl;
251 #ifdef JMMCG_PERFORMANCE_TESTS
252 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
253 BOOST_CHECK(!timed_results.second);
257 BOOST_AUTO_TEST_CASE_TEMPLATE(big_replace, T, string_types)
261 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
265 char const src[]=
"a very very big string";
266 const auto t1=std::chrono::high_resolution_clock::now();
267 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
272 s2.replace(std::next(s2.begin()), std::prev(s2.end()), s1.begin(), s1.end());
276 const auto t2=std::chrono::high_resolution_clock::now();
277 return timed_results_t::value_type(test_size/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/1000000000));
280 std::cout<<
typeid(string_t).name()<<
" big string (ctors+dtors+replace)/sec="<<timed_results.first<<std::endl;
281 #ifdef JMMCG_PERFORMANCE_TESTS
282 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
283 BOOST_CHECK(!timed_results.second);
287 BOOST_AUTO_TEST_SUITE_END()
289 BOOST_AUTO_TEST_SUITE_END()