PERF: Collect extension modification dates in parallel

Lots of file I/O, runs faster in parallel.

--HG--
branch : 1.x
This commit is contained in:
Renaud Paquay
2011-06-02 10:35:05 -07:00
parent 53f84b3cbc
commit ea11dbf606
2 changed files with 15 additions and 14 deletions

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -192,15 +193,19 @@ namespace Orchard.Environment.Extensions {
var previousDependencies = _dependenciesFolder.LoadDescriptors().ToList(); var previousDependencies = _dependenciesFolder.LoadDescriptors().ToList();
var virtualPathModficationDates = new Dictionary<string, DateTime>(StringComparer.OrdinalIgnoreCase); var virtualPathModficationDates = new ConcurrentDictionary<string, DateTime>(StringComparer.OrdinalIgnoreCase);
Logger.Information("Probing extensions"); Logger.Information("Probing extensions");
var availableExtensionsProbes = _parallelCacheContext var availableExtensionsProbes1 = _parallelCacheContext
.RunInParallel(availableExtensions, extension => .RunInParallel(availableExtensions, extension =>
_loaders.Select(loader => loader.Probe(extension)).Where(entry => entry != null).ToArray()) _loaders.Select(loader => loader.Probe(extension)).Where(entry => entry != null).ToArray())
.SelectMany(entries => entries) .SelectMany(entries => entries)
.GroupBy(entry => entry.Descriptor.Id) .GroupBy(entry => entry.Descriptor.Id);
.ToDictionary(g => g.Key, g => SortExtensionProbeEntries(g, virtualPathModficationDates), StringComparer.OrdinalIgnoreCase);
var availableExtensionsProbes = _parallelCacheContext
.RunInParallel(availableExtensionsProbes1, g =>
new { Id = g.Key, Entries = SortExtensionProbeEntries(g, virtualPathModficationDates)})
.ToDictionary(g => g.Id, g => g.Entries, StringComparer.OrdinalIgnoreCase);
Logger.Information("Done probing extensions"); Logger.Information("Done probing extensions");
var deletedDependencies = previousDependencies var deletedDependencies = previousDependencies
@@ -241,14 +246,14 @@ namespace Orchard.Environment.Extensions {
}; };
} }
private IEnumerable<ExtensionProbeEntry> SortExtensionProbeEntries(IEnumerable<ExtensionProbeEntry> entries, Dictionary<string, DateTime> virtualPathModficationDates) { private IEnumerable<ExtensionProbeEntry> SortExtensionProbeEntries(IEnumerable<ExtensionProbeEntry> entries, ConcurrentDictionary<string, DateTime> virtualPathModficationDates) {
return entries return entries
.OrderByDescending(probe => GetVirtualPathDepedenciesModificationTimeUtc(virtualPathModficationDates, probe)) .OrderByDescending(probe => GetVirtualPathDepedenciesModificationTimeUtc(virtualPathModficationDates, probe))
.ThenBy(probe => probe.Loader.Order) .ThenBy(probe => probe.Loader.Order)
.ToList(); .ToList();
} }
private DateTime GetVirtualPathDepedenciesModificationTimeUtc(IDictionary<string, DateTime> virtualPathDependencies, ExtensionProbeEntry probe) { private DateTime GetVirtualPathDepedenciesModificationTimeUtc(ConcurrentDictionary<string, DateTime> virtualPathDependencies, ExtensionProbeEntry probe) {
if (!probe.VirtualPathDependencies.Any()) if (!probe.VirtualPathDependencies.Any())
return DateTime.MinValue; return DateTime.MinValue;
@@ -260,13 +265,8 @@ namespace Orchard.Environment.Extensions {
return result; return result;
} }
private DateTime GetVirtualPathModificationTimeUtc(IDictionary<string, DateTime> virtualPathDependencies, string path) { private DateTime GetVirtualPathModificationTimeUtc(ConcurrentDictionary<string, DateTime> virtualPathDependencies, string path) {
DateTime dateTime; return virtualPathDependencies.GetOrAdd(path, p => _virtualPathProvider.GetFileLastWriteTimeUtc(p));
if (!virtualPathDependencies.TryGetValue(path, out dateTime)) {
dateTime = _virtualPathProvider.GetFileLastWriteTimeUtc(path);
virtualPathDependencies.Add(path, dateTime);
}
return dateTime;
} }
IEnumerable<DependencyReferenceDescriptor> ProcessExtensionReferences(ExtensionLoadingContext context, ExtensionProbeEntry activatedExtension) { IEnumerable<DependencyReferenceDescriptor> ProcessExtensionReferences(ExtensionLoadingContext context, ExtensionProbeEntry activatedExtension) {

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Orchard.Environment.Extensions.Loaders; using Orchard.Environment.Extensions.Loaders;
@@ -28,7 +29,7 @@ namespace Orchard.Environment.Extensions {
/// <summary> /// <summary>
/// Keep track of modification date of files (VirtualPath => DateTime) /// Keep track of modification date of files (VirtualPath => DateTime)
/// </summary> /// </summary>
public IDictionary<string, DateTime> VirtualPathModficationDates { get; set; } public ConcurrentDictionary<string, DateTime> VirtualPathModficationDates { get; set; }
/// <summary> /// <summary>
/// List of extensions (modules) present in the system /// List of extensions (modules) present in the system