Cache IsFrameExternal() queries.

This commit is contained in:
Bartosz Taudul
2026-05-14 19:33:43 +02:00
parent b90e44a5f1
commit 0dfd7fb20b
2 changed files with 16 additions and 1 deletions

View File

@@ -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;
}
}

View File

@@ -1150,6 +1150,9 @@ private:
Vector<InlineStackData> m_inlineStack;
std::vector<uint32_t> m_pendingThreadHints;
unordered_flat_map<uint64_t, bool> m_isExternalCache;
std::shared_mutex m_isExternalCacheLock;
};
}