我们已经知道使用泛型类与非泛型类在性能方面的好处。避免强制转换给予更好的性能,但是泛型类的示例化涉及为特定类型T的泛型类发出IL代码然后JIT该代码的运行时开销。这使我得出这样的结论:我正在用启动应用程序的性能来换取以后更好的性能。此外,我想知道泛型如何与提前编译(如NGEN)一起使用。我假设泛型类不能提前编译,但非泛型类可以。如果泛型类需要JIT,而非泛型类不需要,那么这会对应用程序的启动性能造成额外的影响吗?此外,任何关于NativeAOT如何与泛型一起工作的见解或信息都将非常感谢。
cwxwcias1#
嗯,我没有证据,但我认为影响可以忽略不计。编译器(无论是在jit之前还是在jit期间)需要对同一个具体类只翻译一次。当使用泛型时,这意味着(除非应用了某些内部优化)List<string>和List<int>是两个不同的类,需要单独转换,但List<string>的多个示例是相同的类型。因此,这可能意味着启动一个使用许多不同List<T>类型的应用程序比仅包含ArrayList的应用程序需要多花一点点时间。但是在后一种情况下,所有必需的强制转换对性能的影响肯定要高得多,更不用说编译时类型安全了。如果你到处创建ListOfString和ListOfInt类型,你不会得到任何东西--它们仍然是独立的类型。
List<string>
List<int>
List<T>
ArrayList
ListOfString
ListOfInt
1条答案
按热度按时间cwxwcias1#
嗯,我没有证据,但我认为影响可以忽略不计。编译器(无论是在jit之前还是在jit期间)需要对同一个具体类只翻译一次。当使用泛型时,这意味着(除非应用了某些内部优化)
List<string>
和List<int>
是两个不同的类,需要单独转换,但List<string>
的多个示例是相同的类型。因此,这可能意味着启动一个使用许多不同
List<T>
类型的应用程序比仅包含ArrayList
的应用程序需要多花一点点时间。但是在后一种情况下,所有必需的强制转换对性能的影响肯定要高得多,更不用说编译时类型安全了。如果你到处创建ListOfString
和ListOfInt
类型,你不会得到任何东西--它们仍然是独立的类型。