Benchmarks · 13 October 2026
The same profiler, four frameworks, one server
CounterStrikeSharp, Source2Mod, SwiftlyS2 and ModSharp each ran the scenarios of the Swiftly team's framework profiler alone on the same Linux dedicated server, with the same bots. Every value is the time one sample of the scenario took.
- Game build
- 1.41.9.0
- Map
- de_dust2, competitive
- Bots
- 20
- Test
- 60 s per framework
Fastest per scenario
CounterStrikeSharp
v1.0.376
0
of 14 compared scenarios
Source2Mod
local build
12
of 14 compared scenarios
SwiftlyS2
v1.4.14
0
of 14 compared scenarios
ModSharp
git-187
2
of 14 compared scenarios
Results
Average per sample
Min and max below each average. Green is the fastest average in the row, red the slowest. The profilers time in microseconds, so anything under 1 µs reads as <1 µs.
| Scenario | CounterStrikeSharp | Source2Mod | SwiftlyS2 | ModSharp |
|---|---|---|---|---|
| Entities | ||||
| Create 1024 entities | 266.80 ms266.80 ms – 266.80 ms · 1× | 4.23 ms4.23 ms – 4.23 ms · 1× | 5.83 ms5.83 ms – 5.83 ms · 1× | 6.80 ms6.80 ms – 6.80 ms · 1× |
| Spawn 1024 entities | 8.99 ms8.99 ms – 8.99 ms · 1× | 3.30 ms3.30 ms – 3.30 ms · 1× | 6.76 ms6.76 ms – 6.76 ms · 1× | 7.23 ms7.23 ms – 7.23 ms · 1× |
| Despawn entity51 entity | <1 µs<1 µs – 350 µs · 1,029× | <1 µs<1 µs – 1 µs · 1,025× | <1 µs<1 µs – 140 µs · 1,030× | <1 µs<1 µs – 70 µs · 1,024× |
| Schema Write + Update1024 entities | 3.99 ms3.99 ms – 3.99 ms · 1× | 390 µs390 µs – 390 µs · 1× | 1.08 ms1.08 ms – 1.08 ms · 1× | 4.90 ms4.90 ms – 4.90 ms · 1× |
| Schema Read1024 entities | 1.08 ms1.08 ms – 1.08 ms · 1× | 6 µs6 µs – 6 µs · 1× | 310 µs310 µs – 310 µs · 1× | 490 µs490 µs – 490 µs · 1× |
| Virtual Callsteleport 1024 entities | 4.55 ms4.55 ms – 4.55 ms · 1× | 160 µs160 µs – 160 µs · 1× | 520 µs520 µs – 520 µs · 1× | 320 µs320 µs – 320 µs · 1× |
| Teleport All Game Entities | 1.16 ms670 µs – 43.06 ms · 3,725× | 410 µs280 µs – 1.45 ms · 3,845× | 540 µs400 µs – 14.46 ms · 1,972× | 590 µs320 µs – 3.21 ms · 3,847× |
| Get Game Rules | 110 µs70 µs – 38.24 ms · 3,725× | <1 µs<1 µs – 40 µs · 3,845× | 4 µs1 µs – 2.34 ms · 1,972× | 1 µs<1 µs – 70 µs · 3,847× |
| ConVars | ||||
| Find ConVar | 5 µs1 µs – 570 µs · 3,725× | 1 µs<1 µs – 30 µs · 3,845× | 10 µs3 µs – 240 µs · 1,972× | 7 µs1 µs – 140 µs · 3,847× |
| Read ConVar1024 times | 240 µs210 µs – 39.13 ms · 3,725× | <1 µs<1 µs – 1 µs · 3,845× | 1 µs1 µs – 90 µs · 1,972× | 1 µs1 µs – 90 µs · 3,847× |
| Write ConVar1024 times | 1.17 ms1.00 ms – 35.37 ms · 3,725× | <1 µs<1 µs – 50 µs · 3,845× | 1.30 ms1.20 ms – 3.38 ms · 1,972× | 810 µs700 µs – 1.77 ms · 3,847× |
| Replicate ConVar to Client1024 times | empty in profiler1 | 180 µs160 µs – 1.11 ms · 76,900× | 1.20 ms850 µs – 30.80 ms · 39,440× | not implemented2 |
| Events and net messages | ||||
| Fire Game Event to Players | 20 µs7 µs – 400 µs · 3,725× | 20 µs8 µs – 130 µs · 3,845× | failed3 | 3 µs1 µs – 730 µs · 3,847× |
| Send NetMessage to All Players | 20 µs8 µs – 290 µs · 3,725× | 10 µs9 µs – 130 µs · 3,845× | failed3 | 3 µs<1 µs – 2.13 ms · 3,847× |
| CMsgSosStartSoundEvent Add All RecipientsServer sends NetMessage, 1024 times | 31.03 ms26.04 ms – 69.05 ms · 1,212× | <1 µs<1 µs – 30 µs · 1,240× | 3 µs1 µs – 40 µs · 645× | 140 µs130 µs – 320 µs · 1,235× |
| Client messages | ||||
| CCLCMsg_Move Simulate DataServer receives NetMessage, 1024 times | no client4 | no client4 | no client4 | no client4 |
- 1CounterStrikeSharp's reference profiler has the replication call commented out, so the row times an empty block.
- 2ModSharp's reference profiler does not implement ConVar replication.
- 3SwiftlyS2’s profiler threw “The event is invalid” from its game event setter on this build; the exception ends the tick, so these two rows never completed.
- 4Only real clients send CCLCMsg_Move and the run had bots only. Of the reference profilers only SwiftlyS2 implements the handler.
- 5Every framework despawns in under 1 µs on average; the row is a tie.
Memory
What stays after the test
Resident memory of the whole server process before the test, at its end and 30 s after endtest, and the managed heap the C# profilers report. Source2Mod has no garbage-collected heap.
| Framework | RSS before | RSS end of test | RSS +30 s | Kept after test | Managed heap before / after / after GC |
|---|---|---|---|---|---|
| CounterStrikeSharp | 1256.3 MB | 1304.4 MB | 1308.6 MB | +52.3 MB | 2.4 / 55.8 / 11.4 MB |
| Source2Mod | 1044.0 MB | 1043.1 MB | 1037.8 MB | -6.2 MB | — |
| SwiftlyS2 | 1135.9 MB | 1221.2 MB | 1199.0 MB | +63.1 MB | 4.1 / 31.6 / 5.8 MB |
| ModSharp | 1311.8 MB | 1345.2 MB | 1337.7 MB | +25.9 MB | 23.8 / 62.0 / 24.2 MB |
Source2Mod API rows
The ConVar rows above use direct access, as the other frameworks' getters and setters do. Through g_pSource2ModConVarsthe same writes go through the engine's setter, which runs change callbacks and replicates every write to all clients.
| Find ConVarg_pSource2ModConVars | <1 µs<1 µs – 30 µs |
|---|---|
| Read ConVarg_pSource2ModConVars · 1024 times | 10 µs9 µs – 130 µs |
| Write ConVarg_pSource2ModConVars · 1024 times | 7.01 ms6.66 ms – 10.83 ms |
Method
Each framework ran alone: its own loader, its own profiler, no other plugins, the server's addons and gameinfo.gi restored between runs. Bots were added over RCON the same way every time; a vanilla competitive server takes 10 per team. Then starttest, 60 s of ticks, endtest and savetest.
The CounterStrikeSharp, SwiftlyS2 and ModSharp profilers are the reference ones from swiftly-solution/profiler, built unchanged except for the framework package versions. The Source2Mod profiler is an independent C++ implementation of the same scenarios.
Scenarios, sizes, names and trace format by the Swiftly Development Team.