Rust avanti del 3,7%
Nella campagna controllata 0.3.1, LAI ha registrato 6.870 req/s contro 7.122 req/s di Rust. È il punto da cui siamo partiti.
BENCHMARK · EVIDENZA PUBBLICA
Misuriamo sullo stesso hardware, alterniamo l’ordine dei processi e conserviamo anche gli esperimenti scartati. Le differenze molto piccole richiedono una macchina isolata.
ULTIMA CAMPAGNA / JSON-TEXT / 20.08.2026
PERCHÉ RUST / CONFRONTO
Rust non è un avversario. È uno dei riferimenti più esigenti per software nativo: produce binari efficienti, non richiede un garbage collector e porta molte garanzie di sicurezza al momento della compilazione.
Confrontare LAI soltanto con linguaggi interpretati avrebbe mostrato soprattutto la differenza tra architetture. Rust alza l’asticella e ci permette di capire se le scelte di LAI reggono davanti a una soluzione già matura e progettata per le prestazioni.
Perché Rust punta a prestazioni e affidabilitàNon è una classifica universale dei linguaggi. Il confronto vale per lo stesso carico, lo stesso protocollo e lo stesso hardware documentato.
RISULTATO / 0.9
Il profilo autenticato è passato da una funzione C manuale a nove righe LAI tipizzate. Il compilatore verifica capability, segreti e budget, poi integra il percorso nel binario nativo senza una VM.
| Misura | C manuale 0.8 | LAI 0.9 | Lettura |
|---|---|---|---|
| Token sorgente, o200k | 156 | 41 | −73,72% |
| Throughput paired | 1,000000× | 0,992285× | Parità nel rumore |
| Binario ELF | 99.864 B | 93.384 B | −6,49% |
| Test profilo concorrente | 256/256 | 256/256 | Zero errori |
RISULTATO / 0.9 ALPHA 2
auth produce un Result tipizzato. Il programma deve dichiarare sia il percorso autenticato sia quello non autorizzato: nessun ramo implicito, nessun valore di sessione usato prima del controllo.
| Misura | Alpha 1 | Alpha 2 | Lettura |
|---|---|---|---|
| Token sorgente, o200k | 41 | 53 | +12 per due rami espliciti |
| Riduzione rispetto al C | −73,72% | −66,03% | 103 token in meno |
| Throughput paired | 1,000000× | 0,996748× | Parità nel rumore |
| Binario ELF | 93.384 B | 93.384 B | Invariato |
RISULTATO / 0.9 ALPHA 3
Il ramo autenticato ora contiene più istruzioni tipizzate. Un modulo racchiude gli handler in un secondo limite di capability e operazioni, poi viene risolto interamente durante la compilazione.
| Misura | Alpha 2 | Alpha 3 | Lettura |
|---|---|---|---|
| Token handler, o200k | 53 | 59 | +6 per la proiezione esplicita |
| Handler + manifesto | — | 92 | −41,03% rispetto al C |
| Binario ELF | 93.384 B | 93.384 B | Invariato |
| SHA-256 del server | d93e28…f857 | d93e28…f857 | Identico byte per byte |
RISULTATO / 0.9 ALPHA 4
Registrazione e login ora gestiscono in LAI tutti gli esiti chiusi dei connettori. Le primitive native di sicurezza restano le stesse: normalizzazione, Argon2id, query preparate, lavoro costante sul rifiuto, limiti adattivi, sessioni e audit.
| Misura | Riferimento | Alpha 4 | Lettura |
|---|---|---|---|
| Token register, o200k | C 250 | LAI 80 | −68,00% |
| Token login, o200k | C 274 | LAI 86 | −68,61% |
| Token combinati | C 524 | LAI 166 | −68,32% |
| Binario ELF | Alpha 3: 93.384 B | 93.384 B | Invariato |
Sezione .text | 74.632 B | 74.768 B | +136 B |
| Login paired | 1,000000× | 0,993042× | Parità nel rumore |
RISULTATO / 0.9 ALPHA 5
Logout completa la migrazione dei quattro handler. Sessione e CSRF sono segreti di tipo diverso; successo, sessione assente, CSRF rifiutato ed errore interno devono essere gestiti tutti prima di produrre il binario.
| Misura | Riferimento | Alpha 5 | Lettura |
|---|---|---|---|
| Token logout, o200k | C 222 | LAI 73 | −67,12% |
| Quattro handler, o200k | C 902 | LAI 301 | 601 token in meno |
| Binario ELF | Alpha 4: 93.384 B | 93.384 B | Invariato |
Sezione .text | 74.768 B | 74.764 B | −4 B |
| Logout paired | 1,000000× | 0,951973× | Parità non conclusiva |
| Suite di sicurezza | Alpha 4 verde | Alpha 5 verde | CSRF e revoca invariati |
RISULTATO / 0.9 ALPHA 6
Un catalogo limitato dichiara firme, tipi, vincoli, simboli nativi, esiti e risposte dei quattro connettori. Gli handler usano una sola istruzione call; il catalogo viene verificato in compilazione e non entra nel servizio.
| Misura | Riferimento | Alpha 6 | Lettura |
|---|---|---|---|
| Quattro handler, o200k | C 902 | LAI 309 | −65,74% |
| Contratto completo LAI | C 902 | 735 | −18,51% |
| Costo catalogo condiviso | Assente nel C | 350 token | 87,5 per handler |
| Binario ELF | Alpha 5: 93.384 B | 93.384 B | Invariato |
Sezione .text | 74.764 B | 74.908 B | +144 B |
| Profilo paired | 1,000000× | 1,030774× | Parità nel rumore |
RISULTATO / 0.9 ALPHA 7
Logout non delega più tutto a un unico connettore. LAI autentica la sessione, passa la vista interna alla verifica CSRF e autorizza la revoca soltanto dopo due match esaustivi. Il compilatore blocca risultati saltati e rami d’errore che tentano di proseguire.
| Misura | Riferimento | Alpha 7 | Lettura |
|---|---|---|---|
| Quattro handler, o200k | C 902 | LAI 356 | −60,53% |
| Contratto completo LAI | C 902 | 825 | −8,54% |
| Binario ELF | Alpha 6: 93.384 B | 93.440 B | +56 B |
Sezione .text | 74.908 B | 75.624 B | +716 B |
| Logout paired | 1,000000× | 1,006925× | Parità nel rumore |
| Catena verificata | 1 connettore | 3 capability | Controllo statico |
RISULTATO / 0.9 ALPHA 8
guard compatta i match intermedi soltanto quando il catalogo rende ogni rifiuto unico e fail-closed. Il compilatore ricostruisce lo stesso albero esaustivo di Alpha 7; il match finale resta visibile nel sorgente.
| Misura | Alpha 7 | Alpha 8 | Lettura |
|---|---|---|---|
| Token logout, o200k | 122 | 98 | −19,67% |
| Quattro handler, o200k | 356 | 332 | −24 token |
| Contratto completo LAI | 825 | 801 | −11,20% rispetto al C |
| C generato, SHA-256 | 5dfa5f…a982 | 5dfa5f…a982 | Identico byte per byte |
| Candidato ELF pre-etichetta | b1f9b6…bdbf | b1f9b6…bdbf | Identico byte per byte |
| ELF di release | b1f9b6…bdbf | 35e17d…feacb | 21 byte: etichetta e build ID |
| Suite di sicurezza | Verde | Verde | ASAN, UBSAN e TSAN inclusi |
RISULTATO / 0.9 ALPHA 9
Una IR tipizzata conserva soltanto guardie, chiamate, rami chiusi e risorse necessarie. Da quella prova il compilatore emette direttamente assembly Linux x86-64: nessuna VM, nessun heap, nessuna copia C inutilizzata nel servizio.
| Misura isolata | C, GCC -O2 | Alpha 9 nativo | Lettura |
|---|---|---|---|
| Codice collegato | 328 B | 269 B | −17,99% |
| Mediana, 5 processi | 1,000× | 0,956× | −4,4% tempo |
| Frame locale | Gestito da GCC | 48 B esatti | Azzerato |
| Casi differenziali | 10/10 | 10/10 | Identici |
| Suite reale | Oracle C | Verde | PASS |
RISULTATO / 0.9 ALPHA 10
Il logout concatena autenticazione, verifica CSRF e revoca direttamente dalla IR. Il compilatore assegna una vista di sessione da 48 byte, la azzera alla fine e condivide la guardia del portale con il profilo invece di duplicarla.
| Misura | C | Nativo | Lettura |
|---|---|---|---|
| Simbolo logout | 449 B | 270 B | −39,87% |
| Modulo .text | 28.517 B | 28.501 B | −16 B |
| Differenziale | 16/16 | 16/16 | Identici |
| Stub LTO | 1,000× | 1,081× | C avanti |
| HTTP, 9 coppie | 1,000× | 0,996× | Parità, 0,798–1,267 |
RISULTATO / 0.9 ALPHA 11
Una sola occorrenza incorpora la guardia. Più percorsi bilanciati la condividono. Se almeno l’80% delle osservazioni appartiene a un handler, il compilatore specializza quel percorso senza aggiungere contatori o decisioni al servizio in esecuzione.
| Misura | Condivisa | Inline | Lettura |
|---|---|---|---|
| Portale .text | 28.501 B | 28.593 B | Inline +92 B |
| Logout isolato, 7 processi | 1,000× | 0,920–0,961× | Inline sempre avanti |
| Profilo isolato, 7 processi | 1,000× | 0,932–0,961× | Inline sempre avanti |
| HTTP profilo, 9 coppie | 1,000× | 0,993× | Parità, 0,926–1,169 |
| HTTP logout, 9 coppie | 1,000× | 0,987× | Parità, 0,823–1,439 |
| Differenziale logout | 16/16 | 16/16 | Identici |
RISULTATO / 0.9 ALPHA 12
Registrazione e login completano il backend diretto. Il compilatore accetta soltanto i loro piani tipizzati di due operazioni, non copia email o password e invia ogni risultato sconosciuto alla risposta interna fail-closed.
| Misura | C | Nativo | Lettura |
|---|---|---|---|
| Simbolo register, guardia condivisa | 359 B | 166 B | −53,76% |
| Simbolo login, guardia condivisa | 367 B | 178 B | −51,50% |
| Register diretto, 7 processi | 1,000× | 0,944× | Nativo −5,6% |
| Login diretto, 7 processi | 1,000× | 0,946× | Nativo −5,4% |
| Portale .text | 28.501 B | 28.309 B | −192 B |
| HTTP login, 7 coppie | 1,000× | 0,982× | Parità, 0,953–1,022 |
| Differenziale, due layout | 25/25 | 25/25 | Identici |
RISULTATO / 0.9 ALPHA 13
Il compilatore riconosce una forma strutturale: una chiamata bounded, risultati esaustivi e terminali, fallback chiuso. Il nuovo handler status arriva direttamente in x86-64 senza che il compilatore conosca il suo nome.
| Misura | C generato | Nativo generico | Lettura |
|---|---|---|---|
| Simbolo status | 299 B | 255 B | −44 B |
| Casi differenziali | 7/7 | 7/7 | Identici |
| ASAN + UBSAN | PASS | PASS | Nessun errore |
| Allocazioni heap | 0 nel piano | 0 | Assenti |
RISULTATO / 0.9 ALPHA 14
Il tipo text porta il titolo di un progetto dal body JSON al connettore nativo. Il decoder accetta un oggetto piatto con sole stringhe UTF-8, rifiuta campi inattesi, duplicati, valori annidati ed escape invalidi.
| Misura | Riferimento | Alpha 14 | Lettura |
|---|---|---|---|
| Test compilatore | 45 Alpha 13 | 47/47 | Tutti verdi |
| Casi JSON espliciti | Nuovo | 11/11 | PASS |
| Input pseudo-casuali | Nuovo | 50.000 | ASAN + UBSAN verdi |
| Differenziale project_create | C 10/10 | Nativo 10/10 | Identici |
| Simbolo project_create | C 343 B | Nativo 315 B | −28 B |
RISULTATO / 0.7
Sette coppie alternate, 14 milioni di richieste totali, zero errori. Il confronto paired riduce l’effetto dell’ordine ma non elimina il rumore della VPS.
| Misura | LAI 0.7 | Rust | Lettura |
|---|---|---|---|
| Mediana separata | 55.153 req/s | 53.422 req/s | LAI +3,24% |
| Rapporto paired | 0,988754× | 1,000000× | LAI −1,12% |
| Picco RSS | 292 KiB | 10.396 KiB | LAI ~35× meno |
| Errori | 0 | 0 | Parità |
STORIA / NON SOLO RECORD
Nella campagna controllata 0.3.1, LAI ha registrato 6.870 req/s contro 7.122 req/s di Rust. È il punto da cui siamo partiti.
Un’ottimizzazione non ha superato il criterio paired. È rimasta documentata e non è stata promossa come versione migliore.
292 KiB contro 10.396 KiB di Rust, con velocità vicina e nessun errore osservato in 14 milioni di richieste.
41 token contro 156 per la funzione C equivalente. La suite completa resta verde e il confronto paired non mostra una differenza di velocità conclusiva.
Alpha 2 conserva dimensione e prestazioni native. Il sorgente resta più corto del C del 66,03%, includendo ora entrambi gli esiti verificati dal compilatore.
Alpha 3 verifica percorsi, capability e budget in compilazione. Il server risultante ha lo stesso hash di alpha 2: nessun loader o costo dinamico aggiunto.
Alpha 4 genera profile, register e login. I due handler migrati richiedono 358 token in meno dell’orchestrazione C equivalente, a parità di dimensione del file e di memoria fissa.
Alpha 5 tipizza logout e separa sessione da CSRF. I quattro handler richiedono 601 token in meno del C equivalente; ELF e memoria fissa restano invariati.
Alpha 6 sostituisce quattro primitive del compilatore con una call generica e un catalogo verificato. Il contratto completo resta più compatto del C, senza loader a runtime.
Alpha 7 separa autenticazione, verifica CSRF e revoca. Il binario cresce di 56 byte, la memoria fissa non cambia e il confronto paired resta in parità.
Alpha 8 elimina 24 token dal logout composto. C generato e candidato nativo restano identici; la release cambia soltanto etichetta pubblica e build ID.
Alpha 9 emette il profilo in assembly x86-64. Il simbolo scende da 328 a 269 byte; dieci casi differenziali e la suite completa restano verdi.
Alpha 10 concatena tre capability con una sola vista segreta. La guardia condivisa porta il modulo 16 byte sotto il riferimento, mentre il test HTTP resta in parità e il limite LTO viene pubblicato.
Alpha 11 usa occorrenze e osservazioni per scegliere tra guardia condivisa e inline. Il microtest premia inline, HTTP resta in parità e il comportamento predefinito conserva i byte di Alpha 10.
Alpha 12 porta register e login direttamente da IR ad assembly, senza copiare segreti. I simboli si dimezzano, il microtest migliora e il confronto HTTP resta correttamente dentro il rumore del lavoro reale.
Alpha 13 compila status senza una regola legata al suo nome. C e assembly concordano in 7 casi su 7; il simbolo nativo misura 44 byte in meno nel probe locale.
Alpha 14 aggiunge il primo project_create bounded. Il decoder supera 11 casi espliciti, 50.000 input pseudo-casuali e i sanitizer; persistenza e transazioni sono il prossimo confine.
SICUREZZA / 0.8–0.9
Il portale di autenticazione viene testato sul ciclo reale, non solo su funzioni isolate.
portal image / 4.816 MiBfrontend / 0 frameworkexternal CDN / 0METODO / LIMITI
Carichi del provider, scheduler e rete possono spostare differenze inferiori a pochi punti percentuali.
Il test route isola un percorso critico. Database, I/O e logica di dominio richiedono campagne separate.
Abbiamo misurato i quattro handler equivalenti. Il risparmio di output di un agente su un’applicazione completa richiede ancora prompt, tentativi e correttezza controllati.
Difese, limiti e test riducono il rischio. Non sostituiscono aggiornamenti, audit e gestione corretta dell’infrastruttura.
Il prossimo passo è collegare i nuovi contratti JSON a connettori CRUD e transazioni bounded, poi misurare un flusso Bafify completo prodotto da un coding agent.
Vedi il prossimo passo