Mercurial > hg > orthanc-dicomweb
changeset 270:f5abf0b4211a
trying to speed up multipart parsing
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 31 May 2019 17:38:22 +0200 |
parents | 76e517d2e300 |
children | 932f8d384a15 |
files | UnitTestsSources/UnitTestsMain.cpp |
diffstat | 1 files changed, 87 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <Core/ChunkedBuffer.h> +#include <Core/Toolbox.h> +#include <Core/SystemToolbox.h> +#include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/algorithm/searching/boyer_moore.hpp> +#include <boost/version.hpp> + +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<OrthancPlugins::MultipartItem> 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<std::string::const_iterator> + 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);