我正在使用具有后期绑定功能的Photoshop COM对象与Photoshop进行通信。但是第一次运行我的应用程序时,非常很慢!作为测试,我删除了后期绑定,并使用以下内容实例化新的COM对象:
m_Application = new Photoshop.Application();
m_MakeActiveActionDescriptor = new Photoshop.ActionDescriptor();
首次运行需要大约4500毫秒来覆盖我的所有图层,第二次只需要大约1000毫秒。
由于CLR启动,我读过忽略应用程序的第一次运行,但是用户可能只运行一次我的程序。 (C# object creation much slower than constructor call,Is CLR loaded and initialized everytime,when a new managed application is loaded?)我也不知道这是否真的适用于这种情况,因为我从来没有看到这样的减速只是从CLR启动的第一次运行。我试过配置我的代码,看起来它是COM对象减慢它。
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);
}
我在发布模式下在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);
});