首先使用COM对象慢速运行

时间:2014-02-11 00:57:46

标签: c# .net performance com

我正在使用具有后期绑定功能的Photoshop COM对象与Photoshop进行通信。但是第一次运行我的应用程序时,非常很慢!作为测试,我删除了后期绑定,并使用以下内容实例化新的COM对象:

m_Application = new Photoshop.Application(); 
m_MakeActiveActionDescriptor = new Photoshop.ActionDescriptor();

首次运行需要大约4500毫秒来覆盖我的所有图层,第二次只需要大约1000毫秒。

由于CLR启动,我读过忽略应用程序的第一次运行,但是用户可能只运行一次我的程序。 (C# object creation much slower than constructor callIs CLR loaded and initialized everytime,when a new managed application is loaded?)我也不知道这是否真的适用于这种情况,因为我从来没有看到这样的减速只是从CLR启动的第一次运行。我试过配置我的代码,看起来它是COM对象减慢它。

First and second run profiler

MakeActiveByIndex(),Initialize()和GetLayerType()所有这三个都与COM对象一起使用,并且在第一次运行时似乎要慢得多。创建COM对象非常快,大约5-10ms,似乎调用它们的方法是缓慢的部分。 (InvokeMember,CreateInstanceSlow)

private void MakeActiveByIndex(int index, bool visible)
{
    var refe = new Photoshop.ActionReference(); //This needs to be a new object everytime I call this method. 
    refe.PutIndex(m_Application.CharIDToTypeID("Lyr "), index);
    m_MakeActiveActionDescriptor.PutReference(m_Application.CharIDToTypeID("null"), refe);
    m_MakeActiveActionDescriptor.PutBoolean(m_Application.CharIDToTypeID("MkVs"), visible);
    m_Application.ExecuteAction(m_Application.CharIDToTypeID("slct"), m_MakeActiveActionDescriptor, ps.PsDialogModes.psDisplayNoDialogs);
}

enter image description here

我在发布模式下在VS之外运行我的应用程序。

我能做些什么来第一次加速吗?谢谢!

编辑:

正常循环:

for (int i = 0; i < groups.Count; i++)
{
    Console.WriteLine(i);
    MakeActiveByIndex(groups[i], false, app);

    activeLayer = activeDocument.ActiveLayer;

    Console.WriteLine(activeLayer.Name);
}

并行:

Parallel.For(0, groups.Count, i =>
{
    Console.WriteLine(i);
    MakeActiveByIndex(groups[i], false, app);

    activeLayer = activeDocument.ActiveLayer;

    Console.WriteLine(activeLayer.Name);

});

0 个答案:

没有答案