in reply to Re^6: Risque Romantic Rosetta Roman Race - All in One
in thread Risque Romantic Rosetta Roman Race
> be deemed acceptable by marioroy
Yikes! I'm a rookie when it comes to C++ and simply here for the fun and learning.
> Am I missing something?
There's no reason to confirm to fixed length, IMO. I gutted the fixed-length code. It runs faster, completing in 0.490 seconds.
C++ Results:
# 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 | ck +sum 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
Perl Results:
# 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
Updated on May 19, 2023
// 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 <cctype> #include <cstring> #include <string> #include <numeric> #include <chrono> #include <thread> #include <iostream> #include <iomanip> // See [id://11149504] for more info on the fast_io C++ library #include <fast_io.h> #include <fast_io_legacy.h> // --------------------------------------------------------------- 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<milliseconds>(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()+loade +r.size()}; first<last; ) { auto start_ptr{first}; first = fast_io::find_lf(first, last); auto end_ptr{first}; int dec = roman_to_dec(std::string_view(start_ptr, end_ptr - +start_ptr)); fast_io::io::println(dec); ++first; } #else fast_io::filebuf_file fbf(fname, fast_io::open_mode::in | fast_i +o::open_mode::follow); for (std::string line; fast_io::io::scan<true>(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::fix +ed); 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; }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^8: Risque Romantic Rosetta Roman Race - All in One
by eyepopslikeamosquito (Archbishop) on May 16, 2023 at 00:36 UTC | |
by marioroy (Prior) on May 16, 2023 at 02:05 UTC | |
by marioroy (Prior) on May 16, 2023 at 13:39 UTC | |
by marioroy (Prior) on May 19, 2023 at 13:31 UTC | |
by marioroy (Prior) on May 29, 2023 at 14:23 UTC | |
by marioroy (Prior) on May 19, 2023 at 17:04 UTC |