WPF теплая производительность при запуске AppDomain (Application.RunInternal, XamlReader.LoadBaml) - PullRequest
2 голосов
/ 30 сентября 2011

У меня относительно простое приложение, но время горячего (второго и т. Д.) Запуска ужасно 3-5 секунд.Профилировщик (VS2010, CPU Sampling) показывает, что более 80% времени тратится на функции Application.RunInternal (~ 40%) и XamlRader.LoadBaml (~ 40%).

Корень проблемы заключается в том, чтоОкно создается в домене приложения не по умолчанию.Если переместить создание окна в AppDomain по умолчанию или дать неограниченный набор разрешений AppDomain, все будет работать так же быстро, как и ожидалось.


Я тестирую на:

  • Windows Seven x64
  • .Net 4.0
  • 4 ГБ ОЗУ
  • GeForce 9800GT 1 ГБ.

Я создаю AppDomain следующим образом

var permissionSet = new PermissionSet(null);

permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.SerializationFormatter | SecurityPermissionFlag.UnmanagedCode));
permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new UIPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new MediaPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new FileDialogPermission(PermissionState.Unrestricted));

var appDomainSetup =
    new AppDomainSetup
    {
        ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
        ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
        DisallowApplicationBaseProbing = false,
        DisallowBindingRedirects = true,
        DisallowCodeDownload = true,
        DisallowPublisherPolicy = true,
        LoaderOptimization = LoaderOptimization.MultiDomainHost
    };

_appDomain =
    AppDomain.CreateDomain(
        name,
        null,
        appDomainSetup,
        permissionSet,
        new[]
    {
        // a few types I need
        typeof(...).Assembly.Evidence.GetHostEvidence<StrongName>(),
    });

Поведение остается тем же, даже если я убираю XAML в пустое окно

<Window
    x:Class="Rosmurta.Extensibility.WpfUI.RosmurtaWindow"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test"
    Height="480"
    Width="640"
    WindowStyle="SingleBorderWindow">
    <Grid>
    </Grid>
</Window>

Не слишком много для анализа XamlRader.LoadBaml, но оно тратит более 30% времени запускадля пустого окна.


Я пробовал (и это не помогло)

  • Добавлениев App.config.
  • Добавление атрибута [LoaderOptimization (LoaderOptimization.MultiDomainHost)] к методу Main.
  • Добавление подписей ко всем сборкам.

Что еще можно сделать?

...