# https://perlmonks.org/?node_id=11152156
$ ./rtoa-pgatram-fixed t1.txt t1.txt t1.txt t1.txt | cksum
read_input_files : 15996000 items
read file time : 0.356 secs
roman_to_dec time : 0.460 secs
output time : 0.124 secs
total time : 0.941 secs
737201628 75552000
# https://perlmonks.org/?node_id=11152177
$ NUM_THREADS=4 ./rtoa-pgatram-openmp t1.txt t1.txt t1.txt t1.txt | cksum
use OpenMP
read_input_files : 15996000 items
read file time : 0.159 secs
roman_to_dec time : 0.469 secs
total time : 0.628 secs
737201628 75552000
# https://perlmonks.org/?node_id=11152182
$ ./rtoa-pgatram-allinone t1.txt t1.txt t1.txt t1.txt | cksum
do_it_all time : 0.637 secs
737201628 75552000
# https://perlmonks.org/?node_id=11152186
$ ./rtoa-pgatram-allinone2 t1.txt t1.txt t1.txt t1.txt | cksum
do_it_all time : 0.515 secs fast_io scan, line_get
do_it_all time : 0.490 secs fast_io memory mapping
737201628 75552000
####
# https://perlmonks.org/?node_id=11152168 max_workers => 26
$ perl rtoa-pgatram-mce.pl t1.txt t1.txt t1.txt t1.txt | cksum
rtoa pgatram start
time 0.658 secs Perl on Fedora Linux 38
time 0.574 secs Perl on Clear Linux
737201628 75552000
# https://perlmonks.org/?node_id=11152168 max_workers => 32
$ perl rtoa-pgatram-mce.pl t1.txt t1.txt t1.txt t1.txt | cksum
rtoa pgatram start
time 0.548 secs Perl on Fedora Linux 38
time 0.480 secs Perl on Clear Linux
737201628 75552000
####
// rtoa-pgatram-allinone2.cpp. Crude allinone version.
// based on rtoa-pgatram-allinone.cpp https://perlmonks.org/?node_id=11152182
//
// Obtain the fast_io library (required dependency):
// git clone --depth=1 https://github.com/cppfastio/fast_io
//
// Compile with g++ or clang++:
// clang++ -o rtoa-pgatram-allinone2 -std=c++20 -Wall -O3 -I fast_io/include rtoa-pgatram-allinone2.cpp
#include
#include
#include
#include
#include
#include
#include
#include
// See [id://11149504] for more info on the fast_io C++ library
#include
#include
// ---------------------------------------------------------------
typedef std::chrono::high_resolution_clock high_resolution_clock;
typedef std::chrono::high_resolution_clock::time_point time_point;
typedef std::chrono::milliseconds milliseconds;
double elaspe_time(
time_point cend,
time_point cstart)
{
return double (
std::chrono::duration_cast(cend - cstart).count()
) * 1e-3;
}
// ---------------------------------------------------------------
// Though there are less than 256 initializers in this ascii table,
// the others are guaranteed by ANSI C to be initialized to zero.
static const int romtab[256] = {
0,0,0,0,0,0, 0, 0, 0, 0, // 00- 09
0,0,0,0,0,0, 0, 0, 0, 0, // 10- 19
0,0,0,0,0,0, 0, 0, 0, 0, // 20- 29
0,0,0,0,0,0, 0, 0, 0, 0, // 30- 39
0,0,0,0,0,0, 0, 0, 0, 0, // 40- 49
0,0,0,0,0,0, 0, 0, 0, 0, // 50- 59
0,0,0,0,0,0, 0, 100, 500, 0, // 60- 69
0,0,0,1,0,0, 50,1000, 0, 0, // 70- 79
0,0,0,0,0,0, 5, 0, 10, 0, // 80- 89
0,0,0,0,0,0, 0, 0, 0, 100, // 90- 99
500,0,0,0,0,1, 0, 0, 50,1000, // 100-109
0,0,0,0,0,0, 0, 0, 5, 0, // 110-119
10,0,0,0,0,0, 0, 0, 0, 0 // 120-129
};
// Return the arabic number for a roman letter c.
// Return zero if the roman letter c is invalid.
inline int urtoa(int c) { return romtab[c]; }
inline int accfn(int t, char c) {
return t + urtoa(c) - t % urtoa(c) * 2;
}
inline int roman_to_dec(std::string_view st) {
return std::accumulate(st.begin(), st.end(), 0, accfn);
}
// Read an input file of Roman Numerals and do it all
static void do_it_all(
std::string_view fname // in: file name containing a list of Roman Numerals
)
{
try {
#if 1
// Load entire file to memory through memory mapping.
using file_loader_type = fast_io::native_file_loader;
file_loader_type loader(fname, fast_io::open_mode::in | fast_io::open_mode::follow);
// Loop through contiguous container of the file.
for (char const *first{loader.data()}, *last{loader.data()+loader.size()}; first(fbf, fast_io::mnp::line_get(line)); ) {
fast_io::io::println(roman_to_dec(line));
}
#endif
}
catch (fast_io::error e) {
fast_io::io::perrln("Error opening '", fname, "' : ", e);
};
}
int main(int argc, char* argv[])
{
if (argc < 2) {
if (argc > 0)
std::cerr << "usage: rtoa-pgatram-allinone2 file... >out.txt\n";
return 1;
}
// Get the list of input files from the command line
int nfiles = argc - 1;
char** fname = &argv[1];
std::cerr << std::setprecision(3) << std::setiosflags(std::ios::fixed);
time_point cstartall, cendall;
cstartall = high_resolution_clock::now();
for (int i = 0; i < nfiles; ++i)
do_it_all( fname[i] );
cendall = high_resolution_clock::now();
double ctakenall = elaspe_time(cendall, cstartall);
std::cerr << "do_it_all time : " << std::setw(8) << ctakenall << " secs\n";
return 0;
}