使用托管代码会降低性能(无论是轻微还是显著的),但是有什么好处呢?我知道有垃圾回收和内存管理,但即使如此,不需要这个中间层直接将源代码编译成本机代码是否更好呢?
另外(我在这里添加,因为它与问题直接相关) - 显然 Windows 10 通用应用程序使用 .NET Native 编译为本机机器代码。 我很好奇为什么以前没有所有 .NET 程序都这样做。
使用托管代码会降低性能(无论是轻微还是显著的),但是有什么好处呢?我知道有垃圾回收和内存管理,但即使如此,不需要这个中间层直接将源代码编译成本机代码是否更好呢?
另外(我在这里添加,因为它与问题直接相关) - 显然 Windows 10 通用应用程序使用 .NET Native 编译为本机机器代码。 我很好奇为什么以前没有所有 .NET 程序都这样做。
以下内容来自MSDN:
托管代码的优点
托管语言提供了一种通用的方式来处理内存管理和垃圾回收的细节,代价是一小部分的额外开销。这种权衡使你从容易出错的任务中解放出来,并让你编写更加紧凑、可读性更强、没有错误的程序。
非托管代码的优点
如果您使用非托管语言,例如C++,则必须编写额外的代码来管理内存和安全性,并在对象完成其目的后清理它们。这些琐事细节很复杂,与程序的预期功能无关,因此开发人员经常忽略这些任务、忽视它们或失去追踪。结果,非托管代码通常更昂贵、耗时更长,需要更多的程序员培训和纪律。
然而,开发人员通常更喜欢非托管代码,因为它执行速度更快,在指针的使用上更灵活,并且可以直接控制硬件。
字节码和JVM的“恶作剧”意味着代码始终以相同的方式解释,与其运行的平台无关。我模糊地记得很久以前读过,英特尔和AMD(以及其他处理器)在某些逻辑操作上有所不同,这会导致这些处理器上的不同结果,从而可能导致一些跨平台错误。因此,字节码解决了这个问题,结果始终是恒定的。
另一方面,如果您知道自己只为一个平台编程并且需要额外的性能,则嵌入式软件开发(或低级语言)就派上用场了。当您知道性能并不重要时,Java和.NET最好使用。
这是因为编译成本地代码会使您的程序特定于平台。 然而,通过编译为中间语言,您的程序是可移植的,并且可以在每个平台上运行,如果有指定的JVM / CLR平台。
Java和.Net都使用即时编译,以便它们可以提供可移植性,但与使用解释器相比,仍具有更好的性能。
此外,微软已经提供了Ngen和Visual Studio一起编译.Net代码到本机代码:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
Ngen和.Net Native之间的主要区别在于,Ngen仍然依赖于.Net Framework,而.Net Native将所需的.Net代码与程序一起编译,因此不需要安装.Net Framework。