値/メタデータは部分的にキャッシュされる可能性がありますが、いくつかのパフォーマンス テストを実行すると、呼び出しが行われるたびに何らかのルックアップが実行されることが示さGetExportedValue
れます。したがって、値を取得する必要がある呼び出しが多数ある場合は、キャッシュを自分で行う必要があります。
namespace MEFCachingTest
{
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.Diagnostics;
using System.Reflection;
public static class Program
{
public static CompositionContainer Container { get; set; }
public static ComposablePartCatalog Catalog { get; set; }
public static ExportedClass NonCachedClass
{
get
{
return Container.GetExportedValue<ExportedClass>();
}
}
private static ExportedClass cachedClass;
public static ExportedClass CachedClass
{
get
{
return cachedClass ?? (cachedClass = Container.GetExportedValue<ExportedClass>());
}
}
public static void Main()
{
Catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
Container = new CompositionContainer(Catalog);
const int Runs = 1000000;
var stopwatch = new Stopwatch();
// Non-Cached.
stopwatch.Start();
for (int i = 0; i < Runs; i++)
{
var ncc = NonCachedClass;
}
stopwatch.Stop();
Console.WriteLine("Non-Cached: Time: {0}", stopwatch.Elapsed);
// Cached.
stopwatch.Restart();
for (int i = 0; i < Runs; i++)
{
var cc = CachedClass;
}
stopwatch.Stop();
Console.WriteLine(" Cached: Time: {0}", stopwatch.Elapsed);
}
}
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class ExportedClass
{
}
}
その他のバリエーションについては、この要旨をご覧ください: https://gist.github.com/DanielRose/d79f0da2ef61591176ce
私のコンピューターでは、Windows 7 x64、.NET 4.5.2:
Non-Cached: Time: 00:00:02.1217811
Cached: Time: 00:00:00.0063479
NuGet から MEF 2 を使用する:
Non-Cached: Time: 00:00:00.2037812
Cached: Time: 00:00:00.0023358
私が働いている実際のアプリケーションでは、これによりアプリケーションが 6 倍遅くなりました。