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.

ScenarioCounterStrikeSharpSource2ModSwiftlyS2ModSharp
Entities
Create 1024 entities266.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 entities8.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 entities3.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 entities1.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 entities4.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 Entities1.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 Rules110 µ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 ConVar5 µ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 times240 µ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 times1.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 timesempty in profiler1180 µ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 Players20 µs7 µs – 400 µs · 3,725×20 µs8 µs – 130 µs · 3,845×failed33 µs1 µs – 730 µs · 3,847×
Send NetMessage to All Players20 µs8 µs – 290 µs · 3,725×10 µs9 µs – 130 µs · 3,845×failed33 µs<1 µs – 2.13 ms · 3,847×
CMsgSosStartSoundEvent Add All RecipientsServer sends NetMessage, 1024 times31.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 timesno client4no client4no client4no client4
  1. 1CounterStrikeSharp's reference profiler has the replication call commented out, so the row times an empty block.
  2. 2ModSharp's reference profiler does not implement ConVar replication.
  3. 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.
  4. 4Only real clients send CCLCMsg_Move and the run had bots only. Of the reference profilers only SwiftlyS2 implements the handler.
  5. 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.

FrameworkRSS beforeRSS end of testRSS +30 sKept after testManaged heap before / after / after GC
CounterStrikeSharp1256.3 MB1304.4 MB1308.6 MB+52.3 MB2.4 / 55.8 / 11.4 MB
Source2Mod1044.0 MB1043.1 MB1037.8 MB-6.2 MB—
SwiftlyS21135.9 MB1221.2 MB1199.0 MB+63.1 MB4.1 / 31.6 / 5.8 MB
ModSharp1311.8 MB1345.2 MB1337.7 MB+25.9 MB23.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 times10 µs9 µs – 130 µs
Write ConVarg_pSource2ModConVars · 1024 times7.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.