为什么我们可以通过在 C 代码中重新分配变量来永久避免寄存器溢出?
Why can we permanently avoid register spilling by reassigning variables in C code?
问题总结:
- 我如何知道何时在 C 代码中重新分配变量以避免寄存器溢出?答案是否取决于目标机器和编译器的 CPU 结构?
- 如果我在原始代码中添加一些新变量,我是否应该检查避免寄存器溢出的行是否仍然有用?
在CPython中发现a line trying to avoid register spilling by reassigning the variable. The change of the line can be traced to the commit是2015年创建的,很好奇线路的原理
当用户运行Python时,有很多数据和代码加载到内存或寄存器中。为什么 CPython 代码的其他部分被更改后,防止寄存器溢出的那行代码仍然有效?不断地,CPython 建立在各种 CPU 架构和不同的操作系统上。为什么commit的评论只提到了编译器的类型?
当代码生成器 运行 没有用于保存中间值和常用值的寄存器时,它会 通过写入内存来溢出寄存器 ,通常是在一个区域中从栈中分配。一般来说,这是一个低成本的操作,并且在很大程度上取决于 cpu 中的寄存器数量、提供给编译器的选项以及编译器本身的版本。
您应该努力编写清晰的代码,而不是尝试对代码生成器进行逆向工程。通常,代码生成器会通过生成非常好的代码来奖励您。当您 运行 遇到性能问题时,探查器应该会引导您找到需要重新访问的代码。通常在结构上或算法上进行改进。改进生成代码的代码技巧通常围绕着向编译器揭示信息;例如它认为是动态的值实际上是静态的,或者安排数据结构以更好地利用缓存资源。
如果您必须对代码生成器进行逆向工程,您真的还不如用机器语言重写序列——至少有一本关于机器语言的手册,因为编译器 hack 总是部落知识。你怎么知道用机器语言重写哪些位——再看看探查器。
问题总结:
- 我如何知道何时在 C 代码中重新分配变量以避免寄存器溢出?答案是否取决于目标机器和编译器的 CPU 结构?
- 如果我在原始代码中添加一些新变量,我是否应该检查避免寄存器溢出的行是否仍然有用?
在CPython中发现a line trying to avoid register spilling by reassigning the variable. The change of the line can be traced to the commit是2015年创建的,很好奇线路的原理
当用户运行Python时,有很多数据和代码加载到内存或寄存器中。为什么 CPython 代码的其他部分被更改后,防止寄存器溢出的那行代码仍然有效?不断地,CPython 建立在各种 CPU 架构和不同的操作系统上。为什么commit的评论只提到了编译器的类型?
当代码生成器 运行 没有用于保存中间值和常用值的寄存器时,它会 通过写入内存来溢出寄存器 ,通常是在一个区域中从栈中分配。一般来说,这是一个低成本的操作,并且在很大程度上取决于 cpu 中的寄存器数量、提供给编译器的选项以及编译器本身的版本。
您应该努力编写清晰的代码,而不是尝试对代码生成器进行逆向工程。通常,代码生成器会通过生成非常好的代码来奖励您。当您 运行 遇到性能问题时,探查器应该会引导您找到需要重新访问的代码。通常在结构上或算法上进行改进。改进生成代码的代码技巧通常围绕着向编译器揭示信息;例如它认为是动态的值实际上是静态的,或者安排数据结构以更好地利用缓存资源。
如果您必须对代码生成器进行逆向工程,您真的还不如用机器语言重写序列——至少有一本关于机器语言的手册,因为编译器 hack 总是部落知识。你怎么知道用机器语言重写哪些位——再看看探查器。