ソースを参照

Fix performance bug on lithium-mysql/fortunes. (#5335)

* Fix performance bug on lithium-mysql/fortunes.

* Fix lithium fortunes.

* Update lithium.

* Update lithium.
Matthieu Garrigues 5 年 前
コミット
274b91e109

+ 1 - 1
frameworks/C++/lithium/lithium-mysql.dockerfile

@@ -6,7 +6,7 @@ RUN apt install -yqq libboost-context-dev
 
 COPY ./ ./
 
-ENV COMMIT=5f409d2f995f8e8b1998f4e1a914a18c09109e4b
+ENV COMMIT=627220fe0264b160957048c7175f5e578c644362
 
 RUN wget https://raw.githubusercontent.com/matt-42/lithium/$COMMIT/single_headers/lithium_mysql.hh
 RUN wget https://raw.githubusercontent.com/matt-42/lithium/$COMMIT/single_headers/lithium_http_backend.hh

+ 1 - 1
frameworks/C++/lithium/lithium-postgres.dockerfile

@@ -5,7 +5,7 @@ RUN apt install -yqq g++-9 libboost-dev postgresql-server-dev-all libpq-dev wget
 
 COPY ./ ./
 
-ENV COMMIT=5f409d2f995f8e8b1998f4e1a914a18c09109e4b
+ENV COMMIT=627220fe0264b160957048c7175f5e578c644362
 
 RUN wget https://raw.githubusercontent.com/matt-42/lithium/$COMMIT/single_headers/lithium_pgsql.hh
 RUN wget https://raw.githubusercontent.com/matt-42/lithium/$COMMIT/single_headers/lithium_http_backend.hh

+ 17 - 15
frameworks/C++/lithium/lithium.cc

@@ -9,22 +9,19 @@
 #include "symbols.hh"
 using namespace li;
 
-
-std::string escape_html_entities(const std::string& data)
+template <typename B>
+void escape_html_entities(B& buffer, const std::string& data)
 {
-    std::string buffer;
-    buffer.reserve(data.size());
     for(size_t pos = 0; pos != data.size(); ++pos) {
         switch(data[pos]) {
-            case '&':  buffer.append("&amp;");       break;
-            case '\"': buffer.append("&quot;");      break;
-            case '\'': buffer.append("&apos;");      break;
-            case '<':  buffer.append("&lt;");        break;
-            case '>':  buffer.append("&gt;");        break;
-            default:   buffer.append(&data[pos], 1); break;
+            case '&':  buffer << "&amp;";       break;
+            case '\"': buffer << "&quot;";      break;
+            case '\'': buffer << "&apos;";      break;
+            case '<':  buffer << "&lt;";        break;
+            case '>':  buffer << "&gt;";        break;
+            default:   buffer << data[pos]; break;
         }
     }
-    return std::move(buffer);
 }
 
 int main(int argc, char* argv[]) {
@@ -118,15 +115,20 @@ int main(int argc, char* argv[]) {
     std::sort(table.begin(), table.end(),
               [] (const fortune& a, const fortune& b) { return a.message < b.message; });
 
-    std::stringstream ss;
-
+    char b[100000];
+    li::output_buffer ss(b, sizeof(b));
+ 
     ss << "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>";
     for(auto& f : table)
-      ss << "<tr><td>" << f.id << "</td><td>" << escape_html_entities(f.message) << "</td></tr>";
+    {
+      ss << "<tr><td>" << f.id << "</td><td>";
+      escape_html_entities(ss, f.message); 
+      ss << "</td></tr>";
+    }
     ss << "</table></body></html>";
 
     response.set_header("Content-Type", "text/html; charset=utf-8");
-    response.write(ss.str());
+    response.write(ss.to_string_view());
   };
 
   http_serve(my_api, port, s::nthreads = nprocs);