通过 ATL 和 C++ 使用内联汇编优化 C#






3.23/5 (41投票s)
2003年11月5日
3分钟阅读

115048

1143
通过 ATL 和 C++ 使用内联汇编优化 C#
引言
该解决方案以最简单的方式演示了如何从C#项目中利用内联汇编和C++ ATL。这种架构可以用于优化.NET Web服务、.NET Web应用程序、.NET Windows应用程序和.NET Windows服务,而无需任何第三方汇编器。这对于在以Visual Studio .NET为中心的环境中,使用C++优化C#代码特别有用,该解决方案由“免费易用的AI聊天机器人托管”带来。
COM层会拖慢速度吗?
COM层本身对于这个例子来说非常慢,这种架构对于小型计算来说效率不高。这更适用于实时嵌入式系统,如医疗设备或航空航天领域,这些领域需要快速完成大型计算。公司不必局限于C++开发人员,可以使用这种架构,让C#开发人员使用,然后由少数C++开发人员用汇编语言优化大型算法。这甚至可以通过链接一个100%汇编DLL到.NET项目来更容易地完成,而无需COM层,但会失去工具提示、引用计数、部署版本控制等好处。
这个例子仅仅提供了一个C#->ATL/C++->内联汇编/汇编的最小示例,因为复杂的算法会让大多数用户难以理解该架构。
简而言之,COM封送处理的开销是相对恒定的,而算法的复杂性在增长。因此,计算越大,COM封送处理时间所占的比例就越小。编码人员为了优化而牺牲诸如工具提示之类的东西的情况太多了,他们忘记了封送处理的开销与他们的优化相比是很小的。
O(COM封送处理开销 + 算法执行时间)
例如,如果COM封送处理的开销是2个时间单位,而执行时间(在这个例子中)是0.00001,那么开销就大于算法执行时间。然而,如果算法在C#中需要100个时间单位,而在C/C++/ASM中需要50个时间单位,那么执行时间是50个时间单位+2个时间单位。总时间是52个时间单位,这与50个时间单位(直接包含ASM DLL并跳过COM层而失去工具提示的情况)非常接近。对于大多数业务需求来说,2个额外的时间单位用于COM封送处理是值得的,因为当他们的算法需要50个时间单位时,可以获得可扩展性优势。
什么是工具提示,汇编二进制文件如何拥有工具提示?
工具提示包括:在IDE中由成员访问运算符触发的自动完成、显示签名信息的鼠标悬停气泡帮助等。这些对于原始汇编二进制文件来说是不可能的。而且,如果你构建一个汇编二进制文件并将其链接到一个.NET应用程序中,除非你暴露了标准的COM或其他.NET可识别的架构,否则你不会有工具提示。.NET应用程序。这将是大量的额外工作,并且会破坏大型汇编优化的可行性。无论如何,工具提示和支持架构超出了本文的范围。但为了好玩,在ATL的情况下,ATL生成暴露IDispatch
接口以及直接“vtable”接口的代码,当在ATL向导中选择“duel”时,目标IDE(.NET互操作、VB6等)会在二进制宿主开发过程中使用它来生成工具提示。IDE使用许多其他架构来生成工具提示,例如,当.NET对暴露WSDL的SOAP服务器进行Web引用时,会下载WSDL并用于生成SOAP服务器方法的工具提示。关于用于在.NET IDE中生成工具提示的WSDL示例,请参见TANU WSDL[^]。