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

View File

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