Advance Guide

Performa & Tolok Ukur (Benchmarks)

Latensi inferensi, konsumsi memori, dan perbandingan tolok ukur pada x86_64, ARM64, dan perangkat ponsel.

RustO! dirancang dari dasar untuk menghadirkan inferensi OCR dengan latensi sangat rendah dan efisiensi memori tinggi, baik di server maupun perangkat edge ponsel.

📊 Matriks Tolok Ukur Lintas Perangkat Keras

Diuji menggunakan dokumen faktur A4 standar (150 DPI, ~1200×1700 px, ~25 blok teks) dengan model PP-OCRv6 Tiny:

Platform Perangkat KerasLatensi DeteksiLatensi Pengenalan (Batch 6)Total LatensiPuncak Memori (RAM)
AMD Ryzen 9 7950X (16-Core)~32 ms~48 ms⚡ ~80 ms~85 MB
Apple M3 Max (macOS)~28 ms~42 ms⚡ ~70 ms~92 MB
Intel Core i7-13700K~35 ms~52 ms⚡ ~87 ms~88 MB
Apple iPhone 15 Pro (A17 Pro)~45 ms~65 ms⚡ ~110 ms~65 MB
Snapdragon 8 Gen 3 (Android)~52 ms~78 ms⚡ ~130 ms~72 MB
Raspberry Pi 5 (Broadcom 2.4GHz)~140 ms~210 ms⚡ ~350 ms~110 MB

🏎️ Perbandingan: RustO! vs Pipeline OpenCV + ONNX C++

DimensiRustO! (Rust Murni + RTen)Pipeline OpenCV + ONNX C++Keunggulan
Ukuran Biner Inti~5 MB (Mandiri)~55 MB+ (libopencv, onnxruntime shared libs)📦 10x lebih kecil
Paritas Akurasi99.3%+Tolok Ukur (100%)🎯 Kotak batas identik
Puncak Konsumsi Memori~85 MB - 120 MB~250 MB - 350 MB🔒 50%+ lebih hemat RAM
Marshaling C/C++Tanpa overhead (Buffer Rust murni)Penyalinan larik Mat-ke-Tensor terus-menerus⚡ Eliminasi salin memori
Keamanan ThreadAman memori (borrow checker Rust)Pointer manual & kunci thread rawan konflik🛡️ Bebas data race

⚡ Optimasi Performa di RustO!

1. Pra-pemrosesan Gambar dalam Rust Murni

Pipeline OCR tradisional sangat bergantung pada pustaka bersama OpenCV yang berat untuk penskalaan ukuran, dilatasi morfologi, dan pelacakan kontur. RustO! mengimplementasikan seluruh algoritma tersebut langsung dalam Rust murni dengan vektorisasi otomatis SIMD.

2. Paralelisme Multi-Inti via Rayon

Setelah detektor DBNet menemukan poligon teks, pemotongan perspektif afinitas, perataan, dan persiapan tensor batch didistribusikan ke seluruh inti CPU yang tersedia melalui pustaka Rayon:

// Pemotongan kotak kandidat teks diproses secara paralel antar-thread:
let crop_imgs: Vec<Mat> = padded_boxes.par_iter().map(|b| {
    get_rotate_crop_image(&padded, b).unwrap()
}).collect();

3. Profil Kompilator Release Agresif

Profil release produksi mengaktifkan Fat Link-Time Optimization (LTO), kompilasi unit codegen tunggal, dan penghapusan kode mati secara menyeluruh:

[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
strip = true
panic = "abort"