Side by side
Vel vs React
The exact same searchable user list. One compiles to a native binary; the other ships a runtime to the browser.
Vel ≈ 78 tokens
#UserList @users: std::vector<User> = await fetchUsers() @filter = "" V g=md p=lg In placeholder="Search…" value=$filter List of=$users as=u Card -> click => open(u.id) H g=sm Avatar src=$u.avatar V T $u.name font=bold T $u.email fg=fgMuted
React + Tailwind ≈ 182 tokens
import { useState, useEffect } from "react";
export function UserList() {
const [users, setUsers] = useState([]);
const [filter, setFilter] = useState("");
useEffect(() => { fetchUsers().then(setUsers); }, []);
return (
<div className="flex flex-col gap-4 p-6">
<input
className="rounded-md border px-3 py-2"
placeholder="Search…"
value={filter}
onChange={(e) => setFilter(e.target.value)}
/>
{users.map((u) => (
<div
key={u.id}
onClick={() => open(u.id)}
className="flex items-center gap-2 rounded-lg
border p-4 hover:bg-gray-50 cursor-pointer"
>
<img className="h-9 w-9 rounded-full" src={u.avatar} />
<div className="flex flex-col">
<span className="font-bold">{u.name}</span>
<span className="text-gray-500">{u.email}</span>
</div>
</div>
))}
</div>
);
} How they compare
| Vel | React + Tailwind | |
|---|---|---|
| Source tokens (this component) | ≈ 78 | ≈ 182 |
| Token efficiency | 2.33× fewer | baseline |
| Runtime | Native binary | Browser / Electron |
| Warm relayout · 10k rows | ~93× faster | virtualization needed |
| Idle CPU | ~0 (damage-tracked) | reconciler + GC |
| Styling | Theme tokens | Utility classes |
| State | Signals (fine-grained) | Hooks + re-render |
Token counts measured with vel bench token. React snippet is the
idiomatic equivalent; YMMV with abstraction. Methodology in
benchmarks/.