nodebookls/performance_monitor.py
2025-10-29 13:56:24 +08:00

87 lines
3.0 KiB
Python

import time
import psutil
import os
from typing import Dict, Any, Callable
from functools import wraps
class PerformanceMonitor:
"""性能监控器"""
def __init__(self):
self.metrics = {}
self.start_time = time.time()
def start_monitoring(self):
"""开始监控"""
self.start_time = time.time()
self.initial_memory = psutil.Process(os.getpid()).memory_info().rss
def stop_monitoring(self) -> Dict[str, Any]:
"""停止监控并返回性能指标"""
end_time = time.time()
final_memory = psutil.Process(os.getpid()).memory_info().rss
metrics = {
"execution_time": end_time - self.start_time,
"memory_used": final_memory - self.initial_memory,
"peak_memory": final_memory
}
return metrics
def monitor_function(self, func: Callable) -> Callable:
"""装饰器:监控函数性能"""
@wraps(func)
def wrapper(*args, **kwargs):
# 记录开始时间
start_time = time.time()
start_memory = psutil.Process(os.getpid()).memory_info().rss
try:
# 执行函数
result = func(*args, **kwargs)
return result
finally:
# 记录结束时间
end_time = time.time()
end_memory = psutil.Process(os.getpid()).memory_info().rss
# 记录指标
func_name = func.__name__
if func_name not in self.metrics:
self.metrics[func_name] = {
"call_count": 0,
"total_time": 0,
"total_memory": 0
}
self.metrics[func_name]["call_count"] += 1
self.metrics[func_name]["total_time"] += (end_time - start_time)
self.metrics[func_name]["total_memory"] += (end_memory - start_memory)
return wrapper
def get_metrics_report(self) -> str:
"""获取性能指标报告"""
if not self.metrics:
return "暂无性能数据"
report = "性能指标报告:\n"
report += "=" * 50 + "\n"
for func_name, metrics in self.metrics.items():
avg_time = metrics["total_time"] / metrics["call_count"]
avg_memory = metrics["total_memory"] / metrics["call_count"]
report += f"函数: {func_name}\n"
report += f" 调用次数: {metrics['call_count']}\n"
report += f" 总执行时间: {metrics['total_time']:.4f}s\n"
report += f" 平均执行时间: {avg_time:.4f}s\n"
report += f" 总内存使用: {metrics['total_memory'] / 1024 / 1024:.2f}MB\n"
report += f" 平均内存使用: {avg_memory / 1024 / 1024:.2f}MB\n"
report += "-" * 30 + "\n"
return report
# 创建全局性能监控器实例
perf_monitor = PerformanceMonitor()