<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>inasayang&#39;s blog</title>
    <link>/</link>
    <description>Recent blog posts on inasayang&#39;s blog</description>
    
    <generator>Hugo (https://gohugo.io)</generator>
    
    <language>zh-cn</language>
    
    <managingEditor>xiayangzzw@gmail.com (inasayang)</managingEditor>
    
    <webMaster>xiayangzzw@gmail.com (inasayang)</webMaster>
    
    <lastBuildDate>Tue, 15 Apr 2025 00:00:00 Z</lastBuildDate>
    
    <atom:link href="/tags/compile/index.xml" rel="self" type="application/rss+xml" />
    

    <item>
      <title>Go | 使用PGO优化编译示例</title>
      <link>/posts/250415_golangpgoexample/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;PGO (Profile-Guided Optimization) 是一种编译优化技术，通过收集程序的实际运行时数据来指导编译器进行更有针对性的优化。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-pgo file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        specify the file path of a profile for profile-guided optimization (PGO).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        When the special name &amp;#34;auto&amp;#34; is specified, for each main package in the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        build, the go command selects a file named &amp;#34;default.pgo&amp;#34; in the package&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        directory if that file exists, and applies it to the (transitive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dependencies of the main package (other packages are not affected).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Special name &amp;#34;off&amp;#34; turns off PGO. The default is &amp;#34;auto&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段说明解释了 &lt;code&gt;-pgo&lt;/code&gt; 参数的几种用法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pgo=文件路径&lt;/code&gt; - 指定一个具体的性能分析文件路径用于PGO优化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pgo=auto&lt;/code&gt; - 自动模式(默认)，会在每个main包的目录中查找名为&amp;quot;default.pgo&amp;quot;的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pgo=off&lt;/code&gt; - 明确关闭PGO优化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当使用自动模式时，PGO优化只会应用到main包及其依赖项，而不会影响其他不相关的包。&lt;/p&gt;
&lt;h2 id=&#34;收集性能分析数据&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%94%b6%e9%9b%86%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90%e6%95%b0%e6%8d%ae&#34;&gt;
        #
    &lt;/a&gt;
    收集性能分析数据
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// main.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;runtime/pprof&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;computeIntensive&lt;/span&gt;() &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10000000&lt;/span&gt;; i&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;+=&lt;/span&gt; i &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;return&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 第一次运行时开启性能分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ca9ee6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#99d1db&#34;&gt;len&lt;/span&gt;(os.Args) &amp;gt; &lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; os.Args[&lt;span style=&#34;color:#ef9f76&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;profile&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        f, _ &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; os.&lt;span style=&#34;color:#8caaee&#34;&gt;Create&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;profile.pprof&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;defer&lt;/span&gt; f.&lt;span style=&#34;color:#8caaee&#34;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pprof.&lt;span style=&#34;color:#8caaee&#34;&gt;StartCPUProfile&lt;/span&gt;(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ca9ee6&#34;&gt;defer&lt;/span&gt; pprof.&lt;span style=&#34;color:#8caaee&#34;&gt;StopCPUProfile&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 执行计算密集型操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;computeIntensive&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#99d1db&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;Result:&amp;#34;&lt;/span&gt;, result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -o myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用收集的分析数据进行优化编译&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%94%b6%e9%9b%86%e7%9a%84%e5%88%86%e6%9e%90%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e4%bc%98%e5%8c%96%e7%bc%96%e8%af%91&#34;&gt;
        #
    &lt;/a&gt;
    使用收集的分析数据进行优化编译
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -pgo profile.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; -o myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果有多个pprof文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# 使用pprof工具合并多个分析文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go tool pprof -proto cpu1.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; cpu2.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; cpu3.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; &amp;gt; combined.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# 使用合并后的分析文件进行构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -pgo combined.&lt;span style=&#34;color:#ef9f76&#34;&gt;pprof&lt;/span&gt; -o myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;测试&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e6%b5%8b%e8%af%95&#34;&gt;
        #
    &lt;/a&gt;
    测试
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time ./myapp.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time ./myapp_optimized.&lt;span style=&#34;color:#ef9f76&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;PGO 优化通常在较大、复杂的应用中效果更显著，特别是有明显热点路径的程序。对于简单程序，优化效果可能不明显，甚至因为优化开销而略微变慢。&lt;/li&gt;
&lt;li&gt;PGO 主要适用于计算密集型应用。&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      <category>pgo</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/250415_golangpgoexample/</guid>
    </item>
    

    <item>
      <title>Rust | LTO和Thin LTO编译器</title>
      <link>/posts/250415_ltothinlto/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;h2 id=&#34;lto-link-time-optimization&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-link-time-optimization&#34;&gt;
        #
    &lt;/a&gt;
    LTO (Link Time Optimization)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;链接时优化是一种编译器优化技术，它在程序的链接阶段而非传统的编译阶段执行代码优化。&lt;/p&gt;
&lt;h3 id=&#34;lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编译阶段&lt;/strong&gt;：编译器在编译单个源文件时，不仅生成机器代码，还保存中间表示（IR，Intermediate Representation）到目标文件中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接阶段&lt;/strong&gt;：链接器收集所有模块的IR，将它们合并为一个统一的程序表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局优化&lt;/strong&gt;：对整个程序执行优化，基于对所有代码的完整视图&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨模块优化&lt;/strong&gt;：可以进行跨越多个源文件的优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内联函数&lt;/strong&gt;：更强大的函数内联能力，包括跨编译单元边界&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死代码消除&lt;/strong&gt;：更有效地移除未使用的代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更精确的别名分析&lt;/strong&gt;：改进指针分析和内存访问优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码大小减少&lt;/strong&gt;：通过移除不必要的代码减小二进制大小&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lto-的缺点&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#lto-%e7%9a%84%e7%bc%ba%e7%82%b9&#34;&gt;
        ##
    &lt;/a&gt;
    LTO 的缺点
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内存消耗大&lt;/strong&gt;：处理大型程序时需要大量内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译时间长&lt;/strong&gt;：链接过程变得更加复杂和耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;thin-lto-轻量级链接时优化&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e8%bd%bb%e9%87%8f%e7%ba%a7%e9%93%be%e6%8e%a5%e6%97%b6%e4%bc%98%e5%8c%96&#34;&gt;
        #
    &lt;/a&gt;
    Thin LTO (轻量级链接时优化)
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Thin LTO 是 LLVM 编译器基础设施引入的 LTO 变种，旨在解决传统 LTO 的性能和扩展性问题。&lt;/p&gt;
&lt;h3 id=&#34;thin-lto-的工作原理&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的工作原理
&lt;/div&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;索引生成&lt;/strong&gt;：每个目标文件都独立生成索引，包含符号和引用信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行优化&lt;/strong&gt;：基于索引信息，将全局优化工作分解成多个可并行执行的任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块级优化&lt;/strong&gt;：在各个模块上并行执行优化，而不是合并所有IR&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;thin-lto-的主要优势&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#thin-lto-%e7%9a%84%e4%b8%bb%e8%a6%81%e4%bc%98%e5%8a%bf&#34;&gt;
        ##
    &lt;/a&gt;
    Thin LTO 的主要优势
&lt;/div&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;减少内存使用&lt;/strong&gt;：不需要加载整个程序的IR到内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行编译&lt;/strong&gt;：通过并行化加速编译过程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量编译支持&lt;/strong&gt;：更好地支持增量构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留大部分传统LTO的优化效果&lt;/strong&gt;：仍能执行跨模块优化&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;LTO&lt;/th&gt;
					&lt;th&gt;Thin LTO&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;优化效果&lt;/td&gt;
					&lt;td&gt;最大化&lt;/td&gt;
					&lt;td&gt;接近LTO但略低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内存使用&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;编译速度&lt;/td&gt;
					&lt;td&gt;慢&lt;/td&gt;
					&lt;td&gt;快（尤其在多核系统）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;并行度&lt;/td&gt;
					&lt;td&gt;有限&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;适用场景&lt;/td&gt;
					&lt;td&gt;最终发布构建&lt;/td&gt;
					&lt;td&gt;日常开发和发布&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;rust-中使用&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#rust-%e4%b8%ad%e4%bd%bf%e7%94%a8&#34;&gt;
        #
    &lt;/a&gt;
    Rust 中使用
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[profile.release]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;fat&amp;#34;   &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;# lto = &amp;#34;thin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LTO 通常与其他优化标志一起使用。&lt;/p&gt;</content:encoded>
      
      <category>rust</category>
      
      <category>llvm</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/250415_ltothinlto/</guid>
    </item>
    

    <item>
      <title>Go | Build Constraints 构建约束</title>
      <link>/posts/230102_gobuildconstraints/</link>
      <pubDate>Mon, 02 Jan 2023 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      一个构建约束(构建标签)是文件应包含在包中的条件。构建约束由开始的行注释给出。

      </description>
      <content:encoded>&lt;p&gt;一个构建约束(构建标签)是文件应包含在包中的条件。构建约束由开始的行注释给出。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;约束可以出现在任何类型的源文件中（不仅仅是 Go），但它们必须出现在文件顶部附近，前面只有空行和其他行注释。
这些规则意味着在 Go 文件中，构建约束必须出现在 package 子句之前。&lt;/p&gt;
&lt;p&gt;为了区分构建约束和包文档，构建约束后面应该跟一个空行。&lt;/p&gt;
&lt;p&gt;构建约束注释被评估为包含由 ||、&amp;amp;&amp;amp; 和 ! 组合的构建标记的表达式,运算符和括号。&lt;/p&gt;
&lt;p&gt;例如，当满足&lt;code&gt;linux&lt;/code&gt;和&lt;code&gt;386&lt;/code&gt;约束时，或者满足&lt;code&gt;darwin&lt;/code&gt;而&lt;code&gt;cgo&lt;/code&gt;不满足时，以下构建约束约束文件构建：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build (linux &amp;amp;&amp;amp; 386) || (darwin &amp;amp;&amp;amp; !cgo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个文件有多个 &lt;code&gt;//go:build&lt;/code&gt; 行是错误的。&lt;/p&gt;
&lt;p&gt;在特定构建期间，满足以下构建标签：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标操作系统，由 &lt;code&gt;runtime.GOOS&lt;/code&gt; 拼写，使用 &lt;code&gt;GOOS&lt;/code&gt; 环境变量设置。&lt;/li&gt;
&lt;li&gt;目标体系结构，由 &lt;code&gt;runtime.GOARCH&lt;/code&gt; 拼写，使用 &lt;code&gt;GOARCH&lt;/code&gt; 环境变量设置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unix&lt;/code&gt;，如果 &lt;code&gt;GOOS&lt;/code&gt; 是 &lt;code&gt;Unix&lt;/code&gt; 或类 &lt;code&gt;Unix&lt;/code&gt; 系统。&lt;/li&gt;
&lt;li&gt;正在使用的编译器，&lt;code&gt;gc&lt;/code&gt;或&lt;code&gt;gccgo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cgo&lt;/code&gt;，如果支持 &lt;code&gt;cgo&lt;/code&gt; 命令（请参阅&lt;code&gt;go help environment&lt;/code&gt;中的 &lt;code&gt;CGO_ENABLED&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;每个 Go 主要版本的术语，通过当前版本：从 Go 1.1 版开始的“go1.1”，从 Go 1.12 开始的“go1.12”，等等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-tags&lt;/code&gt; 标志给出的任何附加标签（参见&lt;code&gt;go help build&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果文件名在去除扩展名和可能的 &lt;code&gt;_test&lt;/code&gt; 后缀后匹配以下任何模式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOOS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOARCH
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;*&lt;/span&gt;_GOOS_GOARCH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（示例：&lt;code&gt;source_windows_amd64.go&lt;/code&gt;）其中 &lt;code&gt;GOOS&lt;/code&gt; 和 &lt;code&gt;GOARCH&lt;/code&gt; 分别代表任何已知的操作系统和体系结构值，然后该文件被认为具有需要这些术语的隐式构建约束（除了文件中的任何显式约束之外）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了 &lt;code&gt;android&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=android&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=linux&lt;/code&gt; 一样。&lt;/li&gt;
&lt;li&gt;除了 &lt;code&gt;illumos&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=illumos&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=solaris&lt;/code&gt; 一样。&lt;/li&gt;
&lt;li&gt;除了 &lt;code&gt;ios&lt;/code&gt; 标签和文件之外，使用 &lt;code&gt;GOOS=ios&lt;/code&gt; 匹配构建标签和文件，就像 &lt;code&gt;GOOS=darwin&lt;/code&gt; 一样。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要阻止文件被考虑用于构建：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build ignore&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仅在使用 &lt;code&gt;cgo&lt;/code&gt; 时构建文件，并且仅在 &lt;code&gt;Linux&lt;/code&gt; 和 &lt;code&gt;OS X&lt;/code&gt; 上：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build cgo &amp;amp;&amp;amp; (linux || darwin)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的文件通常与另一个实现其他系统默认功能的文件配对，在这种情况下会带有约束：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:build !(cgo &amp;amp;&amp;amp; (linux || darwin))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将文件命名为 &lt;code&gt;dns_windows.go&lt;/code&gt; 将导致它仅在为 &lt;code&gt;Windows&lt;/code&gt; 构建包时被包含；同样，只有在为 32 位 &lt;code&gt;x86&lt;/code&gt; 构建包时才会包含 &lt;code&gt;math_386.s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Go 版本 1.16 及更早版本使用不同的语法来构建约束，带有&lt;code&gt;// +build&lt;/code&gt;前缀。 gofmt 命令将在遇到旧语法时添加等效的 &lt;code&gt;//go:build&lt;/code&gt; 约束。&lt;/p&gt;
&lt;p&gt;例外，下列使用空格，逗号，多行在新版本中已失效：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用空格分隔的构建标记在逻辑上是或
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build linux darwin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;用逗号分隔的构建标记在逻辑上是和
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build windows,386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;在多行上构建约束是逻辑和
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// +build 386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整的约束标签可以在&lt;a href=&#34;https://github.com/golang/go/blob/master/src/go/build/syslist.go&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;这里&lt;/a&gt;找到&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/cmd/go#hdr-Build_constraints&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Build constraints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
      
      <category>go</category>
      
      <category>compile</category>
      
      
      <guid isPermaLink="true">/posts/230102_gobuildconstraints/</guid>
    </item>
    
  </channel>
</rss>
