开发者
资源
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

函数扫描模式使用场景

用户可以通过在命令./tiancheng之后,添加“--funcs”参数的方式,实现对单文件或文件目录中指定函数的扫描和分析。

前提条件

以天秤源码优化工具安装路径“/home/tiancheng-x.x.x-Linux-Kunpeng”为例。

函数扫描使用示例

  1. 选择指定单文件的函数或整个文件目录的函数进行扫描并分析。
    • 对单文件中的指定函数进行扫描并输出分析报告。此处以扫描“/home/demo”路径下input.cpp文件中的BrotliOptimizeHuffmanCountsForRle函数,分析报告存放至“/home/demo”路径为例,请根据实际情况进行修改。
      ./tiancheng -i /home/demo/input.cpp --funcs BrotliOptimizeHuffmanCountsForRle -o /home/demo -r /path/to/code_project 

      指定“/home/demo”下input.cpp文件中的BrotliOptimizeHuffmanCountsForRle函数,对input.cpp文件中的指定函数进行扫描,在“/home/demo”下生成向量化检查报告和JSON报告文件。同时指定待分析源码文件所属项目的根目录“/path/to/code_project”,避免头文件缺失。

      返回信息如下:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      Warning: Single file target mode prioritizes '-i'. '-r' will be ignored. 
      Compile database file does not exist or is unreachable.
      Target functions to analyze:
        - BrotliOptimizeHuffmanCountsForRle   // 提示指定的待分析函数为BrotliOptimizeHuffmanCountsForRle函数。
      [Locator] Analyzing: BrotliOptimizeHuffmanCountsForRle
        -> [Match] /home/demo/input.cpp: 248  // 匹配BrotliOptimizeHuffmanCountsForRle函数所在的input.cpp源文件,248表示该函数所在的行数。
      
      
      ================================================================================
      Analyzing file: /home/demo/input.cpp  // 分析input.cpp源文件。
      --------------------------------------------------------------------------------
      Start to recognize file: /home/demo/input.cpp   // 开始识别input.cpp源文件。
      compile_commands.json not found under: /path/to/code_project
      Recursively collecting include paths as fallback. 
      Start to scan code.   // 开始扫描代码。
      
      
      [Match Found] Function: BrotliOptimizeHuffmanCountsForRle at /home/demo/input.cpp:248  // 提示BrotliOptimizeHuffmanCountsForRle函数匹配成功。
        [FilterAnchors] Limiting from 37 to 10 anchors  // 提示将过滤锚点数量从37个限制为10个。
        [CallDepth] Function 'BrotliOptimizeHuffmanCountsForRle': original anchors=37, filtered=10  disabling interprocedural analysis  // 限制调用深度,提示禁用跨函数分析。
      
      
      Vectorization check task is being executed. Please wait...
      Scanning start time: 2026/05/27 16:56:41
      Successfully generated vectorization report: /home/demo/Vectorization_Source_20260527_165658_007_9841.html   // 提示向量化检查报告文件的存放路径。
      Successfully generated vectorization optimization result: /home/demo/Vectorization_Optimization_Result_20260527_165658_007_9841.json  // 提示JSON报告文件的存放路径。
      
    • 对整个文件目录中的指定函数进行扫描并输出分析报告。此处以扫描“/path/to/code_project”路径下所有文件中的BrotliOptimizeHuffmanCountsForRle函数,分析报告存放至“/home/demo”路径为例,请根据实际情况进行修改。
      ./tiancheng --funcs BrotliOptimizeHuffmanCountsForRle -o /home/demo -r /path/to/code_project

      指定“/path/to”下code_project项目中的BrotliOptimizeHuffmanCountsForRle函数,对code_project项目中的指定函数进行扫描,在“/home/demo”下生成向量化检查报告和JSON报告文件。同时指定待分析源码文件所属项目的根目录“/path/to/code_project”,避免头文件缺失。

      返回信息如下:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      Compile database file does not exist or is unreachable.
      Target functions to analyze:
        - BrotliOptimizeHuffmanCountsForRle   // 提示指定分析的函数为BrotliOptimizeHuffmanCountsForRle函数。
      [Locator] Analyzing: BrotliOptimizeHuffmanCountsForRle
        -> [Match] /path/to/code_project/enc/entropy_encode.c: 248  // 匹配BrotliOptimizeHuffmanCountsForRle函数所在的entropy_encode.c源文件,248表示该函数所在的行数。
      
      
      ================================================================================
      Analyzing file: /path/to/code_project/enc/entropy_encode.c   // 分析entropy_encode.c源文件。
      --------------------------------------------------------------------------------
      Start to recognize file: /path/to/code_project/enc/entropy_encode.c   // 开始识别entropy_encode.c源文件。
      compile_commands.json not found under: /path/to/code_project
      Recursively collecting include paths as fallback. 
      Start to scan code.  // 开始扫描代码。
      
      
      [Match Found] Function: BrotliOptimizeHuffmanCountsForRle at /path/to/code_project/enc/entropy_encode.c:248   // 提示BrotliOptimizeHuffmanCountsForRle函数匹配成功。
        [FilterAnchors] Limiting from 37 to 10 anchors    // 提示将过滤锚点数量从37个限制为10个。
        [CallDepth] Function 'BrotliOptimizeHuffmanCountsForRle': original anchors=37, filtered=10  disabling interprocedural analysis   // 限制调用深度,提示禁用跨函数分析。
      
      
      Vectorization check task is being executed. Please wait...
      Scanning start time: 2026/05/27 16:59:52
      Successfully generated vectorization report: /home/demo/Vectorization_Source_20260527_165945_490_7232.html   // 提示向量化检查报告文件的存放路径。
      Successfully generated vectorization optimization result: /home/demo/Vectorization_Optimization_Result_20260527_165945_490_7232.json // 提示JSON报告文件的存放路径。
      
  2. 打开生成的JSON报告文件,分析并确认修改点。
    vim /home/demo/Vectorization_Optimization_Result_20260527_165945_490_7232.json

    JSON文件详情如下:

    {
      "advisor_items": [
        {
          "opt_file": {
            "begin_line": 315,
            "description": "",
            "end_line": 317,
            "fileName": "/path/to/code_project/enc/entropy_encode.c",
            "headerFile": "#include <arm_neon.h>",
            "headerLocBegin": 11,
            "headerLocEnd": 11,
            "sample_code": "          k = 0;\n          for (; k + 16 < step; k += 16) {\n              vst1q_u8(good_for_rle + i - k - 1, vdupq_n_u8(1));\n          }\n          for (; k < step; ++k) {\n            good_for_rle[i - k - 1] = 1;\n          }"
          }
        },
        {
          "opt_file": {
            "begin_line": 348,
            "description": "",
            "end_line": 352,
            "fileName": "/path/to/code_project/enc/entropy_encode.c",
            "headerFile": "#include <arm_neon.h>",
            "headerLocBegin": 11,
            "headerLocEnd": 11,
            "sample_code": "        k = 0;\n        for (; k + 4 < stride; k += 4) {\n            vst1q_u32(counts + i - k - 1, vdupq_n_u32(count));\n        }\n        for (; k < stride; ++k) {\n          /* We don't want to change value at counts[i],\n             that is already belonging to the next stride. Thus - 1. */\n          counts[i - k - 1] = (uint32_t)count;\n        }"
          }
        }
      ],
      "code": 0,
      "recognizedPattern": 2
    }
    表1 字段说明

    字段

    字段说明

    advisor_items

    代码优化点建议数组,里面的每一项都是一个代码优化点建议。

    opt_file

    单个优化建议的详细信息。

    begin_line

    需要优化代码的起始行号。

    示例中“348”为优化代码的起始行号。

    description

    优化建议的详细描述。

    end_line

    需要优化代码的结束行号。

    示例中“352”为优化代码的结束行号。

    fileName

    当前分析的源文件所在路径。

    示例中“/path/to/code_project/enc/entropy_encode.c”为分析的源文件所在路径。

    headerFile

    需要添加的头文件。

    示例中“#include <arm_neon.h>”表明此段代码需要添加ARM NEON的头文件,用于使用NEON指令集。

    headerLocBegin

    头文件插入的起始行号。

    • 若为-1,表示头文件在原始代码中已经包含,无需手动添加。
    • 若为正整数,表示头文件插入的起始行号。

    示例中“11”为头文件插入的起始行号。

    headerLocEnd

    头文件插入的结束行号。

    • 若为-1,表示头文件在原始代码中已经包含,无需手动添加。
    • 若为正整数,表示头文件插入的结束行号。

    示例中“11”为头文件插入的结束行号。

    sample_code

    推荐的向量化实现代码样例,可直接用于替换源文件的原始代码。

    示例中以下代码为优化后的代码样例。

     k = 0;\n        for (; k + 4 < stride; k += 4) {\n            vst1q_u32(counts + i - k - 1, vdupq_n_u32(count));\n        }\n        for (; k < stride; ++k) {\n          /* We don't want to change value at counts[i],\n             that is already belonging to the next stride. Thus - 1. */\n          counts[i - k - 1] = (uint32_t)count;\n        }

    code

    工具执行状态码。

    • 0表示工具执行成功。
    • 非零值表示异常中断

    示例中“0”表明工具执行成功。

    recognizedPattern

    需要优化的代码段数量。

    示例中“2”表明有2处代码需要优化。

  3. 根据JSON报告进行代码改写。
    1. 查看advisor_items,其中包含了所有识别到的优化建议。
    2. 对于每个优化建议,查看begin_line和end_line字段,确定需要替换的代码范围。
    3. 将sample_code字段中的向量化代码复制并替换源文件对应位置的代码(第begin_line行至第end_line行)。
    4. 检查headerLocBegin和headerLocEnd字段:
      • 如果值为-1,表示头文件已存在,无需添加。
      • 如果为正整数,需要在指定位置添加headerFile中的头文件声明。
    5. 保存修改后的文件,即可完成自动化改写。