mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
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:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user