Files
dzy1128-ComfyUI-Vector-Engine/test_optimization.py
T
2025-12-01 16:16:16 +08:00

146 lines
5.3 KiB
Python

"""
Performance test script to compare optimization effects
测试脚本:对比优化前后的性能
"""
import base64
import time
from PIL import Image
import io
def test_compression(image_path, max_sizes=[None, 4096, 2048, 1536], qualities=[100, 95, 85, 75]):
"""
Test different compression settings
"""
print(f"\n{'='*70}")
print(f"Testing image: {image_path}")
print(f"{'='*70}\n")
# Load original image
original_img = Image.open(image_path)
if original_img.mode != 'RGB':
original_img = original_img.convert('RGB')
orig_width, orig_height = original_img.size
print(f"Original size: {orig_width}x{orig_height}")
# Get original file size
with open(image_path, 'rb') as f:
original_file_size = len(f.read()) / 1024
print(f"Original file size: {original_file_size:.1f} KB\n")
results = []
for max_size in max_sizes:
for quality in qualities:
# Prepare image
img = original_img.copy()
# Resize if needed
if max_size is not None:
width, height = img.size
if max(width, height) > max_size:
if width > height:
new_width = max_size
new_height = int(height * (max_size / width))
else:
new_height = max_size
new_width = int(width * (max_size / height))
resize_start = time.time()
img = img.resize((new_width, new_height), Image.LANCZOS)
resize_time = time.time() - resize_start
else:
new_width, new_height = width, height
resize_time = 0
else:
new_width, new_height = img.size
resize_time = 0
# Compress and encode
buffer = io.BytesIO()
encode_start = time.time()
img.save(buffer, format="JPEG", quality=quality, optimize=True)
encode_time = time.time() - encode_start
img_bytes = buffer.getvalue()
compressed_size_kb = len(img_bytes) / 1024
# Base64 encode
base64_start = time.time()
base64_str = base64.b64encode(img_bytes).decode('utf-8')
base64_time = time.time() - base64_start
base64_size_kb = len(base64_str) / 1024
# Total time
total_time = resize_time + encode_time + base64_time
# Compression ratio
compression_ratio = (1 - compressed_size_kb / original_file_size) * 100 if original_file_size > 0 else 0
result = {
'max_size': max_size or 'Original',
'quality': quality,
'dimensions': f"{new_width}x{new_height}",
'compressed_size_kb': compressed_size_kb,
'base64_size_kb': base64_size_kb,
'total_time': total_time,
'compression_ratio': compression_ratio
}
results.append(result)
print(f"Max Size: {str(max_size or 'Original'):>8} | Quality: {quality:>3}% | "
f"Dimensions: {new_width:>4}x{new_height:<4} | "
f"Size: {compressed_size_kb:>6.1f}KB (base64: {base64_size_kb:>6.1f}KB) | "
f"Time: {total_time:.3f}s | "
f"Compression: {compression_ratio:>5.1f}%")
# Recommend best settings
print(f"\n{'='*70}")
print("Recommendations:")
print(f"{'='*70}")
# Find best balance (around 85% quality, reasonable size)
balanced = [r for r in results if r['quality'] == 85 and r['max_size'] == 2048]
if balanced:
r = balanced[0]
print(f"\n✅ Recommended (Balanced):")
print(f" max_size=2048, quality=85")
print(f" Size: {r['compressed_size_kb']:.1f}KB | Time: {r['total_time']:.3f}s | Compression: {r['compression_ratio']:.1f}%")
# Find fastest
fastest = min(results, key=lambda x: x['total_time'])
print(f"\n⚡ Fastest:")
print(f" max_size={fastest['max_size']}, quality={fastest['quality']}")
print(f" Size: {fastest['compressed_size_kb']:.1f}KB | Time: {fastest['total_time']:.3f}s | Compression: {fastest['compression_ratio']:.1f}%")
# Find best compression
best_compression = max(results, key=lambda x: x['compression_ratio'])
print(f"\n📦 Best Compression:")
print(f" max_size={best_compression['max_size']}, quality={best_compression['quality']}")
print(f" Size: {best_compression['compressed_size_kb']:.1f}KB | Time: {best_compression['total_time']:.3f}s | Compression: {best_compression['compression_ratio']:.1f}%")
print()
if __name__ == "__main__":
# Test with sample images
test_images = [
"./assets/girl.png",
"./assets/boy.jpg",
]
for img_path in test_images:
try:
test_compression(img_path)
except Exception as e:
print(f"Error testing {img_path}: {e}")
print(f"\n{'='*70}")
print("Test Complete!")
print(f"{'='*70}")
print("\nCurrent node settings: max_size=2048, quality=85")
print("This provides the best balance of quality, speed, and file size.")