diff --git a/Makefile b/Makefile index 8be0a33..67782a7 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CXXFLAGS = -Wall -O3 -all: split1 split2 split6 split7 split8 split9 splitc1 splitc2 splitc3 split_subparser +all: split1 split2 split6 split7 split8 split9 splitc1 splitc2 splitc3 split_subparser split10 split11 split12 split7: split7.cpp | deps/strtk $(CXX) $(LDFLAGS) -Ideps/strtk/ $(CXXFLAGS) split7.cpp -o split7 @@ -12,7 +12,7 @@ split_subparser: split_subparser.cpp | deps/json_parser .PHONY: clean update-deps clean: - @rm -f split1 split2 split6 split7 split8 split9 splitc1 splitc2 splitc3 split_subparser + @rm -f split1 split2 split6 split7 split8 split9 splitc1 splitc2 splitc3 split_subparser split10 split11 split12 update-deps: deps git --git-dir=deps/strtk/.git/ --work-tree=deps/strtk/ fetch origin diff --git a/split10.cpp b/split10.cpp new file mode 100644 index 0000000..13a1968 --- /dev/null +++ b/split10.cpp @@ -0,0 +1,54 @@ +// http://stackoverflow.com/a/9379203/106471 +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +void split(vector &ret, const string& s, char delimiter=' ') +{ + ret.clear(); + for(auto itStart = s.begin(), itDelim = itStart, itEnd = s.end(); itStart < itEnd; itStart = itDelim + 1) + { + itDelim = find(itStart, itEnd, delimiter); + ret.emplace_back(string(itStart, itDelim)); + } +} + + + +int main() { + string input_line; + long count = 0; + timespec start; + clock_gettime(CLOCK_MONOTONIC, &start); + + cin.sync_with_stdio(false); //disable synchronous IO + size_t numWords = 0; + size_t numChars = 0; + + vector words; + while(getline(cin, input_line)) + { + split(words, input_line); + numWords += words.size(); + for(const auto &s:words) + numChars += s.size(); + count++; + }; + + timespec end; + clock_gettime(CLOCK_MONOTONIC, &end); + const double sec = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) * 1e-9; + cerr << "C++ : Saw " << count << " lines (" << numWords << " words/" << numChars << " chars) in " << fixed << setprecision(1) << sec << " seconds." ; + if (sec > 0) { + const double lps = count / sec; + cerr << " Crunch speed: " << fixed << setprecision(1) << lps << endl; + } else + cerr << endl; + return 0; +} diff --git a/split11.cpp b/split11.cpp new file mode 100644 index 0000000..4e991b2 --- /dev/null +++ b/split11.cpp @@ -0,0 +1,69 @@ +// http://stackoverflow.com/a/9379203/106471 +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +class StringRef +{ +private: + const char* m_itBeg; + int m_iSize; + +public: + inline int size() const { return m_iSize; } + const char* begin() { return m_itBeg; } + const char* end() const { return m_itBeg + m_iSize; } + + StringRef(const char* &beg, const char* &nd) + : m_itBeg(beg) + , m_iSize(nd - beg) + {} +}; + +int split(vector &ret, const string& s, const char delimiter = ' ') +{ + for(auto ps = &s[0], pd = ps, pe = ps + s.size(); ps < pe; ps = pd + 1) + { + ret.emplace_back(StringRef(ps, pd = find(ps, pe, delimiter))); + } + return ret.size(); +} + +int main() { + string input_line; + long count = 0; + timespec start; + clock_gettime(CLOCK_MONOTONIC, &start); + + cin.sync_with_stdio(false); //disable synchronous IO + size_t numWords = 0; + size_t numChars = 0; + + vector words; + words.reserve(100); + while(getline(cin, input_line)) + { + words.clear(); + numWords += split(words, input_line); + for(const auto &s:words) + numChars += s.size(); + count++; + }; + + timespec end; + clock_gettime(CLOCK_MONOTONIC, &end); + const double sec = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) * 1e-9; + cerr << "C++ : Saw " << count << " lines (" << numWords << " words/" << numChars << " chars) in " << fixed << setprecision(1) << sec << " seconds." ; + if (sec > 0) { + const double lps = count / sec; + cerr << " Crunch speed: " << fixed << setprecision(1) << lps << endl; + } else + cerr << endl; + return 0; +} diff --git a/split12.cpp b/split12.cpp new file mode 100644 index 0000000..22a4bb0 --- /dev/null +++ b/split12.cpp @@ -0,0 +1,72 @@ +// http://stackoverflow.com/a/9379203/106471 +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +class StringRef +{ +private: + const char* m_itBeg; + int m_iSize; + +public: + inline int size() const { return m_iSize; } + const char* begin() { return m_itBeg; } + const char* end() const { return m_itBeg + m_iSize; } + + StringRef(const char* &beg, const char* &nd) + : m_itBeg(beg) + , m_iSize(nd - beg) + {} +}; + +int split(vector &ret, const string& s, const char delimiter = ' ') +{ + auto ps = &s[0], pd = ps, pe = ps + s.size(); + for(;pd; ps = pd + 1) + { + pd = (const char *)memchr(ps, delimiter, pe - ps); + ret.emplace_back(StringRef(ps, pd ? pd : pe)); + } + return ret.size(); +} + +int main() { + string input_line; + long count = 0; + timespec start; + clock_gettime(CLOCK_MONOTONIC, &start); + + cin.sync_with_stdio(false); //disable synchronous IO + size_t numWords = 0; + size_t numChars = 0; + + vector words; + words.reserve(100); + while(getline(cin, input_line)) + { + words.clear(); + numWords += split(words, input_line); + for(const auto &s:words) + numChars += s.size(); + count++; + }; + + timespec end; + clock_gettime(CLOCK_MONOTONIC, &end); + const double sec = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) * 1e-9; + cerr << "C++ : Saw " << count << " lines (" << numWords << " words/" << numChars << " chars) in " << fixed << setprecision(1) << sec << " seconds." ; + if (sec > 0) { + const double lps = count / sec; + cerr << " Crunch speed: " << fixed << setprecision(1) << lps << endl; + } else + cerr << endl; + return 0; +}