Benchmarks

Tedd.RectanglePacker and other .NET packers, measured.

Four comparisons on the same machine and the same inputs: choosing an atlas size, inserting into the same fixed bin, inserting into a search-selected square for each packer, and writing pixels into an atlas. Size-search charts show time alongside packing density.

4 of 5datasets where MaxRects Balanced, the default, produced the densest atlas among the size-searching libraries
0.6 % vs 2.9 %mean unused atlas area with default settings, versus the densest other library on each dataset
12.6×speed of MaxRects BestShortSideFit versus the quickest other implementation of that heuristic, one thread in the same fixed bin; geometric mean over 5 datasets (range 1.8× to 292×)

2 · Common fixed bin

Same rectangles, same bin.

Every packer receives the same sequence, sorted by descending height then width, and the same square side: the greater of the largest input dimension and ceil(sqrt(total area) × 1.25). One complete insertion pass is timed. Failures remain visible; occupancy is constant for successful packers on each dataset.

Sprites, 1,000

Time in the same fixed bin

One insertion pass into a 2,696 × 2,696 square for every packer. Median wall-clock time; logarithmic scale; shorter is faster.

AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread91 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread275 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread289 µs
RectPacker2Packer · 2.1.0 · 1 thread509 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread573 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.69 ms
Tedd.RectanglePackerSkyline MinWaste · 1 thread2.36 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread3.07 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread4.95 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread26.7 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread525 ms
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread567 ms
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread91 µsmiddle 50%: 86 µs–99 µs2,69663.96 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread275 µsmiddle 50%: 266 µs–297 µs2,69663.96 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread289 µsmiddle 50%: 267 µs–301 µs2,69663.96 %0 B
RectPacker2Packer · 2.1.0 · 1 thread509 µsmiddle 50%: 449 µs–519 µs2,69663.96 %16.2 KiB
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread573 µsmiddle 50%: 536 µs–677 µs2,69663.96 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.69 msmiddle 50%: 1.46 ms–1.78 ms2,69663.96 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread2.36 msmiddle 50%: 2.08 ms–2.46 ms2,69663.96 %0 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread3.07 msmiddle 50%: 2.78 ms–3.29 ms2,69663.96 %186.7 KiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread4.95 msmiddle 50%: 4.92 ms–5.37 ms2,69663.96 %112 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread26.7 msmiddle 50%: 24.9 ms–30.2 ms2,69663.96 %2 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread525 msmiddle 50%: 504 ms–532 ms2,69663.96 %9 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread567 msmiddle 50%: 540 ms–574 ms2,69663.96 %9 B
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 threadFailed: PackingFailedException: Input 962 did not fit.

Glyphs, 2,000

Time in the same fixed bin

One insertion pass into a 1,163 × 1,163 square for every packer. Median wall-clock time; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread45 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread91 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread164 µs
RectPacker2Packer · 2.1.0 · 1 thread169 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread188 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread293 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.32 ms
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread2.78 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread3.49 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread10.9 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread13.3 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread1.14 s
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread1.17 s
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread45 µsmiddle 50%: 40 µs–47 µs1,16363.97 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread91 µsmiddle 50%: 89 µs–112 µs1,16363.97 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread164 µsmiddle 50%: 151 µs–178 µs1,16363.97 %0 B
RectPacker2Packer · 2.1.0 · 1 thread169 µsmiddle 50%: 158 µs–184 µs1,16363.97 %2.1 KiB
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread188 µsmiddle 50%: 174 µs–199 µs1,16363.97 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread293 µsmiddle 50%: 260 µs–330 µs1,16363.97 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.32 msmiddle 50%: 1.20 ms–1.44 ms1,16363.97 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread2.78 msmiddle 50%: 2.54 ms–2.95 ms1,16363.97 %0 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread3.49 msmiddle 50%: 3.30 ms–3.59 ms1,16363.97 %0 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread10.9 msmiddle 50%: 10.4 ms–11.2 ms1,16363.97 %359.0 KiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread13.3 msmiddle 50%: 12.6 ms–13.6 ms1,16363.97 %113 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread1.14 smiddle 50%: 1.13 s–1.15 s1,16363.97 %16 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread1.17 smiddle 50%: 1.16 s–1.19 s1,16363.97 %16 B
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

UI images, 500

Time in the same fixed bin

One insertion pass into a 2,467 × 2,467 square for every packer. Median wall-clock time; logarithmic scale; shorter is faster.

AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread43 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread111 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread130 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread152 µs
RectPacker2Packer · 2.1.0 · 1 thread181 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread346 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread837 µs
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread1.39 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread38.1 ms
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread50.6 ms
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread43 µsmiddle 50%: 40 µs–44 µs2,46764.00 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread111 µsmiddle 50%: 110 µs–113 µs2,46764.00 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread130 µsmiddle 50%: 115 µs–137 µs2,46764.00 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread152 µsmiddle 50%: 147 µs–156 µs2,46764.00 %0 B
RectPacker2Packer · 2.1.0 · 1 thread181 µsmiddle 50%: 172 µs–184 µs2,46764.00 %8.1 KiB
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread346 µsmiddle 50%: 323 µs–352 µs2,46764.00 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread837 µsmiddle 50%: 835 µs–839 µs2,46764.00 %0 B
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread1.39 msmiddle 50%: 1.24 ms–1.45 ms2,46764.00 %112 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread38.1 msmiddle 50%: 36.1 ms–40.5 ms2,46764.00 %3 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread50.6 msmiddle 50%: 48.9 ms–51.2 ms2,46764.00 %4 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 threadFailed: PackingFailedException: Insert returned no placement.
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 threadFailed: PackingFailedException: Input 37 did not fit.
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 threadFailed: PackingFailedException: Input 263 did not fit.

Tiles, 4,096

Time in the same fixed bin

One insertion pass into a 2,673 × 2,673 square for every packer. Median wall-clock time; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread74 µs
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread125 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread218 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread249 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread272 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread302 µs
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread477 µs
RectPacker2Packer · 2.1.0 · 1 thread581 µs
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread587 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread639 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.91 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread3.84 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread43.8 ms
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread74 µsmiddle 50%: 74 µs–76 µs2,67363.97 %0 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread125 µsmiddle 50%: 113 µs–140 µs2,67363.97 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread218 µsmiddle 50%: 173 µs–226 µs2,67363.97 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread249 µsmiddle 50%: 233 µs–271 µs2,67363.97 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread272 µsmiddle 50%: 254 µs–294 µs2,67363.97 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread302 µsmiddle 50%: 261 µs–322 µs2,67363.97 %0 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread477 µsmiddle 50%: 448 µs–549 µs2,67363.97 %0 B
RectPacker2Packer · 2.1.0 · 1 thread581 µsmiddle 50%: 574 µs–610 µs2,67363.97 %2.1 KiB
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread587 µsmiddle 50%: 558 µs–606 µs2,67363.97 %0 B
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread639 µsmiddle 50%: 632 µs–644 µs2,67363.97 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.91 msmiddle 50%: 1.89 ms–1.92 ms2,67363.97 %0 B
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread3.84 msmiddle 50%: 3.80 ms–3.88 ms2,67363.97 %112 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread43.8 msmiddle 50%: 41.8 ms–46.8 ms2,67363.97 %830.7 KiB
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

Sprites, 10,000

Time in the same fixed bin

One insertion pass into a 4,276 × 4,276 square for every packer. Median wall-clock time; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread237 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread588 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread1.07 ms
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread1.70 ms
RectPacker2Packer · 2.1.0 · 1 thread2.14 ms
Tedd.RectanglePackerSkyline MinWaste · 1 thread8.66 ms
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread19.8 ms
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread40.3 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread274 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread352 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.89 s
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread237 µsmiddle 50%: 226 µs–244 µs4,27663.98 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread588 µsmiddle 50%: 568 µs–652 µs4,27663.98 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread1.07 msmiddle 50%: 1.06 ms–1.08 ms4,27663.98 %0 B
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread1.70 msmiddle 50%: 1.67 ms–1.76 ms4,27663.98 %0 B
RectPacker2Packer · 2.1.0 · 1 thread2.14 msmiddle 50%: 2.09 ms–2.19 ms4,27663.98 %4.1 KiB
Tedd.RectanglePackerSkyline MinWaste · 1 thread8.66 msmiddle 50%: 8.15 ms–8.86 ms4,27663.98 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread19.8 msmiddle 50%: 19.3 ms–19.9 ms4,27663.98 %1 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread40.3 msmiddle 50%: 38.1 ms–41.3 ms4,27663.98 %3 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread274 msmiddle 50%: 260 ms–291 ms4,27663.98 %1.9 MiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread352 msmiddle 50%: 344 ms–371 ms4,27663.98 %121 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.89 smiddle 50%: 1.85 s–1.90 s4,27663.98 %16 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 threadSkipped: more than 4,096 rectangles (one pass over 2,000 rectangles takes over a second, and the bisection needs a dozen passes)
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 threadSkipped: more than 4,096 rectangles (one pass over 2,000 rectangles takes over a second, and the bisection needs a dozen passes)

3 · Square search

Heuristic-selected square per packer.

An untimed growth search and bisection select a successful square for each packer. Greedy packing success need not be monotone in bin size, so this does not establish a global minimum. One insertion pass into that selected square is timed. Bin sizes and insertion difficulty differ; compare density alongside time.

Sprites, 1,000

Time per insertion pass

One insertion pass into each packer's search-selected square. Bin sizes differ; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread20 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread100 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread268 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread311 µs
RectPacker2Packer · 2.1.0 · 1 thread527 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread765 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.41 ms
Tedd.RectanglePackerSkyline MinWaste · 1 thread2.21 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread3.81 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread5.14 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread12.6 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread583 ms
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread640 ms

Unused atlas area

Share of the atlas not covered by rectangles. Linear scale; shorter is denser. Rows are in the same order as the time chart.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread37.89 %
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread12.42 %
Tedd.RectanglePackerSkyline BottomLeft · 1 thread5.92 %
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread1.18 %
RectPacker2Packer · 2.1.0 · 1 thread12.88 %
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread3.68 %
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread2.44 %
Tedd.RectanglePackerSkyline MinWaste · 1 thread29.50 %
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread6.93 %
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread3.42 %
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread3.24 %
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread3.68 %
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread3.68 %
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread20 µsmiddle 50%: 17 µs–23 µs2,73662.11 %0 B
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread100 µsmiddle 50%: 98 µs–105 µs2,30487.58 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread268 µsmiddle 50%: 247 µs–275 µs2,22394.08 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread311 µsmiddle 50%: 297 µs–326 µs2,16998.82 %0 B
RectPacker2Packer · 2.1.0 · 1 thread527 µsmiddle 50%: 507 µs–563 µs2,31087.12 %16.2 KiB
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread765 µsmiddle 50%: 724 µs–784 µs2,19796.32 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.41 msmiddle 50%: 1.36 ms–1.44 ms2,18397.56 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread2.21 msmiddle 50%: 2.11 ms–2.27 ms2,56870.50 %0 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread3.81 msmiddle 50%: 3.63 ms–3.91 ms2,23593.07 %187.2 KiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread5.14 msmiddle 50%: 5.00 ms–5.22 ms2,19496.58 %112 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread12.6 msmiddle 50%: 12.3 ms–13.0 ms2,19296.76 %1 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread583 msmiddle 50%: 571 ms–596 ms2,19796.32 %9 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread640 msmiddle 50%: 630 ms–655 ms2,19796.32 %9 B
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

Glyphs, 2,000

Time per insertion pass

One insertion pass into each packer's search-selected square. Bin sizes differ; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread52 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread125 µs
RectPacker2Packer · 2.1.0 · 1 thread146 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread164 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread198 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread397 µs
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.15 ms
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.51 ms
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread3.20 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread9.47 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread10.1 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread885 ms
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread1.20 s

Unused atlas area

Share of the atlas not covered by rectangles. Linear scale; shorter is denser. Rows are in the same order as the time chart.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread8.99 %
Tedd.RectanglePackerSkyline BottomLeft · 1 thread1.88 %
RectPacker2Packer · 2.1.0 · 1 thread1.88 %
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread13.48 %
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread1.03 %
Tedd.RectanglePackerSkyline MinWaste · 1 thread2.50 %
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.88 %
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread4.54 %
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread4.14 %
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread1.67 %
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread8.99 %
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread4.54 %
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread4.54 %
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread52 µsmiddle 50%: 52 µs–52 µs97591.01 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread125 µsmiddle 50%: 116 µs–133 µs93998.12 %0 B
RectPacker2Packer · 2.1.0 · 1 thread146 µsmiddle 50%: 145 µs–146 µs93998.12 %4.1 KiB
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread164 µsmiddle 50%: 164 µs–164 µs1,00086.52 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread198 µsmiddle 50%: 191 µs–203 µs93598.97 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread397 µsmiddle 50%: 355 µs–411 µs94297.50 %0 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.15 msmiddle 50%: 1.11 ms–1.20 ms93998.12 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.51 msmiddle 50%: 1.43 ms–1.54 ms95295.46 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread3.20 msmiddle 50%: 3.10 ms–3.28 ms95095.86 %0 B
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread9.47 msmiddle 50%: 9.25 ms–9.71 ms93898.33 %112 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread10.1 msmiddle 50%: 9.65 ms–11.0 ms97591.01 %359.5 KiB
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread885 msmiddle 50%: 833 ms–1.09 s95295.46 %9 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread1.20 smiddle 50%: 1.18 s–1.21 s95295.46 %16 B
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

UI images, 500

Time per insertion pass

One insertion pass into each packer's search-selected square. Bin sizes differ; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread9 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread37 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread51 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread94 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread98 µs
RectPacker2Packer · 2.1.0 · 1 thread124 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread193 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread388 µs
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread580 µs
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread1.03 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread23.8 ms
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread32.7 ms
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread35.7 ms

Unused atlas area

Share of the atlas not covered by rectangles. Linear scale; shorter is denser. Rows are in the same order as the time chart.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread43.73 %
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread14.95 %
Tedd.RectanglePackerSkyline BottomLeft · 1 thread13.50 %
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread1.15 %
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.25 %
RectPacker2Packer · 2.1.0 · 1 thread30.66 %
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread11.34 %
Tedd.RectanglePackerSkyline MinWaste · 1 thread22.93 %
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread52.71 %
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread12.68 %
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread66.11 %
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread1.25 %
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread1.25 %
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread9 µsmiddle 50%: 9 µs–9 µs2,63156.27 %0 B
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread37 µsmiddle 50%: 37 µs–37 µs2,14085.05 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread51 µsmiddle 50%: 51 µs–52 µs2,12286.50 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread94 µsmiddle 50%: 94 µs–94 µs1,98598.85 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread98 µsmiddle 50%: 97 µs–98 µs1,98698.75 %0 B
RectPacker2Packer · 2.1.0 · 1 thread124 µsmiddle 50%: 123 µs–124 µs2,37069.34 %8.1 KiB
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread193 µsmiddle 50%: 192 µs–193 µs2,09688.66 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread388 µsmiddle 50%: 387 µs–388 µs2,24877.07 %0 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread580 µsmiddle 50%: 579 µs–584 µs2,87047.29 %91.2 KiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread1.03 msmiddle 50%: 984 µs–1.05 ms2,11287.32 %112 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread23.8 msmiddle 50%: 23.7 ms–23.8 ms3,39033.89 %1 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread32.7 msmiddle 50%: 32.6 ms–32.7 ms1,98698.75 %2 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread35.7 msmiddle 50%: 35.3 ms–38.0 ms1,98698.75 %3 B
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

Tiles, 4,096

Time per insertion pass

One insertion pass into each packer's search-selected square. Bin sizes differ; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread68 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread91 µs
RectPacker2Packer · 2.1.0 · 1 thread94 µs
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread123 µs
Tedd.RectanglePackerSkyline MinWaste · 1 thread156 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread202 µs
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread215 µs
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread320 µs
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread322 µs
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread334 µs
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread656 µs
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread3.21 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread47.6 ms

Unused atlas area

Share of the atlas not covered by rectangles. Linear scale; shorter is denser. Rows are in the same order as the time chart.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread0.57 %
Tedd.RectanglePackerSkyline BottomLeft · 1 thread0.57 %
RectPacker2Packer · 2.1.0 · 1 thread0.57 %
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread0.57 %
Tedd.RectanglePackerSkyline MinWaste · 1 thread0.57 %
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread0.57 %
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread0.57 %
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread0.57 %
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread0.57 %
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread0.57 %
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread2.04 %
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread0.57 %
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread0.57 %
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread68 µsmiddle 50%: 58 µs–73 µs2,14499.43 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread91 µsmiddle 50%: 91 µs–91 µs2,14499.43 %0 B
RectPacker2Packer · 2.1.0 · 1 thread94 µsmiddle 50%: 85 µs–96 µs2,14499.43 %1.1 KiB
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread123 µsmiddle 50%: 113 µs–128 µs2,14499.43 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread156 µsmiddle 50%: 148 µs–165 µs2,14499.43 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread202 µsmiddle 50%: 201 µs–202 µs2,14499.43 %0 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread215 µsmiddle 50%: 215 µs–215 µs2,14499.43 %0 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread320 µsmiddle 50%: 281 µs–360 µs2,14499.43 %0 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 thread322 µsmiddle 50%: 280 µs–337 µs2,14499.43 %0 B
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 thread334 µsmiddle 50%: 296 µs–349 µs2,14499.43 %0 B
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread656 µsmiddle 50%: 617 µs–723 µs2,16097.96 %0 B
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread3.21 msmiddle 50%: 3.01 ms–3.34 ms2,14499.43 %112 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread47.6 msmiddle 50%: 42.8 ms–55.8 ms2,14499.43 %830.8 KiB
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it

Sprites, 10,000

Time per insertion pass

One insertion pass into each packer's search-selected square. Bin sizes differ; logarithmic scale; shorter is faster.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread466 µs
Tedd.RectanglePackerSkyline BottomLeft · 1 thread733 µs
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread925 µs
RectPacker2Packer · 2.1.0 · 1 thread1.88 ms
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread1.95 ms
Tedd.RectanglePackerSkyline MinWaste · 1 thread17.1 ms
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread24.4 ms
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread45.0 ms
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread48.2 ms
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread283 ms
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread341 ms

Unused atlas area

Share of the atlas not covered by rectangles. Linear scale; shorter is denser. Rows are in the same order as the time chart.

GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread11.75 %
Tedd.RectanglePackerSkyline BottomLeft · 1 thread0.91 %
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread0.10 %
RectPacker2Packer · 2.1.0 · 1 thread0.16 %
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread14.64 %
Tedd.RectanglePackerSkyline MinWaste · 1 thread4.39 %
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread1.08 %
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread1.20 %
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread1.71 %
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread5.96 %
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread0.50 %
LibraryConfigurationMedian timeSquare sideOccupancyAllocated per call
GoldMeridian.RectPackEmptySpaces (rectpack2D) · 1.0.0 · 1 thread466 µsmiddle 50%: 415 µs–497 µs3,64188.25 %0 B
Tedd.RectanglePackerSkyline BottomLeft · 1 thread733 µsmiddle 50%: 602 µs–774 µs3,43699.09 %0 B
Tedd.RectanglePackerMaxRects BottomLeft · 1 thread925 µsmiddle 50%: 873 µs–960 µs3,42299.90 %0 B
RectPacker2Packer · 2.1.0 · 1 thread1.88 msmiddle 50%: 1.83 ms–2.02 ms3,42399.84 %8.1 KiB
AtlasAllocatorShelfAtlasAllocator · 1.0.1 · 1 thread1.95 msmiddle 50%: 1.85 ms–2.00 ms3,70285.36 %0 B
Tedd.RectanglePackerSkyline MinWaste · 1 thread17.1 msmiddle 50%: 16.5 ms–18.5 ms3,49895.61 %1 B
Tedd.RectanglePackerMaxRects BestShortSideFit · 1 thread24.4 msmiddle 50%: 22.7 ms–26.2 ms3,43998.92 %1 B
RectangleBinPack.CSharpGuillotine BestAreaFit, MinimizeArea · 1.0.4 · 1 thread45.0 msmiddle 50%: 42.6 ms–50.5 ms3,44198.80 %3 B
AtlasAllocatorGuillotineAtlasAllocator · 1.0.1 · 1 thread48.2 msmiddle 50%: 45.0 ms–49.6 ms3,45098.29 %3 B
RectangleBinPackingMaxRects BestShortSideFit (new bin) · 1.0.2 · 1 thread283 msmiddle 50%: 268 ms–294 ms3,52794.04 %1.9 MiB
StbRectPackSharpstbrp_pack_rects (skyline) · 1.0.4 · 1 thread341 msmiddle 50%: 318 ms–389 ms3,42999.50 %121 B
RectangleBinPack.CSharpMaxRects BestShortSideFit · 1.0.4 · 1 threadSkipped: more than 4,096 rectangles (one pass over 2,000 rectangles takes over a second, and the bisection needs a dozen passes)
RectangleBinPack.CSharpSkyline BottomLeft · 1.0.4 · 1 threadSkipped: SkylineBinPack always considers rotated placements; no option disables it
ManaBattery.MB.RectangleBinPackMaxRects BestShortSideFit · 0.0.4 · 1 threadSkipped: more than 4,096 rectangles (one pass over 2,000 rectangles takes over a second, and the bisection needs a dozen passes)

4 · Composition

Writing sprite pixels into the atlas.

Every contender writes the same layout: RGBA32 sprites into a reused RGBA32 atlas, clearing the background first. Every output was compared byte for byte with the reference. The plain Span.CopyTo row loop is a single-thread baseline, not a library.

Sprites, 1,000

Atlas throughput

1,833 × 2,567 RGBA32 atlas, megapixels of atlas written per second including the background. Linear scale; longer is faster.

Tedd.RectanglePackerAtlasBuilder.Compose · 32 threads2,426 MP/s
Tedd.RectanglePackerAtlasBuilder.Compose · 1 thread1,341 MP/s
SkiaSharpSKCanvas.DrawImage (Src) · 4.153.0 · 1 thread840 MP/s
Span.CopyTo loopreference · 1 thread837 MP/s
SixLabors.ImageSharpDrawImage (Src) · 3.1.12 · 1 thread98 MP/s
LibraryConfigurationMedian timeMP/sAllocated per call
Tedd.RectanglePackerAtlasBuilder.Compose · 32 threads1.94 msmiddle 50%: 1.88 ms–2.12 ms2,4262 B
Tedd.RectanglePackerAtlasBuilder.Compose · 1 thread3.51 msmiddle 50%: 3.33 ms–4.46 ms1,341208 B
SkiaSharpSKCanvas.DrawImage (Src) · 4.153.0 · 1 thread5.60 msmiddle 50%: 5.42 ms–6.28 ms8400 B
Span.CopyTo loopreference · 1 thread5.62 msmiddle 50%: 5.14 ms–6.50 ms8370 B
SixLabors.ImageSharpDrawImage (Src) · 3.1.12 · 1 thread47.9 msmiddle 50%: 44.5 ms–50.7 ms987.2 MiB

UI images, 500

Atlas throughput

2,270 × 1,736 RGBA32 atlas, megapixels of atlas written per second including the background. Linear scale; longer is faster.

Tedd.RectanglePackerAtlasBuilder.Compose · 32 threads3,718 MP/s
Tedd.RectanglePackerAtlasBuilder.Compose · 1 thread1,651 MP/s
Span.CopyTo loopreference · 1 thread1,083 MP/s
SkiaSharpSKCanvas.DrawImage (Src) · 4.153.0 · 1 thread1,004 MP/s
SixLabors.ImageSharpDrawImage (Src) · 3.1.12 · 1 thread164 MP/s
LibraryConfigurationMedian timeMP/sAllocated per call
Tedd.RectanglePackerAtlasBuilder.Compose · 32 threads1.06 msmiddle 50%: 958 µs–1.15 ms3,7181 B
Tedd.RectanglePackerAtlasBuilder.Compose · 1 thread2.39 msmiddle 50%: 2.27 ms–2.52 ms1,6510 B
Span.CopyTo loopreference · 1 thread3.64 msmiddle 50%: 3.25 ms–3.79 ms1,0830 B
SkiaSharpSKCanvas.DrawImage (Src) · 4.153.0 · 1 thread3.92 msmiddle 50%: 3.39 ms–4.21 ms1,0040 B
SixLabors.ImageSharpDrawImage (Src) · 3.1.12 · 1 thread24.0 msmiddle 50%: 23.1 ms–24.7 ms1643.0 MiB

Method

How the numbers were produced.

AMD Ryzen 9 5950X 16-Core Processor, 32 logical processors, Microsoft Windows 10.0.26200, .NET 11.0.0-rc.1.26425.128, X64. Measured 2026-09-30 (UTC), library commit 37274944e775.

Excluded or failed configurations:

Raw CSV files, per-sample timing JSON, the environment record and the measured layouts are in benchmarks/results/2026-09-30-3727494-expanded. The harness is src/Tedd.RectanglePacker.Comparison; the command line is in BENCHMARKS.md.