我需要提到的第一件事是 .Net 代码永远不会在 VM 中运行。虽然 .Net 程序确实被编译为有点类似于 Java 的 ByteCode 的 IL,但重要的区别在于 IL 在应用程序启动之前又被编译为完全本机代码,而不是由 VM 解释。
继续进行 .Net/VB6 比较。我不能指出具体的数据,但从个人经验来看,这取决于你在做什么。
为了说明这一点,让我们考虑六个不同的基准测试应用程序,每个应用程序都有一个 vb6 和 .Net 版本。每个应用程序选择一个特定的操作,执行 100,000 次,然后记录所用的时间。请注意,这是一个思想实验:我实际上还没有看到真实应用程序的结果。但我觉得我对这两个平台的优势和劣势有所了解。
应用程序 A 进行了一些严重的 CPU 密集型运算。在这种情况下,我不得不相信这里的结果几乎是相同的。VB6 和 .Net 都编译为本机代码,因此mult
无论如何 cpu 指令都是相同的。也就是说,如果您不使用Option Strict
,您可能很快就会在任一平台上陷入困境。由于您使用了 C#(本质上总是Option Strict
),因此可以为您的 .Net 代码带来优势。
应用程序 B 出去并从数据库中检索一个值。同样,结果可能非常接近,尽管出于两个原因我不得不给 .Net 一个非常小的优势:它使用本机 sql 客户端,据说速度更快,并且它执行自动连接池之类的操作并使其更容易分解出诸如连接一次并重新使用该连接而不是重复连接之类的事情。但是,如果就代码而言,如果您将苹果与苹果进行比较,两者可能会非常接近。
应用程序 C 重复显示和隐藏表单。在这里,我不得不给 vb6 点头。它基于较旧的、不那么炫目的小部件集,坦率地说,渲染成本更低。此外,WinForms 组件并不以速度如此之快而著称。但是,差异可能并不像您想象的那么大,而且您可能也没有那么频繁地完全重绘表格。这可能是您的用户抱怨的缓慢。
应用程序 D 是基于字符串操作的,在这里我不得不向 .Net 致敬。VB6 和 .Net 都以慢速字符串操作而闻名。但是,.Net 提供了许多在 vb6 中根本不可用的工具来帮助开发人员克服缓慢的问题。也就是说,如果您不了解这些工具,那么糟糕的字符串操作选择很容易让您的应用程序陷入无用的工作。这也可能导致用户投诉。
应用程序 E 将重复地将 Xml 文档加载到内存中。同样,我不得不认为 .Net 会有优势。首先,vb 可用的所有 xml 工具充其量只是原始的。我发现它们不太可能没有得到显着改善。此外,.Net 的垃圾收集器非常聪明,可以在加载期间为其分配和释放内存。但是,我认为这里最重要的是磁盘速度,这意味着差异不会那么大。
应用程序 F 将重复启动一个 .Net 或 vb6 程序,等待它准备好(对于“准备好”的一些定义),然后关闭它。这里 vb6 可能具有优势,原因有两个。首先,.Net 必须在第一次运行时将 IL 编译为字节码。谢天谢地,这只是第一次运行。其次,.Net 应用程序还必须加载任何引用的程序集。相比之下,VB6 运行时要小得多。但是,这通常仅在您第一次在特定机器上启动应用程序时才适用,并且有一些方法可以预编译 .Net 代码。这也可能导致感知缓慢。
重要的一点是,对于所有这些应用程序,.Net 应用程序可能会占用更大的内存。由于某些原因,开发人员倾向于认为这是一个糟糕的性能特征,而实际上恰恰相反。如果您的应用程序使用更多内存,则它可能花费更少的时间进入磁盘,并且磁盘速度较慢。它可能还缓存更多,从而节省了 cpu 时间。特别是对于.Net,它会在更重要或电脑空闲时节省分配/解除分配操作。
我没有时间,但是看到有人使用今天的 Coding Horror中提到的 StopWatch 实现(至少对于 .Net 方面)来获得每一个的真正基准是很有趣的。