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);