AutoBackups/test_speed_comparison.py

284 lines
8.3 KiB
Python

#!/usr/bin/env python3
"""
Test de Velocidad: Manual vs Everything3 API
Comparación de rendimiento entre búsqueda manual y Everything API
"""
import os
import sys
import time
import json
import logging
from pathlib import Path
from typing import List
# Configurar logging
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
# Agregar src al path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
from utils.everything3_official_corrected_wrapper import (
create_everything3_official_searcher,
)
def load_config():
"""Cargar configuración"""
try:
with open("config.json", "r") as f:
return json.load(f)
except Exception as e:
logger.error(f"Error cargando config: {e}")
return None
def manual_search_s7p_files(directories: List[str]) -> List[str]:
"""
Búsqueda manual de archivos .s7p (simulando el fallback)
"""
found_files = []
for directory in directories:
if not os.path.exists(directory):
continue
try:
# Usar Path.rglob para búsqueda recursiva
path_obj = Path(directory)
for s7p_file in path_obj.rglob("*.s7p"):
found_files.append(str(s7p_file))
except Exception as e:
logger.error(f"Error buscando en {directory}: {e}")
return found_files
def everything3_search_s7p_files(directories: List[str], dll_path: str) -> List[str]:
"""
Búsqueda usando Everything3 API
"""
searcher = create_everything3_official_searcher(dll_path)
if not searcher:
return []
return searcher.search_s7p_files(directories)
def run_speed_test():
"""Ejecutar test de velocidad completo"""
print("🏁 Test de Velocidad: Manual vs Everything3 API")
print("=" * 60)
# Cargar configuración
config = load_config()
if not config:
print("❌ No se pudo cargar la configuración")
return
# Obtener configuraciones
everything_config = config.get("everything_api", {})
dll_path = everything_config.get("dll_path")
if not dll_path:
print("❌ No se encontró ruta de DLL en configuración")
return
# Convertir a ruta absoluta
if not os.path.isabs(dll_path):
dll_path = os.path.abspath(dll_path)
# Obtener directorios de búsqueda
search_directories = [
obs_dir["path"]
for obs_dir in config.get("observation_directories", [])
if obs_dir.get("enabled", True)
]
print(f"📂 Directorios a analizar: {len(search_directories)}")
for i, directory in enumerate(search_directories, 1):
print(f" {i}. {directory}")
print(f"📁 DLL Everything3: {dll_path}")
print()
# Variables para resultados
results = {}
# ========================================
# TEST 1: Búsqueda Manual (Fallback)
# ========================================
print("🔍 TEST 1: Búsqueda Manual (Fallback)")
print("-" * 40)
start_time = time.perf_counter()
manual_files = manual_search_s7p_files(search_directories)
manual_time = time.perf_counter() - start_time
print(f"⏱️ Tiempo: {manual_time:.4f} segundos")
print(f"📊 Archivos encontrados: {len(manual_files)}")
results["manual"] = {
"time": manual_time,
"files_found": len(manual_files),
"files": manual_files,
}
print()
# ========================================
# TEST 2: Everything3 API
# ========================================
print("🚀 TEST 2: Everything3 API")
print("-" * 40)
start_time = time.perf_counter()
everything_files = everything3_search_s7p_files(search_directories, dll_path)
everything_time = time.perf_counter() - start_time
print(f"⏱️ Tiempo: {everything_time:.4f} segundos")
print(f"📊 Archivos encontrados: {len(everything_files)}")
results["everything3"] = {
"time": everything_time,
"files_found": len(everything_files),
"files": everything_files,
}
print()
# ========================================
# COMPARACIÓN DE RESULTADOS
# ========================================
print("📈 COMPARACIÓN DE RESULTADOS")
print("=" * 60)
# Velocidad
if manual_time > 0:
speed_improvement = manual_time / everything_time
print(f"⚡ Everything3 es {speed_improvement:.2f}x más rápido")
time_saved = manual_time - everything_time
percentage_faster = ((manual_time - everything_time) / manual_time) * 100
print(
f"💾 Tiempo ahorrado: {time_saved:.4f} segundos ({percentage_faster:.1f}%)"
)
print()
# Precisión
manual_set = set(os.path.normpath(f) for f in manual_files)
everything_set = set(os.path.normpath(f) for f in everything_files)
# Archivos en común
common_files = manual_set & everything_set
print(f"🎯 Archivos encontrados por ambos: {len(common_files)}")
# Archivos solo en manual
only_manual = manual_set - everything_set
if only_manual:
print(f"📁 Solo en búsqueda manual: {len(only_manual)}")
for file in only_manual:
print(f" - {file}")
# Archivos solo en Everything3
only_everything = everything_set - manual_set
if only_everything:
print(f"🚀 Solo en Everything3: {len(only_everything)}")
for file in only_everything:
print(f" - {file}")
# Exactitud
if len(manual_files) > 0:
accuracy = (
len(common_files) / max(len(manual_files), len(everything_files))
) * 100
print(f"✅ Exactitud: {accuracy:.1f}%")
print()
# ========================================
# RESUMEN EJECUTIVO
# ========================================
print("📋 RESUMEN EJECUTIVO")
print("=" * 60)
print(f"🔍 Búsqueda Manual:")
print(f" ⏱️ Tiempo: {manual_time:.4f}s")
print(f" 📊 Archivos: {len(manual_files)}")
print(f"🚀 Everything3 API:")
print(f" ⏱️ Tiempo: {everything_time:.4f}s")
print(f" 📊 Archivos: {len(everything_files)}")
print(f"📈 Mejora de rendimiento:")
if manual_time > 0:
print(f"{speed_improvement:.2f}x más rápido")
print(f" 💾 {time_saved:.4f}s ahorrados ({percentage_faster:.1f}%)")
# Recomendación
print()
print("💡 RECOMENDACIÓN:")
if everything_time < manual_time and len(everything_files) >= len(manual_files):
print("✅ Usar Everything3 API - Mejor rendimiento y precisión")
elif everything_time < manual_time:
print("⚖️ Everything3 API es más rápido pero revisa la precisión")
else:
print("⚠️ Evaluar caso por caso - Manual puede ser más confiable")
return results
def run_multiple_tests(iterations: int = 3):
"""Ejecutar múltiples tests para obtener promedio"""
print(f"🔬 Ejecutando {iterations} iteraciones para obtener promedio...")
print()
manual_times = []
everything_times = []
for i in range(iterations):
print(f"📊 Iteración {i+1}/{iterations}")
results = run_speed_test()
if results:
manual_times.append(results["manual"]["time"])
everything_times.append(results["everything3"]["time"])
print()
print("-" * 80)
print()
# Calcular promedios
if manual_times and everything_times:
avg_manual = sum(manual_times) / len(manual_times)
avg_everything = sum(everything_times) / len(everything_times)
print("📊 PROMEDIO DE MÚLTIPLES TESTS")
print("=" * 60)
print(f"🔍 Manual promedio: {avg_manual:.4f}s")
print(f"🚀 Everything3 promedio: {avg_everything:.4f}s")
if avg_manual > 0:
avg_improvement = avg_manual / avg_everything
print(f"⚡ Everything3 es {avg_improvement:.2f}x más rápido en promedio")
if __name__ == "__main__":
try:
# Test único
run_speed_test()
print("\n" + "=" * 80 + "\n")
# Test múltiple para promedio
run_multiple_tests(3)
except KeyboardInterrupt:
print("\n⏸️ Test interrumpido por el usuario")
except Exception as e:
logger.error(f"Error en test de velocidad: {e}")
print(f"❌ Error en test: {e}")