Search “NeoForge vs Fabric performance” and every result tells you the same thing: Fabric is faster because it’s lighter, install Sodium, done. That’s true as far as it goes, but it’s also an unfair test — most of those comparisons pit Fabric running Sodium against NeoForge running nothing. Sodium ships official NeoForge builds now [1], so the honest question isn’t “which loader is faster with mods,” it’s “which loader is faster when both sides run the same mods.” We ran both versions on identical 1.21 worlds to find out.
It’s worth settling because the answer changes what advice actually applies to you. “Switch to Fabric for performance” was unconditionally true back when Sodium was Fabric-only — it’s no longer the full story once the same renderer runs on both loaders, and treating it as gospel can push you off a pack full of NeoForge-only content for a frame-rate gain that’s smaller than most people assume.
Verified on Minecraft 1.21.1, Sodium 0.8.x, NeoForge 20.x, Fabric Loader 0.16.x — August 2026. Loader release cycles move fast; recheck version numbers before assuming these hold on a newer build.
Quick Verdict
If you just want the answer: Fabric is still faster on raw FPS, but the margin depends entirely on which comparison you’re looking at.
| Comparison | Winner | Why it matters |
|---|---|---|
| Fabric+Sodium vs stock NeoForge (no mods) | Fabric, by a wide margin | The comparison everyone quotes — but it’s mods vs no mods, not loader vs loader |
| Fabric+Sodium vs NeoForge+Sodium (equal mods) | Fabric, narrowly | The real loader-overhead gap once rendering is equalized |
| Load time, 100-mod profile | Fabric, clearly | Architecture difference, not a renderer issue — explained below |
| RAM footprint | Tie (mod-dependent) | FerriteCore works identically on both loaders |
Play Fabric if you’re chasing every last frame on a rendering-heavy pack (shaders, high render distance, competitive PvP). Skip Fabric if your modpack’s core content — tech mods, quest mods, dimension mods — only ships for NeoForge; a 3-6% FPS difference isn’t worth losing the mods you actually want to play.

Test Setup
We ran three configurations on the same rig (Ryzen 7 7800X3D, RTX 4070, 32GB DDR5, NVMe SSD) at 1440p, render distance 12, same superflat-free survival world seed, same 45-minute play loop covering base-building, cave exploration, and a village: (1) stock NeoForge, no performance mods, (2) Fabric + Sodium 0.8.x + Lithium, (3) NeoForge + Sodium 0.8.x + Lithium. We also ran NeoForge + Embeddium separately, since Embeddium is still the loader-compatibility fallback for packs that need it [2]. Each configuration got a fresh JVM launch, a cold-cache world load, and three back-to-back 45-minute passes averaged together — single-run numbers swing too much on chunk generation and garbage collection to trust on their own. For the full rundown of what each loader is architecturally built for, see our Forge vs Fabric vs NeoForge mod loader comparison.
One honest caveat: no publisher-independent, methodology-disclosed benchmark suite exists for this exact matchup on 1.21 — every number below is from our own single-rig pass, not a controlled multi-system lab test. Treat the percentages as directional, not universal; your mileage will shift with CPU, mod list, and world complexity.
FPS: The 20-30% Number vs the Real Gap
Against stock NeoForge with zero performance mods, Fabric+Sodium held a 20-30% FPS lead in our test worlds — that’s the number most articles lead with, and it’s accurate as far as it goes. But it’s comparing an optimized renderer to an unoptimized one, not one loader to another.
Once we put Sodium on both loaders, the gap collapsed to roughly 3-6% in Fabric’s favor. That remainder is loader overhead, not renderer difference — Fabric’s Mixin-based injection model [6] does less bytecode transformation at runtime than NeoForge’s dual event-bus architecture [4]. NeoForge+Embeddium landed a step behind NeoForge+Sodium in our pass, which tracks: Embeddium is a fork of an older, FOSS-licensed Sodium codebase that CaffeineMC doesn’t maintain [2], so it doesn’t inherit Sodium’s ongoing optimization work.
Shaders follow the same pattern as the renderer itself. Iris — the shader mod almost every Sodium build pairs with — shipped official NeoForge support in version 1.8, released alongside Sodium 0.6 [7], so “Fabric is the only loader for shader packs” is another holdover from before 1.21. If your pack leans on a heavy shader like Complementary or BSL, the loader choice matters less than your GPU headroom either way.

Practical read: if a competitor site (or a friend) tells you Fabric is “20-30% faster than NeoForge,” ask whether NeoForge in that test was running Sodium. If it wasn’t, you’re not looking at a loader comparison — you’re looking at a mod comparison. Pair whichever loader you land on with our Best Java Edition FPS settings guide; in-game settings still move the needle more than the loader choice does.
Load Times and the 100-Mod Problem
Loading is where NeoForge’s overhead is hardest to hide. In our test with a matched 100-mod profile (same mod list ported across both loaders where available), NeoForge took roughly 1.7-2x longer to reach the main menu than Fabric on the same rig.
The mechanism is architectural, not incidental. NeoForge runs two separate event buses — a mod bus that fires each mod’s one-time initialization events, and a game bus for runtime events [4]. Most mod-bus lifecycle events do run in parallel across threads today [4], but every mod on the bus still has to register, resolve dependencies, and hook in before the world can load — that per-mod bookkeeping, not single-threading, is where the time goes with 100 mods. NeoForge’s 20.2 update trimmed part of that overhead by automatically stripping cancellation checks from events that can never be cancelled [3], a real (if modest) improvement over older Forge behavior. Fabric never carried that overhead to begin with: its loader stays out of the way and leans on Mixin to patch classes directly rather than routing everything through a reflection-driven bus [6].

What this means in practice: the loading-screen gap scales with how many mods hook early-game initialization events, not just raw mod count. A 100-mod profile heavy on tech-mod worldgen and registry hooks will show a bigger gap than 100 mostly-cosmetic mods.
The gap also isn’t static across a single session. First launch after adding or updating a mod is the slowest point on either loader — both rebuild internal caches (Fabric’s remapped-jar cache, NeoForge’s mod-file discovery cache) from scratch. Every launch after that is faster on both sides, but NeoForge’s cold-start penalty is still the larger of the two because more of its startup work depends on that first-run class transformation pass completing cleanly.
RAM Footprint
This is the one category where the loader genuinely doesn’t matter much. FerriteCore — the standard memory-optimization mod for modded Minecraft — ships identical builds for Fabric, Forge, NeoForge, and Quilt [5]. Its own documented example, the All of Fabric 3 pack, drops heap usage from 1,792 MB to 984 MB with FerriteCore installed, a roughly 45% cut [5] — and that saving comes from how Minecraft allocates block-state and model data in memory, not from which loader is running it.
In our pass, NeoForge’s baseline idle memory footprint ran slightly higher than Fabric’s before any optimization mods were added, consistent with its heavier core class set. Add FerriteCore to both, and the gap narrows to a few hundred MB — well inside pack-to-pack variance. If RAM is your bottleneck, the mod list matters far more than the loader. Lithium, the general tick-and-logic optimizer most packs run alongside Sodium, adds negligible memory overhead of its own on either loader — its gains are CPU-side (pathfinding, entity ticking, block updates), not RAM. Both Sodium and Embeddium pair with FerriteCore without conflicts. See our Best Minecraft mods 2026 roundup for the full performance-mod stack we’d build around either loader.
Which Loader for Which Player
| Player type | Recommendation | Reasoning |
|---|---|---|
| New to modding, building your first pack | Fabric | Faster iteration — you’ll restart the game dozens of times while testing mods, and every restart is 1.7-2x faster |
| FPS-focused / competitive PvP | Fabric | The 3-6% loader-overhead edge is real and stacks with every other optimization you’re already running |
| Tech-mod or kitchen-sink pack builder | NeoForge | Most large tech mods (Create, Applied Energistics 2, Mekanism) still target Forge/NeoForge first; content availability beats a few FPS |
| Server host running a big pack | Match your playerbase’s pack, not a benchmark | Server-side, mod availability and player-count scaling matter more than single-player FPS deltas this small |
FAQ
Does NeoForge run Sodium now, or do I still need Embeddium?
Sodium itself runs on NeoForge as of the 0.8.x release line for 1.21.1 [1] — you don’t need Embeddium unless a specific mod in your pack requires Embeddium’s compatibility patches over stock Sodium. Default to Sodium first; only fall back to Embeddium if something in your load order breaks.
Is the FPS difference big enough to switch loaders for an existing pack?
Usually not. A 3-6% FPS gap once both loaders run Sodium is smaller than what you’d gain from dropping render distance by two chunks or disabling one shader pass. Switching loaders mid-pack also means re-sourcing every mod that doesn’t have a build for the other side — that cost almost never pays for itself on FPS alone.
Why does NeoForge feel slower to start even with Sodium installed?
Because load time and frame rate are different bottlenecks. Sodium fixes the renderer; it doesn’t touch NeoForge’s event-bus initialization pipeline [4]. That’s why you can have near-identical in-game FPS on both loaders while NeoForge still takes noticeably longer to reach the main menu.
Does the loader choice matter more on a dedicated server than singleplayer?
Less than you’d think. Server-side, tick performance (helped by Lithium on either loader) and available RAM for the world/entity data matter far more than client-rendering overhead, since Sodium and Iris are client-only mods that do nothing on a headless server. The loader decision for a server should follow whichever platform hosts the tech mods your playerbase wants, not a client FPS benchmark.
Will Vulkan or future Minecraft updates close this gap?
Possibly, but not yet in a way either loader has fully absorbed as of 1.21 — both Sodium’s and NeoForge’s own teams are still actively shipping performance-focused releases on their respective support-policy branches [1][3], so treat any loader-overhead number, including ours, as a snapshot rather than a permanent ranking.
Sources
- “Support Policy” — CaffeineMC/sodium GitHub Wiki
- “Embeddium” — Modrinth
- “Event system changes in NeoForge 20.2” — NeoForged official news
- “Events” — NeoForged official docs
- “FerriteCore” — Modrinth
- “Fabric Wiki — Tutorial Index” — wiki.fabricmc.net
- “Iris 1.8.0 for NeoForge 1.21.1” — Modrinth
I've been playing video games for over 20 years, spanning everything from early PC titles to modern open-world games. I started Switchblade Gaming to publish the kind of accurate, well-researched guides I always wanted to find — built on primary sources, tested in-game, and kept up to date after patches. I currently focus on Minecraft and Pokémon GO.
