# HG changeset patch # User Sebastien Jodogne # Date 1559317102 -7200 # Node ID f5abf0b4211a55bdfa28139b3f9c35e480ca00d2 # Parent 76e517d2e30066f3b5d370e6f02d89e4964d4c83 trying to speed up multipart parsing diff -r 76e517d2e300 -r f5abf0b4211a UnitTestsSources/UnitTestsMain.cpp --- a/UnitTestsSources/UnitTestsMain.cpp Fri May 10 12:23:49 2019 +0200 +++ b/UnitTestsSources/UnitTestsMain.cpp Fri May 31 17:38:22 2019 +0200 @@ -59,6 +59,93 @@ } + +#include +#include +#include +#include +#include +#include + +TEST(Multipart, Optimization) +{ + std::string separator = Orthanc::Toolbox::GenerateUuid(); + + std::string corpus; + + { + std::string f; + f.resize(512*512*2); + for (size_t i = 0; i < f.size(); i++) + f[i] = i % 256; + + Orthanc::ChunkedBuffer buffer; + + for (size_t i = 0; i < 100; i++) + { + std::string s = "--" + separator + "\r\n\r\n\r\n"; + + if (i != 0) + s = "\r\n" + s; + + buffer.AddChunk(s); + buffer.AddChunk(f); + } + + buffer.AddChunk("\r\n--" + separator + "--"); + buffer.Flatten(corpus); + } + + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + + { + std::vector items; + OrthancPlugins::ParseMultipartBody(items, corpus.c_str(), corpus.size(), separator); + printf(">> %d\n", (int) items.size()); + } + + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + + printf("Parsing 1: %d ms\n", (int) (end - start).total_milliseconds()); + + start = boost::posix_time::microsec_clock::local_time(); + + { + std::string pattern("--" + separator + "\r\n"); + + boost::algorithm::boyer_moore + search(pattern.begin(), pattern.end()); + +#if BOOST_VERSION >= 106200 + std::string::iterator it = search(corpus.begin(), corpus.end()).first; +#else + std::string::iterator it = search(corpus.begin(), corpus.end()); +#endif + + unsigned int c = 0; + while (it != corpus.end()) + { + std::string t(it, it + pattern.size()); + printf("[%s]\n", t.c_str()); + + c++; + +#if BOOST_VERSION >= 106200 + it = search(std::next(it, pattern.size()), corpus.end()).first; +#else + it = search(std::next(it, pattern.size()), corpus.end()); +#endif + } + + printf("count: %d\n", c); + } + + end = boost::posix_time::microsec_clock::local_time(); + + printf("Parsing 2: %d ms\n", (int) (end - start).total_milliseconds()); +} + + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv);