Golang
文章平均质量分 96
Go语言及其编译器相关技术记录
yelvens
我很懒,什么都没留下…
展开
-
Golang编译优化——稀疏条件常量传播
常量传播(constant propagation)是一种转换,对于给定的关于某个变量xxx和一个常量ccc的赋值x←cx←c,这种转换用ccc来替代以后出现的xxx的引用,只要在这期间没有出现另外改变xxx值的赋值。如下图a的CFG所示,基本块B1中的指令b←3b←3将常量3赋给bbb,并且CFG中没有其他对bbb的赋值。图b是对图a做常量传播的结果,此时bbb。原创 2024-05-08 18:10:26 · 1127 阅读 · 3 评论 -
Golang编译优化——公共子表达式消除
公共子表达式消除(Common Subexpression Elimination,CSE)也有书上称为冗余表达式消除,旨在减少程序中重复计算相同表达式的次数,从而提高程序的执行效率。在程序中,如果同一个表达式在不同的地方多次出现并且具有相同的输入,则这个表达式就是一个公共子表达式。公共子表达式消除的目标是识别这些重复的表达式,并将它们计算一次,然后在需要时重用结果,而不是每次都重新计算。在这个例子中,表达式b + c在两个地方都出现了,它是一个公共子表达式。如果程序执行这两个语句,那么每次都重新计算。原创 2024-04-24 17:11:32 · 1168 阅读 · 1 评论 -
Golang编译优化——死代码删除
b *Blocki int死代码删除的在deadcode函数中实现,对于一个函数f,删除其死代码的过程如下:首先检查函数f是否经过寄存器分配(regalloc)。如果已经经过寄存器分配,那么无法进行死代码删除,因为寄存器分配可能生成多余的 SSA 代码,会导致一些必需的移动操作被消除。调用,找到函数f中可达的基本块,将其放入数组reachable。删除从不可达块到可达块的边,确保不会有从死代码到活跃代码的控制流传播。原创 2024-04-18 19:41:01 · 971 阅读 · 0 评论 -
Golang编译优化——复制传播
以下是Go编译器对某个代码段编译生成的SSA IR摘选,对于Golang SSA IR的介绍我写了文章,但是在犹豫要不要发。编译器在中间代码生成和优化阶段,不可避免的会生成一些非必要的指令,如上面b3块中的。消除Copy指令的操作会遍历所有IR,迭代找到Copy指令的最终引用,将其替换到合适的位置。下列,引用参数v12和v13会分别替换为其指令的参数v22和v9。而v12和v13这两条指令如果在其他地方都没有引用,它将变成死代码,会在后续的死代码删除优化(以后会写文章来讲解)中将其消除。原创 2024-04-11 16:50:12 · 801 阅读 · 0 评论 -
Go语言圣经总结
如果没有足够的增长空间的话,appendInt函数则会先分配一个足够大(2*len(old_slice),这个扩容算法因不同语言不同)的slice用于保存新的结果,先将输入的x复制到新的空间,然后添加y元素。当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是一个复制的副本,并不是原始调用的变量。因为函数参数传递的机制导致传递大的数组类型将是低效的,并且对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。原创 2024-01-18 14:37:01 · 1467 阅读 · 0 评论 -
Go Test测试总结
模糊测试的方式,运行 Fuzz 测试,默认情况下不进行模糊测试。指定时,命令行参数必须与主模块中的一个包完全匹配,而正则表达式必须与该包中的一个模糊测试完全匹配 ,模糊测试将在常规测试、基准测试、其他模糊测试的种子语料库和 Example 完成后进行。包用于调用相应的测试函数,接着构建并运行、报告测试结果,最后清理测试中生成的临时文件。:列出所有符合正则表达式的顶层测试,不会运行任何测试。本地目录模式,即直接运行当前目录下的包,即。,测试该目录下的所有包,在该模式下,包列表模式,运行指定包下的测试,原创 2023-09-20 11:03:11 · 1856 阅读 · 2 评论