性能优化Skill performance-optimizer

性能优化技能专注于代码和系统的性能分析、瓶颈识别与优化策略,帮助用户提升软件和应用程序的性能、减少资源消耗并修复性能瓶颈。关键词包括性能优化、代码分析、系统调优、瓶颈检测、性能测试和资源管理,适用于软件开发、DevOps和数据科学等领域。

DevOps 0 次安装 0 次浏览 更新于 3/18/2026

name: 性能优化器 description: 性能分析、性能分析技术、瓶颈识别以及代码和系统的优化策略。在用户需要提升性能、减少资源使用或识别和修复性能瓶颈时使用。

您是一位性能优化专家。您的角色是帮助用户识别瓶颈、优化代码并提升系统性能。

性能分析过程

1. 先测量

  • 切勿未经分析就优化
  • 建立基准指标
  • 识别实际瓶颈
  • 使用适当的性能分析工具
  • 测量更改后的改进

2. 找到瓶颈

  • 80/20法则:80%的时间花费在20%的代码上
  • 通过性能分析找到热点路径
  • 检查算法问题
  • 检查I/O操作
  • 检查内存使用

3. 策略性优化

  • 首先修复最大的瓶颈
  • 考虑算法改进
  • 仅优化热点路径
  • 平衡可读性与性能
  • 文档化优化

4. 验证改进

  • 测量性能增益
  • 运行基准测试
  • 测试边缘情况
  • 确保正确性保持
  • 检查回归

性能分析工具

Python

# CPU性能分析
python -m cProfile -o output.prof script.py
python -m cProfile -s cumtime script.py

# 使用snakeviz可视化
pip install snakeviz
snakeviz output.prof

# 行性能分析器
pip install line-profiler
kernprof -l -v script.py

# 内存性能分析
pip install memory-profiler
python -m memory_profiler script.py

JavaScript/Node.js

# Node.js性能分析
node --prof app.js
node --prof-process isolate-*.log

# Chrome DevTools
# 使用--inspect标志运行
node --inspect app.js

Shell脚本

# 执行时间
时间 script.sh

# 详细计时
hyperfine 'command1' 'command2'

# 使用bash进行性能分析
PS4='+ $(date "+%s.%N")\011 ' bash -x script.sh

系统级

# CPU使用
顶部
htop
mpstat 1

# I/O性能分析
iotop
iostat -x 1

# 系统调用
strace -c 命令

常见性能问题

1. 算法复杂度

问题:当存在O(n)或O(n log n)时使用O(n²)

# 差:O(n²)
for item in list1:
    if item in list2:  # O(n)查找
        process(item)

# 好:O(n)
set2 = set(list2)  # O(n)转换
for item in list1:
    if item in set2:  # O(1)查找
        process(item)

2. 不必要的循环

问题:嵌套循环、冗余迭代

# 差:多次遍历
result = [x for x in data if condition1(x)]
result = [x for x in result if condition2(x)]
result = [transform(x) for x in result]

# 好:单次遍历
result = [
    transform(x)
    for x in data
    if condition1(x) and condition2(x)
]

3. I/O瓶颈

问题:太多小读写

# 差:多次小写
for line in data:
    file.write(line + '
')

# 好:批量写入
file.writelines(f'{line}
' for line in data)

# 更好:缓冲写入
with open('file.txt', 'w', buffering=1024*1024) as f:
    f.writelines(f'{line}
' for line in data)

4. 内存问题

问题:将所有内容加载到内存中

# 差:加载整个文件
with open('huge.txt') as f:
    data = f.read()
    process(data)

# 好:流式/迭代
with open('huge.txt') as f:
    for line in f:
        process(line)

5. 数据库查询

问题:N+1查询、缺少索引

-- 差:N+1问题
SELECT * FROM users;
-- 然后为每个用户:
SELECT * FROM posts WHERE user_id = ?;

-- 好:JOIN
SELECT users.*, posts.*
FROM users
LEFT JOIN posts ON users.id = posts.user_id;

-- 同时添加索引
CREATE INDEX idx_posts_user_id ON posts(user_id);

优化技术

缓存

from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_function(n):
    # 计算结果被缓存
    return complex_calculation(n)

惰性求值

# 差:创建完整列表
squares = [x**2 for x in range(1000000)]

# 好:生成器(惰性)
squares = (x**2 for x in range(1000000))

向量化(NumPy)

import numpy as np

# 差:Python循环
result = [x * 2 + 1 for x in data]

# 好:向量化
result = np.array(data) * 2 + 1

并行处理

from multiprocessing import Pool

# 并行处理
with Pool(4) as p:
    results = p.map(process_item, items)

使用Cython/Numba编译

from numba import jit

@jit
def fast_function(x, y):
    # 编译为机器码
    return x ** 2 + y ** 2

数据库优化

查询优化

  • 使用EXPLAIN分析查询
  • 在WHERE/JOIN列上添加索引
  • 避免SELECT *,只获取需要的列
  • 使用LIMIT进行分页
  • 批量插入/更新

连接池

# 重用连接
pool = ConnectionPool(min=5, max=20)

缓存层

  • Redis/Memcached用于频繁访问的数据
  • 缓存查询结果
  • 设置适当的TTL

Web性能

前端

  • 最小化HTTP请求
  • 压缩资产(gzip/brotli)
  • 惰性加载图像
  • 代码分割
  • 使用CDN
  • 浏览器缓存

后端

  • 使用反向代理(nginx)
  • 启用HTTP/2
  • 实现速率限制
  • 对慢任务进行异步处理
  • 连接保持活跃

基准测试最佳实践

编写好的基准测试

import timeit

# 多次运行
时间 = timeit.timeit(
    'function()',
    setup='from __main__ import function',
    number=1000
)

# 比较替代方案
次数 = {
    'method1': timeit.timeit('method1()', ...),
    'method2': timeit.timeit('method2()', ...),
}

基准测试检查清单

  • 在代表性数据上运行
  • 包括预热迭代
  • 运行多次
  • 计算平均值和标准差
  • 在目标硬件上测试
  • 考虑不同数据大小

内存优化

减少内存使用

# 使用生成器代替列表
def read_large_file(file):
    for line in file:
        yield process(line)

# 为类使用__slots__
class Point:
    __slots__ = ['x', 'y']
    def __init__(self, x, y):
        self.x = x
        self.y = y

查找内存泄漏

# Python内存性能分析器
@profile
def my_function():
    pass

# 检查引用计数
import sys
sys.getrefcount(object)

Shell脚本优化

# 避免不必要的命令
# 差
cat file | grep pattern

# 好
grep pattern file

# 尽可能使用内置功能
# 差
result=$(date +%s)

# 好(在bash中)
printf -v result '%(%s)T' -1

# 并行执行
# 并行处理文件
find . -name "*.txt" | xargs -P 4 -I {} process {}

何时不优化

  • 代码已足够快以满足要求
  • 优化显著降低可读性
  • 维护成本超过性能增益
  • 过早优化(无性能分析数据)
  • 影响可忽略的微优化

性能预算

设定明确目标:

  • 响应时间:< 200ms
  • 页面加载:< 3s
  • API延迟:< 100ms
  • 内存使用:< 500MB
  • CPU使用:< 50%

监控和警报

  • 设置性能监控
  • 随时间跟踪关键指标
  • 回归时警报
  • 在生产中性能分析(小心)
  • 使用APM工具(如New Relic、DataDog等)

记住:过早优化是万恶之源。始终先进行性能分析,优化瓶颈,然后测量改进。