From 55b0ecb4878e80a3cacc89437ba6c531a95ede02 Mon Sep 17 00:00:00 2001 From: Jeff Hutchinson Date: Fri, 30 Apr 2021 01:20:01 -0400 Subject: [PATCH] optimizations --- Engine/source/console/compiledEval.cpp | 43 ++++++++++++++++---------- Engine/source/console/console.cpp | 16 ++-------- Engine/source/console/console.h | 12 ++++--- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/Engine/source/console/compiledEval.cpp b/Engine/source/console/compiledEval.cpp index 4063aa3eb..4f1a197d9 100644 --- a/Engine/source/console/compiledEval.cpp +++ b/Engine/source/console/compiledEval.cpp @@ -57,6 +57,7 @@ enum EvalConstants MaxStackSize = 1024, FieldBufferSizeString = 2048, FieldBufferSizeNumeric = 128, + ConcatBufferInitialSize = 8192, MethodOnComponent = -2 }; @@ -118,6 +119,23 @@ S32 _STK = 0; char curFieldArray[256]; char prevFieldArray[256]; +const char* tsconcat(const char* strA, const char* strB, S32& outputLen) +{ + S32 lenA = dStrlen(strA); + S32 lenB = dStrlen(strB); + + S32 len = lenA + lenB + 1; + + char* concatBuffer = (char*)dMalloc(len); + + concatBuffer[len - 1] = '\0'; + memcpy(concatBuffer, strA, lenA); + memcpy(concatBuffer + lenA, strB, lenB); + + outputLen = lenA + lenB; + return concatBuffer; +} + namespace Con { // Current script file name and root, these are registered as @@ -1727,7 +1745,6 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa { if (nsEntry->mFunctionOffset) { - // TODO: not make this strings only for returns. ConsoleValue returnFromFn = nsEntry->mCode->exec(nsEntry->mFunctionOffset, fnName, nsEntry->mNamespace, callArgc, callArgv, false, nsEntry->mPackage); stack[_STK + 1] = std::move(returnFromFn); } @@ -1834,34 +1851,28 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa case OP_ADVANCE_STR_APPENDCHAR: { - // TODO: Create a better way to handle string concatination without - // heap allocating every time. - - val = stack[_STK].getString(); - dsize_t len = dStrlen(val) + 2; - char buff[2]; buff[0] = (char)code[ip++]; buff[1] = '\0'; - char* concat = new char[len]; - dMemset(concat, 0, len); - dStrcat(concat, val, len); - dStrcat(concat, buff, len); - - stack[_STK].setString(concat); - - delete[] concat; + S32 len; + const char* concat = tsconcat(stack[_STK].getString(), buff, len); + stack[_STK].setStringRef(concat, len); break; } case OP_REWIND_STR: TORQUE_CASE_FALLTHROUGH; case OP_TERMINATE_REWIND_STR: - stack[_STK - 1].setString((String(stack[_STK - 1] + String(stack[_STK])))); + { + S32 len; + const char* concat = tsconcat(stack[_STK - 1].getString(), stack[_STK].getString(), len); + + stack[_STK - 1].setStringRef(concat, len); _STK--; break; + } case OP_COMPARE_STR: stack[_STK - 1].setBool(!dStricmp(stack[_STK].getString(), stack[_STK - 1].getString())); diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index a7d2dafc6..f75285f2f 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -46,31 +46,21 @@ extern StringStack STR; extern ConsoleValueStack<4096> gCallStack; -S32 ConsoleValue::sBufferOffset = 0; char ConsoleValue::sConversionBuffer[ConversionBufferSize]; void ConsoleValue::init() { - sBufferOffset = 0; dMemset(sConversionBuffer, '\0', ConversionBufferSize); } char* ConsoleValue::convertToBuffer() const { - sBufferOffset += StringSize; - if (sBufferOffset > ConversionBufferSize) - { - dMemset(sConversionBuffer, '\0', ConversionBufferSize); - sBufferOffset = 0; - } - - char* offset = sConversionBuffer + sBufferOffset; if (type == ConsoleValueType::cvFloat) - dSprintf(offset, StringSize, "%.9g", f); + dSprintf(sConversionBuffer, ConversionBufferSize, "%.9g", f); else - dSprintf(offset, StringSize, "%lld", i); + dSprintf(sConversionBuffer, ConversionBufferSize, "%lld", i); - return offset; + return sConversionBuffer; } const char* ConsoleValue::getConsoleData() const diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index b36a7c233..f7d077ae0 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -149,12 +149,10 @@ class ConsoleValue enum Constants { - ConversionBufferSize = 1024, - StringSize = 16 + ConversionBufferSize = 32 }; static char sConversionBuffer[ConversionBufferSize]; - static S32 sBufferOffset; char* convertToBuffer() const; @@ -314,6 +312,13 @@ public: dStrcpy(s, val, static_cast(len) + 1); } + TORQUE_FORCEINLINE void setStringRef(const char* ref, S32 len) + { + cleanupData(); + type = ConsoleValueType::cvString; + s = const_cast(ref); + } + TORQUE_FORCEINLINE void setBool(const bool val) { cleanupData(); @@ -361,7 +366,6 @@ public: } static void init(); - static S32 getConstantBufferCount() { return (S32)ConversionBufferSize / StringSize; } }; // Transparently converts ConsoleValue[] to const char**