Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么代码大小对JIT编译很重要?_C#_Performance_Assembly_Jit - Fatal编程技术网

C# 为什么代码大小对JIT编译很重要?

C# 为什么代码大小对JIT编译很重要?,c#,performance,assembly,jit,C#,Performance,Assembly,Jit,假设您正在使用JIT编译语言进行开发。就生成的程序集的代码大小而言,使函数变得非常大是否会降低性能 我问这个问题是因为前几天我在看C语言的源代码,这显然是一种对性能非常敏感的方法。似乎他们使用了一个大的switch语句来专门化函数的所有字节计数假设为x86 获取1和解码2指令不是免费的 与数据缓存类似,CPU具有代码缓存;但它通常较小,从8千磅到32千磅不等。 更短的代码更适合I-cache,需要更少的内存回迁 然而,抓人只是故事的一半。 x86在解码方面历来存在问题,因为它的(非常)可变长度指

假设您正在使用JIT编译语言进行开发。就生成的程序集的代码大小而言,使函数变得非常大是否会降低性能

我问这个问题是因为前几天我在看C语言的源代码,这显然是一种对性能非常敏感的方法。似乎他们使用了一个大的
switch
语句来专门化函数的所有字节计数假设为x86

获取1和解码2指令不是免费的

与数据缓存类似,CPU具有代码缓存;但它通常较小,从8千磅到32千磅不等。
更短的代码更适合I-cache,需要更少的内存回迁

然而,抓人只是故事的一半。
x86在解码方面历来存在问题,因为它的(非常)可变长度指令。 为了达到快速解码,有各种各样的模式需要遵循,也有各种工作限制

由于Core2体系结构,CPU具有位于解码器3之后的其他指令缓存。
这些缓存保存已解码的指令,绕过了前一阶段的限制和延迟

为了想个主意,我画了哈斯韦尔解码单元4:

每个箭头都是数据路径中的一个步骤,通常需要一个时钟。
深色阴影区域是可以找到指令的地方

缓存越靠近无序的core5,即位于底部,则所述缓存中的指令到达core5的速度越快。
然而,缓存越近,它就越小,因此减少代码大小可以提高性能,特别是对于关键循环6。


我在分析的基础上得出这些结论


1从记忆中读取的行为。
2将指令转换为微操作的操作。
3个用于Core2的预解码器,但仍然是。
彼得,欢迎你指出错误:)。
5 CPU中有效执行指令的部分。

6个循环意味着要经常执行。

通常将.NET中的大型开关编译为跳转表(int开关的情况肯定是这样),虽然编译需要更长的时间,但该方法的执行速度会更快(例如,与使用多个if语句相比)。我不能对这些函数的细节发表评论,但将其与C进行比较是不值得的,优化的C将在性能方面粉碎.NET,我敢说任何等效函数。@starlight54感谢您的输入。我知道代码会编译成一个跳转表(我可以在
jmprax
上看到它)。一般来说,我只是想问,对于任何语言,保持代码大小较小的目的是什么(特别是对于JIT编译的代码,因为生成的代码从未真正持久化到磁盘)。我个人从未听说过任何情况下,实际代码字符数是一个需要解决的问题。我认为减少代码的主要原因是没有浪费时间编写不必要的字符、“代码越少,bug就越少”(虽然我对这一点不太确定:D)和可读性(但这两种情况都会下降)。代码大小对缓存效率很重要。但是只执行代码,而很多代码都不执行。实际上,len参数不是一个随机数,只是从另一个角度补充一下。JIT是一个编译器。所以它需要一些时间,即使是简短的代码,编译也不是件小事。如果JIT必须处理30或130行C#,那么它就没有那么重要了,130行的速度会慢一些,但是与不编译相比,这两种情况下都会产生巨大的影响,差别并不重要。对于JIT,您可能会遇到一些生成的源,我看到了一些问题,其中C++生成的代码几乎是1MIB大,这使得C++编译器失败。JIT肯定也会阻塞。@Ped7g我实际上编辑了有关JIT编译开销的部分。我读了更多关于这个项目的内容,他们似乎使用了一个名为的工具来将代码预jit到本机图像,因为BCL太大了。所有这些都是在应用程序实际运行之前完成的,因此对于大型方法没有额外的成本(jit方面)。