From d8cbaed29f51237ee7219e0b349807b8609f94ef Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Fri, 8 Jan 2021 09:57:23 -0800 Subject: [PATCH] Hold a conversion buffer string on the VtEngine to prevent hundreds of thousands of transient allocations as we convert things to emit them as a UTF-8 string. --- src/renderer/vt/state.cpp | 12 +++++++++--- src/renderer/vt/vtrenderer.hpp | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/renderer/vt/state.cpp b/src/renderer/vt/state.cpp index 05dab05e153..485e7dab01c 100644 --- a/src/renderer/vt/state.cpp +++ b/src/renderer/vt/state.cpp @@ -50,7 +50,10 @@ VtEngine::VtEngine(_In_ wil::unique_hfile pipe, _deferredCursorPos{ INVALID_COORDS }, _inResizeRequest{ false }, _trace{}, - _bufferLine{} + _bufferLine{}, + _buffer{}, + _formatBuffer{}, + _conversionBuffer{} { #ifndef UNIT_TESTING // When unit testing, we can instantiate a VtEngine without a pipe. @@ -146,8 +149,11 @@ VtEngine::VtEngine(_In_ wil::unique_hfile pipe, { try { - const auto converted = ConvertToA(CP_UTF8, wstr); - return _Write(converted); + // We're likely going to be converting a ton of strings, so we'll use + // a buffer string stored on this class so we don't end up alloc/freeing + // in a tight loop and wasting a bunch of time and energy on that. + ConvertToA(CP_UTF8, wstr, _conversionBuffer); + return _Write(_conversionBuffer); } CATCH_RETURN(); } diff --git a/src/renderer/vt/vtrenderer.hpp b/src/renderer/vt/vtrenderer.hpp index 25953189c3c..c093042540d 100644 --- a/src/renderer/vt/vtrenderer.hpp +++ b/src/renderer/vt/vtrenderer.hpp @@ -113,6 +113,7 @@ namespace Microsoft::Console::Render std::string _buffer; std::string _formatBuffer; + std::string _conversionBuffer; TextAttribute _lastTextAttributes;