diff --git a/reference/Qtf/main.cpp b/reference/Qtf/main.cpp index 026a4cf6e..b9fecd80b 100644 --- a/reference/Qtf/main.cpp +++ b/reference/Qtf/main.cpp @@ -37,7 +37,7 @@ const char *examples[] = { "{{1:1:1|2 A1::-2 A2:: A3:: B1:: B2:: B3}}", "{{1:2 A1:: A2:: B1:: {{1:2 a1:: a2:: a1:: a2}}}}", "{{1~a30/50o Round border}}", - NULL + NULL }; GUI_APP_MAIN diff --git a/reference/StreamGetSzPtr/StreamGetSzPtr.cpp b/reference/StreamGetSzPtr/StreamGetSzPtr.cpp new file mode 100644 index 000000000..bcde5664f --- /dev/null +++ b/reference/StreamGetSzPtr/StreamGetSzPtr.cpp @@ -0,0 +1,61 @@ +#include + +using namespace Upp; + +int CountLines(Stream& s) +{ + int n = 0; + int c; + while((c = s.Get()) >= 0) + n += c == '\n'; + return n; +} + +int CountLinesOptimized(Stream& s) +{ + int n = 0; + for(;;) { + int sz; + const byte *p = s.GetSzPtr(sz); + if(sz) { + const byte *e = p + sz; + const byte *e4 = p + (sz & ~3); + while(p < e4) { + n += (p[0] == '\n' || p[1] == '\n' || p[2] == '\n' || p[3] == '\n'); + p += 4; + } + while(p < e) + n += *p++ == '\n'; + } + else { + int c = s.Get(); + if(c < 0) + return n; + n += c == '\n'; + } + } + return n; +} + +CONSOLE_APP_MAIN +{ + StdLogSetup(LOG_FILE|LOG_COUT); + + const Vector& arg = CommandLine(); + if(arg.GetCount() == 0) { + RLOG("Please provide testing file path as argument, preferably >500MB"); + return; + } + + { + RTIMESTOP("Simple"); + FileIn in(arg[0]); + RDUMP(CountLines(in)); + } + + { + RTIMESTOP("Optimized"); + FileIn in(arg[0]); + RDUMP(CountLinesOptimized(in)); + } +} diff --git a/reference/StreamGetSzPtr/StreamGetSzPtr.upp b/reference/StreamGetSzPtr/StreamGetSzPtr.upp new file mode 100644 index 000000000..989051fe9 --- /dev/null +++ b/reference/StreamGetSzPtr/StreamGetSzPtr.upp @@ -0,0 +1,11 @@ +description "Using Stream::GetSzPtr to optimize the algorithm to count lines in Stream\377"; + +uses + Core; + +file + StreamGetSzPtr.cpp; + +mainconfig + "" = "SSE2"; + diff --git a/reference/StreamGetSzPtr/init b/reference/StreamGetSzPtr/init new file mode 100644 index 000000000..c3b4a2dbc --- /dev/null +++ b/reference/StreamGetSzPtr/init @@ -0,0 +1,4 @@ +#ifndef _StreamGetSzPtr_icpp_init_stub +#define _StreamGetSzPtr_icpp_init_stub +#include "Core/init" +#endif