【问题标题】:VBA vs C# Speed Test in VisioVisio 中的 VBA 与 C# 速度测试
【发布时间】:2018-04-07 03:41:09
【问题描述】:

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

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

通过使 visio 应用程序不可见,然后在其完成后使其可见,我已经能够起飞 3 秒,但这仍然与 VBA 所做的相距甚远。

我注意到在 C# 中我可以看到 visio 绘图以每个形状构建自己,而在 VBA 中却没有。所以我也尝试使用:“Application.ScreenUpdating”。在 c# 中,它需要一个短数据类型,所以为了使它为假,我尝试将其设为 0,但它什么也没做。我也尝试在 VBA 中使用“True”打开它,但没有打开它。

那么还有更多关于让它更快的提示吗?我很惊讶 VBA 比 C# 更快(可能是因为它内置在 Office 套件中)。

【问题讨论】:

  • 您永远无法击败在 Visio 进程内部运行的代码。 Winforms 项目总是会因必须跨越进程边界和需要两个线程上下文切换的基本成本而受到重创。由于这种开销,一个非常简单的属性 getter 的运行速度大约慢了 10,000 倍。当互操作成员很强壮时,它的伤害要小得多。您必须创建一个加载项才能创建可比较的代码。
  • 那么这不是 VBA 问题。请删除 VBA 标签。
  • 如果您以编程方式删除母版,您可以使用 dropmany 命令,这样可以节省大量时间。不过,如果您目前只是在绘制几何图形,则可能需要发挥创造力才能使用母版。

标签: c# vba visio


【解决方案1】:

首先,您无法以最好的方式击败 VBA...就像 Hans Passant 所写的那样,您在互操作方面失去了很多。特别是如果它是进程外调用,这将比进程内 VBA 调用慢很多倍。 插件会有所帮助(代码将在进程内运行),但 VBA 仍然会更快,因为您仍然具有互操作性(假设 dotnet 加载项 - Visio 是本机应用程序,因此无论如何您都将拥有 COM 互操作性)

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

选项二是最小化互操作(最小化 Visio 调用的数量)。 另外,这里有一些提示 https://blogs.msdn.microsoft.com/mailant/2004/09/22/dev-luv-visio-development-top-five-performance-tips/

尽管它们中的大多数都适用于 vba 和 c#。而且你无论如何都不会击败vba,即使你遵循所有这些。请注意,如果您遵循它们,您可以更快地编写 VBA 代码。

另一种选择是在没有 Visio 的情况下生成 Visio 文件(作为打开的 xml)。有了它,您可以击败 VBA 性能。但是你需要编写的代码量可能是 VBA 的 20 倍,而且你需要知道一些 visio 间隔。

【讨论】:

  • 感谢您的解释。这就说得通了。是的,我想到了 xml,但那将是一场噩梦。表现比我的经理更让我烦恼,他实际上很喜欢看着它自己建立。如果它成为一个大问题,我将只使用 c# 中的函数来调用 vba 方法。使用 c# 的原因是为了让我们公司的软件更具可读性和更易于使用。也感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多