233 lines
9.0 KiB
Python
233 lines
9.0 KiB
Python
"""
|
|
Cursor Performance Test Script
|
|
Tests system resources and Cursor IDE performance on Windows desktop environment.
|
|
"""
|
|
import psutil
|
|
import time
|
|
import json
|
|
import sys
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
|
|
def get_system_resources():
|
|
"""Get current system resource usage"""
|
|
cpu_percent = psutil.cpu_percent(interval=1)
|
|
cpu_count = psutil.cpu_count()
|
|
cpu_freq = psutil.cpu_freq()
|
|
memory = psutil.virtual_memory()
|
|
disk = psutil.disk_usage('C:\\')
|
|
|
|
return {
|
|
'cpu': {
|
|
'usage_percent': cpu_percent,
|
|
'cores': cpu_count,
|
|
'frequency_mhz': cpu_freq.current if cpu_freq else None,
|
|
'status': 'healthy' if cpu_percent < 80 else 'warning' if cpu_percent < 95 else 'critical'
|
|
},
|
|
'memory': {
|
|
'total_gb': round(memory.total / (1024**3), 2),
|
|
'used_gb': round(memory.used / (1024**3), 2),
|
|
'available_gb': round(memory.available / (1024**3), 2),
|
|
'usage_percent': memory.percent,
|
|
'status': 'healthy' if memory.percent < 80 else 'warning' if memory.percent < 95 else 'critical'
|
|
},
|
|
'disk': {
|
|
'total_gb': round(disk.total / (1024**3), 2),
|
|
'used_gb': round(disk.used / (1024**3), 2),
|
|
'free_gb': round(disk.free / (1024**3), 2),
|
|
'usage_percent': disk.percent,
|
|
'status': 'healthy' if disk.percent < 80 else 'warning' if disk.percent < 95 else 'critical'
|
|
}
|
|
}
|
|
|
|
|
|
def get_cursor_processes():
|
|
"""Get all Cursor-related processes"""
|
|
cursor_processes = []
|
|
total_cpu = 0
|
|
total_memory = 0
|
|
|
|
for proc in psutil.process_iter(['pid', 'name', 'exe', 'cpu_percent', 'memory_info', 'create_time', 'num_threads']):
|
|
try:
|
|
proc_info = proc.info
|
|
name = proc_info['name'].lower()
|
|
|
|
# Check if it's a Cursor process
|
|
if 'cursor' in name or (proc_info.get('exe') and 'cursor' in proc_info['exe'].lower()):
|
|
cpu = proc_info.get('cpu_percent', 0) or 0
|
|
memory = proc_info.get('memory_info', None)
|
|
memory_mb = (memory.rss / (1024**2)) if memory else 0
|
|
|
|
# Get more detailed info
|
|
try:
|
|
proc_obj = psutil.Process(proc_info['pid'])
|
|
num_threads = proc_obj.num_threads()
|
|
open_files = len(proc_obj.open_files())
|
|
connections = len(proc_obj.connections())
|
|
except:
|
|
num_threads = proc_info.get('num_threads', 0)
|
|
open_files = 0
|
|
connections = 0
|
|
|
|
process_data = {
|
|
'pid': proc_info['pid'],
|
|
'name': proc_info['name'],
|
|
'cpu_percent': round(cpu, 2),
|
|
'memory_mb': round(memory_mb, 2),
|
|
'memory_gb': round(memory_mb / 1024, 2),
|
|
'threads': num_threads,
|
|
'open_files': open_files,
|
|
'connections': connections,
|
|
'uptime_seconds': round(time.time() - proc_info.get('create_time', time.time()), 2)
|
|
}
|
|
|
|
cursor_processes.append(process_data)
|
|
total_cpu += cpu
|
|
total_memory += memory_mb
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
continue
|
|
|
|
return {
|
|
'processes': cursor_processes,
|
|
'total_count': len(cursor_processes),
|
|
'total_cpu_percent': round(total_cpu, 2),
|
|
'total_memory_mb': round(total_memory, 2),
|
|
'total_memory_gb': round(total_memory / 1024, 2)
|
|
}
|
|
|
|
|
|
def get_top_processes(limit=10):
|
|
"""Get top resource-consuming processes"""
|
|
processes = []
|
|
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_info']):
|
|
try:
|
|
proc_info = proc.info
|
|
cpu = proc_info.get('cpu_percent', 0) or 0
|
|
memory = proc_info.get('memory_info', None)
|
|
memory_mb = (memory.rss / (1024**2)) if memory else 0
|
|
|
|
processes.append({
|
|
'pid': proc_info['pid'],
|
|
'name': proc_info['name'],
|
|
'cpu_percent': round(cpu, 2),
|
|
'memory_mb': round(memory_mb, 2)
|
|
})
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
continue
|
|
|
|
# Sort by memory usage
|
|
processes.sort(key=lambda x: x['memory_mb'], reverse=True)
|
|
return processes[:limit]
|
|
|
|
|
|
def run_performance_test():
|
|
"""Run comprehensive performance test"""
|
|
print("=" * 70)
|
|
print("CURSOR PERFORMANCE TEST")
|
|
print("=" * 70)
|
|
print(f"Timestamp: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
|
|
|
results = {
|
|
'timestamp': datetime.now().isoformat(),
|
|
'system': {},
|
|
'cursor': {},
|
|
'top_processes': []
|
|
}
|
|
|
|
# System Resources
|
|
print("Checking System Resources...")
|
|
results['system'] = get_system_resources()
|
|
|
|
print(f"\nCPU: {results['system']['cpu']['usage_percent']}% ({results['system']['cpu']['cores']} cores) - {results['system']['cpu']['status']}")
|
|
print(f"Memory: {results['system']['memory']['used_gb']}GB / {results['system']['memory']['total_gb']}GB ({results['system']['memory']['usage_percent']}%) - {results['system']['memory']['status']}")
|
|
print(f"Disk: {results['system']['disk']['used_gb']}GB / {results['system']['disk']['total_gb']}GB ({results['system']['disk']['usage_percent']}%) - {results['system']['disk']['status']}")
|
|
|
|
# Cursor Processes
|
|
print("\n" + "-" * 70)
|
|
print("Checking Cursor Processes...")
|
|
results['cursor'] = get_cursor_processes()
|
|
|
|
if results['cursor']['total_count'] > 0:
|
|
print(f"\nFound {results['cursor']['total_count']} Cursor process(es):")
|
|
print(f"Total CPU Usage: {results['cursor']['total_cpu_percent']}%")
|
|
print(f"Total Memory Usage: {results['cursor']['total_memory_gb']}GB ({results['cursor']['total_memory_mb']}MB)")
|
|
print("\nIndividual Processes:")
|
|
for proc in results['cursor']['processes']:
|
|
print(f" PID {proc['pid']:6d} | {proc['name']:20s} | CPU: {proc['cpu_percent']:6.2f}% | Memory: {proc['memory_mb']:8.2f}MB | Threads: {proc['threads']}")
|
|
else:
|
|
print("\nNo Cursor processes found. Is Cursor running?")
|
|
|
|
# Top Processes
|
|
print("\n" + "-" * 70)
|
|
print("Top 10 Processes by Memory Usage:")
|
|
results['top_processes'] = get_top_processes(10)
|
|
for i, proc in enumerate(results['top_processes'], 1):
|
|
print(f" {i:2d}. {proc['name']:30s} | CPU: {proc['cpu_percent']:6.2f}% | Memory: {proc['memory_mb']:8.2f}MB")
|
|
|
|
# Performance Assessment
|
|
print("\n" + "=" * 70)
|
|
print("PERFORMANCE ASSESSMENT")
|
|
print("=" * 70)
|
|
|
|
issues = []
|
|
recommendations = []
|
|
|
|
# Check system resources
|
|
if results['system']['cpu']['usage_percent'] > 80:
|
|
issues.append(f"High CPU usage: {results['system']['cpu']['usage_percent']}%")
|
|
recommendations.append("Close unnecessary applications to free up CPU resources")
|
|
|
|
if results['system']['memory']['usage_percent'] > 80:
|
|
issues.append(f"High memory usage: {results['system']['memory']['usage_percent']}%")
|
|
recommendations.append("Close unused applications or consider adding more RAM")
|
|
|
|
if results['system']['disk']['usage_percent'] > 80:
|
|
issues.append(f"Low disk space: {results['system']['disk']['usage_percent']}% used")
|
|
recommendations.append("Free up disk space by removing unnecessary files")
|
|
|
|
# Check Cursor-specific issues
|
|
if results['cursor']['total_count'] > 0:
|
|
if results['cursor']['total_memory_gb'] > 2:
|
|
issues.append(f"Cursor using high memory: {results['cursor']['total_memory_gb']}GB")
|
|
recommendations.append("Consider restarting Cursor or closing unused tabs/files")
|
|
|
|
if results['cursor']['total_cpu_percent'] > 50:
|
|
issues.append(f"Cursor using high CPU: {results['cursor']['total_cpu_percent']}%")
|
|
recommendations.append("Cursor may be indexing or processing. Wait for it to complete.")
|
|
|
|
if issues:
|
|
print("\n⚠️ ISSUES DETECTED:")
|
|
for issue in issues:
|
|
print(f" • {issue}")
|
|
else:
|
|
print("\n✅ No major performance issues detected")
|
|
|
|
if recommendations:
|
|
print("\n💡 RECOMMENDATIONS:")
|
|
for rec in recommendations:
|
|
print(f" • {rec}")
|
|
|
|
# Save results to file
|
|
output_file = Path("cursor_performance_report.json")
|
|
with open(output_file, 'w') as f:
|
|
json.dump(results, f, indent=2)
|
|
print(f"\n📄 Detailed report saved to: {output_file}")
|
|
|
|
return results
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
run_performance_test()
|
|
except KeyboardInterrupt:
|
|
print("\n\nTest interrupted by user")
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
print(f"\n\nError running test: {str(e)}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
|