Rust

Rust

装置を速くしても0.6%だった — 犯人はNE2000の受信リングで、wgetが3倍になった【rustx86 ネットワーク編 #5】

連載「rustx86 ネットワーク編」: Rust + WebAssembly の x86 エミュレータをインターネットに繋ぐまでの開発記。#1 は SLiRP backend「wsslirp」(Go + gVisor netstack)、...
Rust

wget https:// が通るまでの壁は6枚あった — MMX・SSE2の語彙・RTC・CA束【rustx86 ネットワーク編 #4】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backend「wsslirp」(Go + gVisor netstack)、#2はIS...
Rust

sleep 3 が20msで返る — PCIバスとRTL8029をRustで実装したら、真犯人はx87 FPUだった【rustx86 ネットワーク編 #3】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backendとなるユーザーモードNATデーモン「wsslirp」(Go + gViso...
16bit

1993年のDOSから ping 1.1.1.1 — ISAバスのNE2000をRustで実装する【rustx86 ネットワーク編 #2】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backendとなるユーザーモードNATデーモン「wsslirp」(Go + gViso...
Rust

ブラウザだけ1.5倍遅い — WebWorkerの setTimeout(0) が4msずつ止まっていた (JavaScript/WebAssembly)

自作x86エミュレータ rustx86 には、ずっと説明のつかない数字があった。同じwasmバイナリなのに、Node.js (headless) では14秒で終わるLinuxブートが、ブラウザだと21秒かかる。約×1.5。タブの描画やpos...
Rust

469行に膨らんだ台帳をDiátaxisで3冊に割った — Markdownだけのドキュメント管理

開発が進むとドキュメントは必ずだれる。rustx86 では性能台帳の perf.md が469行に膨らみ、開いても目当ての数字にたどり着けなくなった。ツールを導入せず、分類の型 (Diátaxis) と運用規約6条だけで立て直した記録である...
Rust

LLVMのPGOでRust製x86エミュレータが25%速くなった。それでも採用を見送った理由

自作x86エミュレータ rustx86 で、LLVMのPGO (Profile-Guided Optimization) を試したらネイティブ実行が約25%速くなった。交互A/B 5周全勝、意味論の後退なし。そして、採用を見送った。「効いた...
Rust

Rust+WebAssemblyのx86エミュレータにJITを育てる — 「1bitも変わらない」証明がバグを2匹仕留めた

ブラウザで32bit Linuxを起動する自作x86エミュレータ rustx86 に、テンプレートJITを育てている。前回はレジスタ間演算だけの骨格 (F1a) を通し、「JITを有効にしても命令数もシリアル出力もビット同一」を3つのISA...
16bit

Rust + WASM の x86 エミュレータで ELKS のテトリスが即ゲームオーバーになる — 犯人は HLT 早送りの時間会計だった

自作の x86 エミュレータ rustx86 (Rust + WebAssembly、ブラウザで 16bit UNIX や 32bit Linux が動く) で、ELKS 0.9.1 のテトリスを起動すると駒が一瞬で積み上がり、Bye! Y...
Rust

自作x86エミュレータ (Rust) のベンチマークが嘘をついていた — 固定3.7億命令のはずが200億命令走っていた話

自作のx86エミュレータには、開発初期から実行速度ベンチマークがある。命令数が固定のワークロードを流し、環境が変わってもMIPSを比較できるようにした自慢の仕組みだった。そのベンチが、ずっと別のものを測っていたことが今日わかった。UIの配色...