Visio中的VBA与C#速度测试

Visio中的VBA与C#速度测试,c#,vba,visio,C#,Vba,Visio,我想知道是否有人对如何在C#中加速Visio项目的自动化有什么建议。我拥有的自动化设备是建造厕所隔间。我最终选择制作10个摊位,VBA制作所有形状大约需要3秒钟 我刚刚使用Microsoft.Office.Interop.Visio库将VBA转换成c#Form应用程序。做同样的测试需要14秒 通过使visio应用程序不可见,然后在完成后使其可见,我可以缩短3秒钟,但这与VBA的功能还相差甚远 我注意到,使用C#我可以看到visio绘制的每个形状的建筑本身,而在VBA中却看不到。所以我也试着使用:

我想知道是否有人对如何在C#中加速Visio项目的自动化有什么建议。我拥有的自动化设备是建造厕所隔间。我最终选择制作10个摊位,VBA制作所有形状大约需要3秒钟

我刚刚使用Microsoft.Office.Interop.Visio库将VBA转换成c#Form应用程序。做同样的测试需要14秒

通过使visio应用程序不可见,然后在完成后使其可见,我可以缩短3秒钟,但这与VBA的功能还相差甚远

我注意到,使用C#我可以看到visio绘制的每个形状的建筑本身,而在VBA中却看不到。所以我也试着使用:“Application.screenupdate”。在c#中,它需要一个短的数据类型,所以要使其为假,我尝试将其设为0,但它什么也没做。我还尝试在VBA中使用“True”打开它,但没有打开


那么,还有更多更快的技巧吗?我很惊讶VBA比C#快(可能是因为它内置在办公套件中)。

首先,你无法在最好的方面击败VBA。。。正如Hans Passant所写的,您在互操作方面有很多漏洞。特别是如果是进程外调用,这将比进程内VBA调用慢很多倍。 Addin将提供帮助(代码将在进程中运行),但VBA仍将更快,因为您仍然具有互操作(假设dotnet加载项-Visio是本机应用程序,那么无论如何您都将具有COM互操作)

选项一是在vba中执行。大多数人选择它。意味着您忘记了c#和windows窗体应用程序

选项二是最小化互操作(最小化Visio调用的数量)。 还有,这里有一些提示

不过,其中大多数都适用于vba和c。无论如何,你都不会打败vba,即使你遵循了所有这些原则。请注意,如果遵循它们,则可以使VBA代码更快


还有一个选项是在不使用Visio的情况下生成Visio文件(作为open xml)。有了它,您可以击败VBA性能。但是您需要编写的代码量可能是VBA的20倍,您需要了解一些visio间隔

在Visio进程中运行的代码是无与伦比的。Winforms项目总是会受到必须跨越进程边界和需要两个线程上下文切换的基本成本的影响。由于这种开销,一个非常简单的属性getter的运行速度大约要慢10000x。当interop成员强壮时,伤害会小得多。您必须创建外接程序才能创建可比较的代码。这不是VBA问题。请删除VBA标记。如果以编程方式删除母版,则可以使用dropmany命令,这样可以节省大量时间。如果你现在只是在画几何图形,你可能需要创造性地使用master。谢谢你的解释。这是有道理的。是的,我考虑过xml,但那将是一场噩梦。这场表演比我的经理更让我烦恼,他实际上很喜欢看它自己发展。如果这成为一个大问题,我将只使用c#中的函数来调用vba方法。使用c#的原因是为了使我们公司的软件更易于阅读和使用。谢谢你的链接!