PERF: Extension loader probing performed in parallel

--HG--
branch : 1.x
This commit is contained in:
Renaud Paquay
2011-05-30 22:55:44 -07:00
parent 7122000ae0
commit f04e67d151
2 changed files with 18 additions and 8 deletions

View File

@@ -20,6 +20,7 @@ namespace Orchard.Environment.Extensions {
private readonly IVirtualPathMonitor _virtualPathMonitor;
private readonly IEnumerable<IExtensionLoader> _loaders;
private readonly IHostEnvironment _hostEnvironment;
private readonly IParallelCacheContext _parallelCacheContext;
private readonly IBuildManager _buildManager;
public ExtensionLoaderCoordinator(
@@ -30,6 +31,7 @@ namespace Orchard.Environment.Extensions {
IVirtualPathMonitor virtualPathMonitor,
IEnumerable<IExtensionLoader> loaders,
IHostEnvironment hostEnvironment,
IParallelCacheContext parallelCacheContext,
IBuildManager buildManager) {
_dependenciesFolder = dependenciesFolder;
@@ -39,6 +41,7 @@ namespace Orchard.Environment.Extensions {
_virtualPathMonitor = virtualPathMonitor;
_loaders = loaders.OrderBy(l => l.Order);
_hostEnvironment = hostEnvironment;
_parallelCacheContext = parallelCacheContext;
_buildManager = buildManager;
T = NullLocalizer.Instance;
@@ -193,13 +196,13 @@ namespace Orchard.Environment.Extensions {
var previousDependencies = _dependenciesFolder.LoadDescriptors().ToList();
var virtualPathModficationDates = new Dictionary<string, DateTime>(StringComparer.OrdinalIgnoreCase);
var availableExtensionsProbes = availableExtensions.SelectMany(extension => _loaders
.Select(loader => loader.Probe(extension))
.Where(probe => probe != null))
.GroupBy(e => e.Descriptor.Id)
.ToDictionary(g => g.Key, g => g.AsEnumerable()
.OrderByDescending(probe => GetVirtualPathDepedenciesModificationTimeUtc(virtualPathModficationDates, probe))
.ThenBy(probe => probe.Loader.Order), StringComparer.OrdinalIgnoreCase);
var availableExtensionsProbes = _parallelCacheContext
.RunInParallel(availableExtensions, extension => _loaders.Select(loader => loader.Probe(extension)))
.SelectMany(entries => entries)
.Where(entry => entry != null)
.GroupBy(entry => entry.Descriptor.Id)
.ToDictionary(g => g.Key, g => SortExtensionProbeEntries(g, virtualPathModficationDates), StringComparer.OrdinalIgnoreCase);
var deletedDependencies = previousDependencies
.Where(e => !availableExtensions.Any(e2 => StringComparer.OrdinalIgnoreCase.Equals(e2.Id, e.Name)))
@@ -237,6 +240,13 @@ namespace Orchard.Environment.Extensions {
};
}
private IEnumerable<ExtensionProbeEntry> SortExtensionProbeEntries(IEnumerable<ExtensionProbeEntry> entries, Dictionary<string, DateTime> virtualPathModficationDates) {
return entries
.OrderByDescending(probe => GetVirtualPathDepedenciesModificationTimeUtc(virtualPathModficationDates, probe))
.ThenBy(probe => probe.Loader.Order)
.ToList();
}
private DateTime GetVirtualPathDepedenciesModificationTimeUtc(IDictionary<string, DateTime> virtualPathDependencies, ExtensionProbeEntry probe) {
if (!probe.VirtualPathDependencies.Any())
return DateTime.MinValue;

View File

@@ -50,7 +50,7 @@ namespace Orchard.Environment.Extensions {
/// For every extension name, the list of loaders that can potentially load
/// that extension (in order of "best-of" applicable)
/// </summary>
public IDictionary<string, IOrderedEnumerable<ExtensionProbeEntry>> AvailableExtensionsProbes { get; set; }
public IDictionary<string, IEnumerable<ExtensionProbeEntry>> AvailableExtensionsProbes { get; set; }
/// <summary>
/// For every reference name, list of potential loaders/locations