Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit b6f183c

Browse files
zivkanChristy Henriksson
authored andcommitted
Improve performance of RetrievePackageDimensions (#442)
1 parent c249e44 commit b6f183c

2 files changed

Lines changed: 39 additions & 40 deletions

File tree

src/Stats.ImportAzureCdnStatistics/Dimensions/PackageDimension.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,43 @@
66

77
namespace Stats.ImportAzureCdnStatistics
88
{
9-
public class PackageDimension
9+
public class PackageDimension : IEquatable<PackageDimension>
1010
{
1111
private static CultureInfo EnUsCulture = CultureInfo.GetCultureInfo("en-US");
1212

13+
private readonly string _comparablePackageId;
14+
private readonly int _hashCode;
15+
1316
public PackageDimension(string packageId, string packageVersion)
1417
{
1518
PackageId = packageId;
1619
PackageVersion = packageVersion;
17-
}
18-
19-
protected bool Equals(PackageDimension other)
20-
{
21-
return string.Equals(PackageId.ToLower(EnUsCulture), other.PackageId.ToLower(EnUsCulture)) && string.Equals(PackageVersion, other.PackageVersion, StringComparison.OrdinalIgnoreCase);
22-
}
20+
_comparablePackageId = packageId.ToLower(EnUsCulture);
2321

24-
public override int GetHashCode()
25-
{
2622
unchecked
2723
{
28-
return ((PackageId != null ? PackageId.ToLower(EnUsCulture).GetHashCode() : 0)*397) ^ (PackageVersion != null ? PackageVersion.GetHashCode() : 0);
24+
_hashCode = ((PackageId != null ? _comparablePackageId.GetHashCode() : 0) * 397) ^ (PackageVersion != null ? PackageVersion.GetHashCode() : 0);
2925
}
3026
}
3127

28+
public bool Equals(PackageDimension other)
29+
{
30+
if (other == null) return false;
31+
return string.Equals(_comparablePackageId, other._comparablePackageId) && string.Equals(PackageVersion, other.PackageVersion, StringComparison.OrdinalIgnoreCase);
32+
}
33+
34+
public override int GetHashCode() => _hashCode;
35+
3236
public int Id { get; set; }
3337
public string PackageId { get; }
3438
public string PackageVersion { get; }
3539

3640
public override bool Equals(object obj)
3741
{
38-
if (ReferenceEquals(null, obj)) return false;
3942
if (ReferenceEquals(this, obj)) return true;
40-
if (obj.GetType() != GetType()) return false;
41-
return Equals((PackageDimension) obj);
43+
var other = obj as PackageDimension;
44+
if (other == null) return false;
45+
return Equals(other);
4246
}
4347
}
4448
}

src/Stats.ImportAzureCdnStatistics/Warehouse.cs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal class Warehouse
2222
private readonly TimeSpan _retryDelay = TimeSpan.FromSeconds(5);
2323
private readonly ILogger _logger;
2424
private readonly ISqlConnectionFactory _statisticsDbConnectionFactory;
25-
private readonly IList<PackageDimension> _cachedPackageDimensions = new List<PackageDimension>();
25+
private readonly IDictionary<PackageDimension, PackageDimension> _cachedPackageDimensions = new Dictionary<PackageDimension, PackageDimension>();
2626
private readonly IList<ToolDimension> _cachedToolDimensions = new List<ToolDimension>();
2727
private readonly IDictionary<string, int> _cachedClientDimensions = new Dictionary<string, int>();
2828
private readonly IDictionary<string, int> _cachedPlatformDimensions = new Dictionary<string, int>();
@@ -687,26 +687,28 @@ private async Task<IReadOnlyCollection<ToolDimension>> RetrieveToolDimensions(IR
687687

688688
private async Task<IReadOnlyCollection<PackageDimension>> RetrievePackageDimensions(IReadOnlyCollection<PackageStatistics> sourceData, SqlConnection connection)
689689
{
690-
var packages = sourceData
691-
.Select(e => new PackageDimension(e.PackageId, e.PackageVersion))
692-
.Distinct()
693-
.ToList();
694-
695690
var results = new List<PackageDimension>();
696-
if (!packages.Any())
697-
{
698-
return results;
699-
}
691+
var nonCachedPackageDimensions = new List<PackageDimension>();
692+
var sourceDataPackages = new HashSet<PackageDimension>();
700693

701-
results.AddRange(_cachedPackageDimensions
702-
.Where(p1 => packages
703-
.FirstOrDefault(p2 =>
704-
string.Equals(p1.PackageId, p2.PackageId, StringComparison.OrdinalIgnoreCase)
705-
&& string.Equals(p1.PackageVersion, p2.PackageVersion, StringComparison.OrdinalIgnoreCase)) != null
706-
)
707-
);
694+
foreach (var sourceStatistics in sourceData)
695+
{
696+
var sourcePackage = new PackageDimension(sourceStatistics.PackageId, sourceStatistics.PackageVersion);
697+
if (!sourceDataPackages.Add(sourcePackage))
698+
{
699+
// This package has already been seen in the sourceData
700+
continue;
701+
}
708702

709-
var nonCachedPackageDimensions = packages.Except(results).ToList();
703+
if (_cachedPackageDimensions.TryGetValue(sourcePackage, out var cachedPackage))
704+
{
705+
results.Add(cachedPackage);
706+
}
707+
else
708+
{
709+
nonCachedPackageDimensions.Add(sourcePackage);
710+
}
711+
}
710712

711713
if (nonCachedPackageDimensions.Any())
712714
{
@@ -730,15 +732,8 @@ private async Task<IReadOnlyCollection<PackageDimension>> RetrievePackageDimensi
730732
Id = dataReader.GetInt32(0)
731733
};
732734

733-
if (!results.Contains(package))
734-
{
735-
results.Add(package);
736-
}
737-
738-
if (!_cachedPackageDimensions.Contains(package))
739-
{
740-
_cachedPackageDimensions.Add(package);
741-
}
735+
results.Add(package);
736+
_cachedPackageDimensions[package] = package;
742737
}
743738
}
744739
}

0 commit comments

Comments
 (0)