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;
|
||||||
|
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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user