SurfaceFlinger dump 中 Imported gralloc buffers 的统计脚本

功能特点

  1. 智能分组规则

    • 有"[]"且不为空:使用"[]"中的内容分组
    • 有"[]"但为空:使用"#"后面的内容分组
    • 没有"[]":使用"#"前面的内容分组
    • 其他情况:使用原始name分组
  2. 完整name显示:输出所有分组的完整原始name

  3. 动态格式对齐:自动调整输出宽度,确保长name也能整齐显示

  4. 交互式输入:从标准输入读取内容,支持多行粘贴

  5. 用户友好:结果输出后等待用户确认才关闭窗口

使用方法

  1. 运行脚本
  2. 粘贴需要分析的文本内容
  3. 输入空行结束输入
  4. 查看分析结果
  5. 按回车键退出
import re
from collections import defaultdict
import sys

def extract_name_key(name):
    """
    根据规则提取name的关键字用于分组
    """
    # 查找[]中的内容
    bracket_match = re.search(r'\[([^\]]*)\]', name)
    
    if bracket_match:
        bracket_content = bracket_match.group(1)
        # 规则2: 如果[]中的内容不为空,则使用[]中的内容作为key
        if bracket_content:
            return bracket_content
        else:
            # 规则3: 如果[]中的内容为空,则使用#号后面的内容
            hash_match = re.search(r'#([^(]*)', name)
            if hash_match:
                return hash_match.group(1).strip()
    else:
        # 如果没有[],则使用#号前面的内容作为key
        hash_match = re.search(r'([^#]*)#', name)
        if hash_match:
            return hash_match.group(1).strip()
    
    # 如果以上规则都不适用,则返回原始name
    return name

def parse_input():
    """
    从标准输入解析内容并统计相同name的size总和
    """
    # 使用字典来存储每个key的size总和和原始name列表
    size_sum = defaultdict(lambda: [0.0, []])
    
    print("请输入要解析的内容(输入空行结束):")
    
    # 从标准输入读取多行内容
    lines = []
    while True:
        try:
            line = input()
            if line.strip() == "":  # 空行表示输入结束
                break
            lines.append(line)
        except EOFError:
            break
    
    # 如果没有输入内容,则退出
    if not lines:
        print("没有输入任何内容")
        return {}
    
    # 解析每一行
    for line in lines:
        line = line.strip()
        if not line.startswith('+ name:'):
            continue
        
        # 提取name和size
        name_match = re.search(r'name:([^,]+)', line)
        size_match = re.search(r'size:([\d.]+)KiB', line)
        
        if name_match and size_match:
            original_name = name_match.group(1)
            size = float(size_match.group(1))
            
            # 提取用于分组的key
            key = extract_name_key(original_name)
            
            # 累加size并保存原始name
            size_sum[key][0] += size
            size_sum[key][1].append(original_name)
    
    return size_sum

def main():
    # 解析输入内容并获取统计结果
    size_stats = parse_input()
    
    if not size_stats:
        print("没有找到有效数据")
        input("按回车键退出...")
        return
    
    # 准备输出数据
    output_data = []
    max_name_length = 0
    
    for key, (total_size, original_names) in size_stats.items():
        # 使用第一个原始name作为显示名称
        display_name = original_names[0]
        
        # 更新最大name长度
        if len(display_name) > max_name_length:
            max_name_length = len(display_name)
        
        output_data.append((display_name, total_size))
    
    # 设置name字段的宽度,确保对齐
    # 最小宽度为40,但如果name更长则使用实际长度
    name_width = max(max_name_length + 2, 40)
    
    # 按size总和从大到小排序
    sorted_stats = sorted(output_data, key=lambda x: x[1], reverse=True)
    
    # 输出结果
    print("\n相同name的size总和统计(按从大到小排序):")
    separator = "-" * (name_width + 20)  # 动态调整分隔线长度
    print(separator)
    
    for i, (display_name, total_size) in enumerate(sorted_stats, 1):
        # 使用动态宽度确保对齐
        print(f"{i:2d}. {display_name:<{name_width}} {total_size:>10.2f} KiB")
    
    # 输出总计信息
    total_all = sum(size for _, size in sorted_stats)
    print(separator)
    print(f"总计: {len(sorted_stats)} 个分组, 总大小: {total_all:.2f} KiB")
    
    # 等待用户输入后才关闭窗口
    input("\n按回车键退出...")

if __name__ == "__main__":
    main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容