From 464dc88c447866e2f12368f1b7a7948bf8e27b9a Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Mon, 7 Jan 2019 13:32:17 -0800 Subject: [PATCH] Improve native HTTPRequest performance --- project/src/net/curl/CURLBindings.cpp | 60 +++++++++++++------ .../backend/native/NativeHTTPRequest.hx | 4 +- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/project/src/net/curl/CURLBindings.cpp b/project/src/net/curl/CURLBindings.cpp index 7f69806a8..cfdacd414 100644 --- a/project/src/net/curl/CURLBindings.cpp +++ b/project/src/net/curl/CURLBindings.cpp @@ -46,7 +46,9 @@ namespace lime { std::map readBytes; std::map readBytesPosition; std::map readBytesRoot; + // TODO: Switch to structs std::map writeBuffers; + std::map writeBufferPosition; std::map writeBufferSize; std::map writeBytes; std::map writeBytesRoot; @@ -85,6 +87,7 @@ namespace lime { } writeBuffers.erase (handle); + writeBufferPosition.erase (handle); writeBufferSize.erase (handle); } @@ -198,6 +201,7 @@ namespace lime { } writeBuffers.erase (handle); + writeBufferPosition.erase (handle); writeBufferSize.erase (handle); } @@ -418,6 +422,7 @@ namespace lime { bytes = new Bytes (bytesValue); writeCallbacks[duphandle] = new ValuePointer (callbackValue); writeBuffers[duphandle] = NULL; + writeBufferPosition[duphandle] = 0; writeBufferSize[duphandle] = 0; writeBytes[duphandle] = bytes; writeBytesRoot[duphandle] = new ValuePointer (bytesValue); @@ -480,6 +485,7 @@ namespace lime { callbackValue = (vclosure*)writeCallbacks[handle]->Get (); writeCallbacks[duphandle] = new ValuePointer (callbackValue); writeBuffers[duphandle] = NULL; + writeBufferPosition[duphandle] = 0; writeBufferSize[duphandle] = 0; writeBytes[duphandle] = writeBytes[handle]; writeBytesRoot[duphandle] = new ValuePointer ((vobj*)writeBytes[handle]); @@ -546,9 +552,10 @@ namespace lime { if (writeBuffers.find (easy_handle) != writeBuffers.end ()) { char* buffer = writeBuffers[easy_handle]; + int position = writeBufferPosition[easy_handle]; int length = writeBufferSize[easy_handle]; - if (buffer && length > 0) { + if (buffer && position > 0) { if (writeCallbacks.find (easy_handle) != writeCallbacks.end ()) { @@ -556,11 +563,12 @@ namespace lime { ValuePointer* bytesRoot = writeBytesRoot[easy_handle]; Bytes* bytes = writeBytes[easy_handle]; - bytes->Resize (length); - memcpy ((char*)bytes->b, buffer, length); - free (buffer); - writeBuffers[easy_handle] = NULL; - writeBufferSize[easy_handle] = 0; + if (bytes->length < position) bytes->Resize (position); + memcpy ((char*)bytes->b, buffer, position); + // free (buffer); + // writeBuffers[easy_handle] = NULL; + // writeBufferSize[easy_handle] = 0; + writeBufferPosition[easy_handle] = 0; value _bytes = bytes->Value ((value)bytesRoot->Get ()); @@ -651,20 +659,22 @@ namespace lime { if (writeBuffers.find (easy_handle) != writeBuffers.end ()) { char* buffer = writeBuffers[easy_handle]; + int position = writeBufferPosition[easy_handle]; int length = writeBufferSize[easy_handle]; - if (buffer && length > 0) { + if (buffer && position > 0) { if (writeCallbacks.find (easy_handle) != writeCallbacks.end ()) { ValuePointer* writeCallback = writeCallbacks[easy_handle]; Bytes* bytes = writeBytes[easy_handle]; - bytes->Resize (length); - memcpy ((char*)bytes->b, buffer, length); - free (buffer); - writeBuffers[easy_handle] = NULL; - writeBufferSize[easy_handle] = 0; + if (bytes->length > position) bytes->Resize (position); + memcpy ((char*)bytes->b, buffer, position); + // free (buffer); + // writeBuffers[easy_handle] = NULL; + // writeBufferSize[easy_handle] = 0; + writeBufferPosition[easy_handle] = 0; curl_gc_mutex.Unlock (); length = *((int*)writeCallback->Call (bytes)); @@ -1003,6 +1013,7 @@ namespace lime { curlObjects[curl] = handle; writeBuffers[handle] = NULL; + writeBufferPosition[handle] = false; writeBufferSize[handle] = 0; curl_gc_mutex.Unlock (); @@ -1053,6 +1064,7 @@ namespace lime { curlObjects[curl] = handle; writeBuffers[handle] = NULL; + writeBufferPosition[handle] = 0; writeBufferSize[handle] = 0; curl_gc_mutex.Unlock (); @@ -1189,18 +1201,30 @@ namespace lime { if (!buffer) { - buffer = (char*)malloc (writeSize); + buffer = (char*)malloc (CURL_MAX_WRITE_SIZE); memcpy (buffer, ptr, writeSize); writeBuffers[userp] = buffer; - writeBufferSize[userp] = writeSize; + writeBufferPosition[userp] = writeSize; + writeBufferSize[userp] = CURL_MAX_WRITE_SIZE; } else { + int position = writeBufferPosition[userp]; int currentSize = writeBufferSize[userp]; - buffer = (char*)realloc (buffer, currentSize + writeSize); - memcpy (buffer + currentSize, ptr, writeSize); - writeBuffers[userp] = buffer; - writeBufferSize[userp] = currentSize + writeSize; + + if (position + writeSize > currentSize) { + + int newSize = currentSize; + while (newSize < position + writeSize) newSize += CURL_MAX_WRITE_SIZE; + + buffer = (char*)realloc (buffer, newSize); + writeBufferSize[userp] = newSize; + writeBuffers[userp] = buffer; + + } + + memcpy (buffer + position, ptr, writeSize); + writeBufferPosition[userp] = position + writeSize; } diff --git a/src/lime/_internal/backend/native/NativeHTTPRequest.hx b/src/lime/_internal/backend/native/NativeHTTPRequest.hx index f89e9ee70..705456bd7 100644 --- a/src/lime/_internal/backend/native/NativeHTTPRequest.hx +++ b/src/lime/_internal/backend/native/NativeHTTPRequest.hx @@ -323,7 +323,9 @@ class NativeHTTPRequest { if (multiTimer == null) { - multiTimer = new Timer (14); + // TODO: Reduce sleep when network is busy? + + multiTimer = new Timer (8); multiTimer.run = multiTimer_onRun; multiTimer_onRun ();