diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 6ff98f84..28e7c121 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -8949,7 +8949,19 @@ static bool IsFrameExternalImpl( const char* filename, const char* image ) bool Worker::IsFrameExternal( StringIdx filename, StringIdx image ) { - return IsFrameExternalImpl( GetString( filename ), image.Active() ? GetString( image ) : nullptr ); + const auto key = ( uint64_t( filename.Raw() ) << 32 ) | image.Raw(); + + { + std::shared_lock lock( m_isExternalCacheLock ); + auto it = m_isExternalCache.find( key ); + if( it != m_isExternalCache.end() ) return it->second; + } + + const auto res = IsFrameExternalImpl( GetString( filename ), image.Active() ? GetString( image ) : nullptr ); + + std::lock_guard lock( m_isExternalCacheLock ); + m_isExternalCache.emplace( key, res ); + return res; } } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 1922ab27..653de169 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -1150,6 +1150,9 @@ private: Vector m_inlineStack; std::vector m_pendingThreadHints; + + unordered_flat_map m_isExternalCache; + std::shared_mutex m_isExternalCacheLock; }; }