浏览代码

Expose WS makeBuffer() to improve heap consumption

Mathieu Carbou 6 月之前
父节点
当前提交
faac6b736d
共有 2 个文件被更改,包括 33 次插入0 次删除
  1. 10 0
      examples/HighPerf/HighPerf.ino
  2. 23 0
      src/WebSerial.h

+ 10 - 0
examples/HighPerf/HighPerf.ino

@@ -56,6 +56,7 @@ void loop() {
   if (millis() - last > 50) {
 #endif
     count++;
+
     long r = random(10, 250) + 15;
     String buffer;
     buffer.reserve(r);
@@ -67,7 +68,16 @@ void loop() {
     for (int i = 0; i < r; i++) {
       buffer += dict[random(0, 62)];
     }
+
+#ifdef WSL_HIGH_PERF
+    // Using internal websocket buffer to improve memory consumption and avoid another internal copy when enqueueing the message
+    AsyncWebSocketMessageBuffer* wsBuffer = WebSerial.makeBuffer(buffer.length());
+    memmove(wsBuffer->get(), buffer.c_str(), buffer.length());
+    WebSerial.send(wsBuffer);
+#else
     WebSerial.print(buffer);
+#endif
+
     last = millis();
   }
 }

+ 23 - 0
src/WebSerial.h

@@ -114,6 +114,29 @@ class WebSerialClass : public Print {
     // The buffer is not enabled by default.
     void setBuffer(size_t initialCapacity);
 
+#ifdef WSL_HIGH_PERF
+  #ifdef ASYNCWEBSERVER_FORK_mathieucarbou
+    // Expose the internal WebSocket makeBuffer to even improve memory consumption on client-side
+    // 1. make a AsyncWebSocketMessageBuffer
+    // 2. put the data inside
+    // 3. send the buffer
+    // This method avoids a buffer copy when creating the WebSocket message
+    AsyncWebSocketMessageBuffer* makeBuffer(size_t size = 0) {
+      if (!_ws)
+        return nullptr;
+      return _ws->makeBuffer(size);
+    }
+
+    void send(AsyncWebSocketMessageBuffer* buffer) {
+      if (!_ws || !buffer)
+        return;
+      _ws->cleanupClients(WSL_MAX_WS_CLIENTS);
+      if (_ws->count())
+        _ws->textAll(buffer);
+    }
+  #endif
+#endif
+
   private:
     // Server
     AsyncWebServer *_server;