Avoid some allocations on the large object heap during loading.
- In MixFile, the Distinct call doesn't presize the HashSet it uses internally. As we know we will enumerate all results, create the HashSet ourselves so that is it presized correctly. - In ObjectCreator, stream the assembly when hashing rather than reading all bytes into memory. These changes avoid some allocations on the large object heap, in turn this means the GC can avoid performing unnecessary Gen 2 collections just to clear down the LOH.
This commit is contained in:
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.Cnc.FileSystem
|
||||
{
|
||||
var classicIndex = new Dictionary<string, PackageEntry>();
|
||||
var crcIndex = new Dictionary<string, PackageEntry>();
|
||||
IEnumerable<string> allPossibleFilenames = globalFilenames;
|
||||
var allPossibleFilenames = new HashSet<string>(globalFilenames);
|
||||
|
||||
// Try and find a local mix database
|
||||
var dbNameClassic = PackageEntry.HashFilename("local mix database.dat", PackageHashType.Classic);
|
||||
@@ -80,14 +80,15 @@ namespace OpenRA.Mods.Cnc.FileSystem
|
||||
using (var content = GetContent(kv.Value))
|
||||
{
|
||||
var db = new XccLocalDatabase(content);
|
||||
allPossibleFilenames = allPossibleFilenames.Concat(db.Entries);
|
||||
allPossibleFilenames.EnsureCapacity(allPossibleFilenames.Count + db.Entries.Length);
|
||||
allPossibleFilenames.UnionWith(db.Entries);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var filename in allPossibleFilenames.Distinct())
|
||||
foreach (var filename in allPossibleFilenames)
|
||||
{
|
||||
var classicHash = PackageEntry.HashFilename(filename, PackageHashType.Classic);
|
||||
var crcHash = PackageEntry.HashFilename(filename, PackageHashType.CRC32);
|
||||
@@ -237,7 +238,7 @@ namespace OpenRA.Mods.Cnc.FileSystem
|
||||
if (globalFilenames == null)
|
||||
if (context.TryOpen("global mix database.dat", out var mixDatabase))
|
||||
using (var db = new XccGlobalDatabase(mixDatabase))
|
||||
globalFilenames = db.Entries.Distinct().ToArray();
|
||||
globalFilenames = db.Entries.ToHashSet().ToArray();
|
||||
|
||||
package = new MixFile(s, filename, globalFilenames ?? Array.Empty<string>());
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user