21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/ave_deviation_meter.hpp"
27 #include "core/stats_output.hpp"
28 #include "core/ttypes.hpp"
30 #include <boost/lexical_cast.hpp>
35 using namespace libjmmcg;
52 "1234567890123456789",
57 static long result(
char const *
const s,
std::size_t)
noexcept(
true) {
64 static long result(
char const *
const s,
std::size_t)
noexcept(
true) {
66 return std::strtol(s,
nullptr, 10);
71 static long result(
char const *
const s,
std::size_t sz)
noexcept(
true) {
74 std::from_chars(s, s+sz, res, 10);
80 static std::size_t
result(
long v,
char *
const s,
std::size_t sz)
noexcept(
true) {
82 std::to_chars(s, s+sz, v, 10);
89 static V
result(
char const *
const s,
std::size_t sz)
noexcept(
true)
__attribute__((pure)) {
91 return fromstring<V>(s, sz);
96 static long result(
char const *
const s,
std::size_t sz)
noexcept(
true)
__attribute__((pure)) {
104 static V
result(
const char *
const s,
std::size_t)
noexcept(
true)
__attribute__((pure)) {
106 return boost::lexical_cast<V>(s);
111 static std::size_t
result(
long v,
char *
const s,
std::size_t sz)
noexcept(
true)
__attribute__((pure)) {
117 using from_conversion_algorithms=boost::mpl::list<
118 test_folly_ascii_to_int,
119 test_from_string_baseline<
unsigned long long>,
120 test_from_string_baseline<
double>,
122 boost_lexical_cast_from<
long>,
123 boost_lexical_cast_from<
double>,
128 using to_conversion_algorithms=boost::mpl::list<
129 folly_uint64ToBufferUnsafe,
133 BOOST_AUTO_TEST_SUITE(conversions_tests)
135 BOOST_AUTO_TEST_SUITE(performance, *stats_to_csv::make_fixture(
"string_conversions_performance.csv"))
142 BOOST_AUTO_TEST_CASE_TEMPLATE(from_string, algorithm, from_conversion_algorithms) {
143 #ifdef JMMCG_PERFORMANCE_TESTS
144 const unsigned long test_size=2<<25;
145 const unsigned short loops_for_conv=4000;
147 const unsigned long test_size=2<<2;
148 const unsigned short loops_for_conv=1;
150 const double perc_conv_estimate=2.0;
154 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
158 char const *
const number=numbers[res%(
sizeof(numbers)/
sizeof(numbers[0]))];
159 const std::size_t sz=std::strlen(number);
160 const auto t1=std::chrono::high_resolution_clock::now();
161 for (
unsigned long i=0; i<test_size; ++i) {
162 res+=algorithm::result(number, sz);
164 const auto t2=std::chrono::high_resolution_clock::now();
165 return timed_results_t::value_type(
static_cast<
double>(test_size)*1000000/std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count());
168 BOOST_CHECK_GT(res, 0);
169 std::cout<<
typeid(algorithm).name()<<
" conversions/sec="<<timed_results.first<<std::endl;
170 #ifdef JMMCG_PERFORMANCE_TESTS
171 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
172 BOOST_CHECK(!timed_results.second);
181 BOOST_AUTO_TEST_CASE_TEMPLATE(to_string, algorithm, to_conversion_algorithms) {
182 #ifdef JMMCG_PERFORMANCE_TESTS
183 const unsigned long test_size=2<<25;
184 const unsigned short loops_for_conv=4000;
186 const unsigned long test_size=2<<2;
187 const unsigned short loops_for_conv=1;
189 const double perc_conv_estimate=5.0;
193 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
198 const auto t1=std::chrono::high_resolution_clock::now();
199 for (
unsigned long i=0; i<test_size; ++i) {
200 res+=algorithm::result(i, buff.begin(), buff.max_size());
202 const auto t2=std::chrono::high_resolution_clock::now();
203 return timed_results_t::value_type(
static_cast<
double>(test_size)*1000000/std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count());
206 BOOST_CHECK_GT(res, 0);
207 std::cout<<
typeid(algorithm).name()<<
" conversions/sec="<<timed_results.first<<std::endl;
208 #ifdef JMMCG_PERFORMANCE_TESTS
209 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
210 BOOST_CHECK(!timed_results.second);
214 BOOST_AUTO_TEST_SUITE_END()
216 BOOST_AUTO_TEST_SUITE_END()