Re: [PNG] New tool to identify decode speed targets

I tested on my laptop, which is a couple of years old now:

Dell XPS 9720, 12th Gen i9-12900HK, 64Gb DDR5 ram.
Two SSD disks.

Drive C: (1Tb NVMe PM9A1 Samsung (stock drive from Dell))

PS C:\Users\chris\Documents\GitHub\FileReadSpeedTest\Test Data> 
FileReadSpeedTest '.\crystaldiskmark nvme ssd.png'
Worker thread count: 6
Clock is steady
Buffer size: 512
Open delay: 229400ns
Open to read delay: 1009100ns
Buffer 0 - Read issue delay: 100ns - Issue to completion delay: 142000ns
Buffer 1 - Read issue delay: 46700ns - Issue to completion delay: 108800ns
Buffer 2 - Read issue delay: 62900ns - Issue to completion delay: 100500ns
Buffer 3 - Read issue delay: 75000ns - Issue to completion delay: 152500ns
Buffer 4 - Read issue delay: 147700ns - Issue to completion delay: 93500ns
Buffer 5 - Read issue delay: 159200ns - Issue to completion delay: 106000ns
Buffer 6 - Read issue delay: 169600ns - Issue to completion delay: 117900ns
Buffer 7 - Read issue delay: 180200ns - Issue to completion delay: 128900ns
Buffer 8 - Read issue delay: 212300ns - Issue to completion delay: 226900ns
Buffer 9 - Read issue delay: 233900ns - Issue to completion delay: 101100ns
Buffer 10 - Read issue delay: 256300ns - Issue to completion delay: 113500ns
Buffer 11 - Read issue delay: 299200ns - Issue to completion delay: 102400ns
Buffer 12 - Read issue delay: 321800ns - Issue to completion delay: 106400ns
Buffer 13 - Read issue delay: 332900ns - Issue to completion delay: 119000ns
Buffer 14 - Read issue delay: 353500ns - Issue to completion delay: 117400ns
Buffer 15 - Read issue delay: 367500ns - Issue to completion delay: 122200ns
Buffer 16 - Read issue delay: 408800ns - Issue to completion delay: 105600ns
Buffer 17 - Read issue delay: 433600ns - Issue to completion delay: 103200ns
Buffer 18 - Read issue delay: 456100ns - Issue to completion delay: 101400ns
Buffer 19 - Read issue delay: 477300ns - Issue to completion delay: 103200ns
Buffer 20 - Read issue delay: 498200ns - Issue to completion delay: 103100ns
Buffer 21 - Read issue delay: 508900ns - Issue to completion delay: 119500ns
Buffer 22 - Read issue delay: 531200ns - Issue to completion delay: 118800ns
Buffer 23 - Read issue delay: 551500ns - Issue to completion delay: 118600ns
Buffer 24 - Read issue delay: 573100ns - Issue to completion delay: 120800ns
Buffer 25 - Read issue delay: 593900ns - Issue to completion delay: 123900ns
Buffer 26 - Read issue delay: 615200ns - Issue to completion delay: 181900ns
Buffer 27 - Read issue delay: 637200ns - Issue to completion delay: 124500ns
Buffer 28 - Read issue delay: 658500ns - Issue to completion delay: 126200ns
Buffer 29 - Read issue delay: 679200ns - Issue to completion delay: 130600ns
Buffer 30 - Read issue delay: 701900ns - Issue to completion delay: 128600ns
Buffer 31 - Read issue delay: 723600ns - Issue to completion delay: 129100ns
Buffer 32 - Read issue delay: 735300ns - Issue to completion delay: 144500ns
Buffer 33 - Read issue delay: 758100ns - Issue to completion delay: 230300ns
Buffer 34 - Read issue delay: 779600ns - Issue to completion delay: 141600ns
Buffer 35 - Read issue delay: 802500ns - Issue to completion delay: 139800ns
Buffer 36 - Read issue delay: 824100ns - Issue to completion delay: 214400ns
Buffer 37 - Read issue delay: 844600ns - Issue to completion delay: 287700ns
Buffer 38 - Read issue delay: 865300ns - Issue to completion delay: 147300ns
Buffer 39 - Read issue delay: 886100ns - Issue to completion delay: 149400ns
Buffer 40 - Read issue delay: 910900ns - Issue to completion delay: 151600ns
Buffer 41 - Read issue delay: 932600ns - Issue to completion delay: 149100ns
Buffer 42 - Read issue delay: 953000ns - Issue to completion delay: 152400ns
Buffer 43 - Read issue delay: 976600ns - Issue to completion delay: 156600ns
Buffer 44 - Read issue delay: 999200ns - Issue to completion delay: 156100ns
Buffer 45 - Read issue delay: 1024100ns - Issue to completion delay: 
352400ns
Buffer 46 - Read issue delay: 1045400ns - Issue to completion delay: 
421000ns
Buffer 47 - Read issue delay: 1066200ns - Issue to completion delay: 
300400ns
Buffer 48 - Read issue delay: 1087700ns - Issue to completion delay: 
296800ns
Buffer 49 - Read issue delay: 1099100ns - Issue to completion delay: 
308100ns
Buffer 50 - Read issue delay: 1120500ns - Issue to completion delay: 
445400ns
Buffer 51 - Read issue delay: 1141000ns - Issue to completion delay: 
311500ns
Buffer 52 - Read issue delay: 1154200ns - Issue to completion delay: 
320200ns
Buffer 53 - Read issue delay: 1166100ns - Issue to completion delay: 
330100ns
Buffer 54 - Read issue delay: 1183400ns - Issue to completion delay: 
334300ns
Buffer 55 - Read issue delay: 1204900ns - Issue to completion delay: 
413600ns
Buffer 56 - Read issue delay: 1219900ns - Issue to completion delay: 
326200ns
Buffer 57 - Read issue delay: 1236000ns - Issue to completion delay: 
332100ns
Buffer 58 - Read issue delay: 1253600ns - Issue to completion delay: 
335800ns
Buffer 59 - Read issue delay: 1269900ns - Issue to completion delay: 
343100ns
Buffer 60 - Read issue delay: 1285800ns - Issue to completion delay: 
355100ns
Buffer 61 - Read issue delay: 1351100ns - Issue to completion delay: 
313600ns
Buffer 62 - Read issue delay: 1371300ns - Issue to completion delay: 
311600ns
Buffer 63 - Read issue delay: 1382400ns - Issue to completion delay: 
323800ns
Buffer 64 - Read issue delay: 1400500ns - Issue to completion delay: 
332800ns
Buffer 65 - Read issue delay: 1419600ns - Issue to completion delay: 
337500ns
Buffer 66 - Read issue delay: 1438200ns - Issue to completion delay: 
340900ns
Buffer 67 - Read issue delay: 1460600ns - Issue to completion delay: 
358600ns
Buffer 68 - Read issue delay: 1470800ns - Issue to completion delay: 
347100ns
Buffer 69 - Read issue delay: 1489000ns - Issue to completion delay: 
343600ns
Buffer 70 - Read issue delay: 1507100ns - Issue to completion delay: 
357600ns
Buffer 71 - Read issue delay: 1534100ns - Issue to completion delay: 
349400ns
Buffer 72 - Read issue delay: 1553200ns - Issue to completion delay: 84400ns
Buffer 73 - Read issue delay: 1563600ns - Issue to completion delay: 
172800ns
Buffer 74 - Read issue delay: 1582300ns - Issue to completion delay: 
108200ns
Buffer 75 - Read issue delay: 1600700ns - Issue to completion delay: 
110900ns
Buffer 76 - Read issue delay: 1610200ns - Issue to completion delay: 
116100ns
Buffer 77 - Read issue delay: 1633900ns - Issue to completion delay: 
110500ns
Buffer 78 - Read issue delay: 1672400ns - Issue to completion delay: 
101600ns
Buffer 79 - Read issue delay: 1698600ns - Issue to completion delay: 95600ns
Buffer 80 - Read issue delay: 1723600ns - Issue to completion delay: 
122200ns
Buffer 81 - Read issue delay: 1762500ns - Issue to completion delay: 94400ns
Buffer 82 - Read issue delay: 1787300ns - Issue to completion delay: 99900ns
Buffer 83 - Read issue delay: 1810200ns - Issue to completion delay: 
102900ns
Buffer 84 - Read issue delay: 1828300ns - Issue to completion delay: 95400ns
Buffer 85 - Read issue delay: 1854200ns - Issue to completion delay: 93000ns
Buffer 86 - Read issue delay: 1878400ns - Issue to completion delay: 88200ns
Buffer 87 - Read issue delay: 1897100ns - Issue to completion delay: 
100200ns
Buffer 88 - Read issue delay: 1914900ns - Issue to completion delay: 
101800ns
Buffer 89 - Read issue delay: 1933600ns - Issue to completion delay: 
104800ns
Buffer 90 - Read issue delay: 1943800ns - Issue to completion delay: 
116100ns
Buffer 91 - Read issue delay: 1962200ns - Issue to completion delay: 
120500ns
Buffer 92 - Read issue delay: 1980300ns - Issue to completion delay: 
124200ns
Buffer 93 - Read issue delay: 1990000ns - Issue to completion delay: 
136500ns
Buffer 94 - Read issue delay: 2008800ns - Issue to completion delay: 
141600ns
Buffer 95 - Read issue delay: 2028200ns - Issue to completion delay: 
143100ns
Buffer 96 - Read issue delay: 2044900ns - Issue to completion delay: 
148900ns
Buffer 97 - Read issue delay: 2054900ns - Issue to completion delay: 
162300ns
Buffer 98 - Read issue delay: 2072800ns - Issue to completion delay: 
165600ns
Buffer 99 - Read issue delay: 2094000ns - Issue to completion delay: 
167500ns
Buffer 100 - Read issue delay: 2103600ns - Issue to completion delay: 
179000ns
Buffer 101 - Read issue delay: 2126300ns - Issue to completion delay: 
211400ns
Buffer 102 - Read issue delay: 2145300ns - Issue to completion delay: 
183400ns
Buffer 103 - Read issue delay: 2163400ns - Issue to completion delay: 
213400ns
Buffer 104 - Read issue delay: 2183300ns - Issue to completion delay: 
199300ns
Buffer 105 - Read issue delay: 2192900ns - Issue to completion delay: 
162900ns
Buffer 106 - Read issue delay: 2215500ns - Issue to completion delay: 
204700ns
Buffer 107 - Read issue delay: 2233500ns - Issue to completion delay: 
208700ns
Buffer 108 - Read issue delay: 2252500ns - Issue to completion delay: 
209000ns
Buffer 109 - Read issue delay: 2271200ns - Issue to completion delay: 
335600ns
Buffer 110 - Read issue delay: 2281500ns - Issue to completion delay: 
318400ns
Buffer 111 - Read issue delay: 2301400ns - Issue to completion delay: 
502400ns
Buffer 112 - Read issue delay: 2320300ns - Issue to completion delay: 
95200ns
Buffer 113 - Read issue delay: 2339600ns - Issue to completion delay: 
118700ns

Disk E: (D: and E: are partitions on a 2Tb NVMe Seagate FireCuda 
ZP2000GM30013)

PS E:\Test Data> FileReadSpeedTest '.\crystaldiskmark nvme ssd.png'
Worker thread count: 6
Clock is steady
Buffer size: 512
Open delay: 92800ns
Open to read delay: 740200ns
Buffer 0 - Read issue delay: 100ns - Issue to completion delay: 86554400ns
Buffer 1 - Read issue delay: 73300ns - Issue to completion delay: 86443200ns
Buffer 2 - Read issue delay: 89700ns - Issue to completion delay: 86286500ns
Buffer 3 - Read issue delay: 101900ns - Issue to completion delay: 
86296000ns
Buffer 4 - Read issue delay: 131300ns - Issue to completion delay: 
86413500ns
Buffer 5 - Read issue delay: 145300ns - Issue to completion delay: 
86577300ns
Buffer 6 - Read issue delay: 160900ns - Issue to completion delay: 
86331200ns
Buffer 7 - Read issue delay: 177700ns - Issue to completion delay: 
86872200ns
Buffer 8 - Read issue delay: 190200ns - Issue to completion delay: 
86602100ns
Buffer 9 - Read issue delay: 208000ns - Issue to completion delay: 
86819800ns
Buffer 10 - Read issue delay: 224900ns - Issue to completion delay: 
87068600ns
Buffer 11 - Read issue delay: 237300ns - Issue to completion delay: 
87051700ns
Buffer 12 - Read issue delay: 255100ns - Issue to completion delay: 
86892800ns
Buffer 13 - Read issue delay: 269700ns - Issue to completion delay: 
87075200ns
Buffer 14 - Read issue delay: 280400ns - Issue to completion delay: 
87179800ns
Buffer 15 - Read issue delay: 293600ns - Issue to completion delay: 
87354800ns
Buffer 16 - Read issue delay: 306200ns - Issue to completion delay: 
87297400ns
Buffer 17 - Read issue delay: 317300ns - Issue to completion delay: 
87524800ns
Buffer 18 - Read issue delay: 329900ns - Issue to completion delay: 
87433600ns
Buffer 19 - Read issue delay: 343200ns - Issue to completion delay: 
87455000ns
Buffer 20 - Read issue delay: 355200ns - Issue to completion delay: 
87613800ns
Buffer 21 - Read issue delay: 368800ns - Issue to completion delay: 
88039000ns
Buffer 22 - Read issue delay: 380800ns - Issue to completion delay: 
87908000ns
Buffer 23 - Read issue delay: 391100ns - Issue to completion delay: 
87971200ns
Buffer 24 - Read issue delay: 403300ns - Issue to completion delay: 
87870800ns
Buffer 25 - Read issue delay: 416200ns - Issue to completion delay: 
87816700ns
Buffer 26 - Read issue delay: 427800ns - Issue to completion delay: 
87685300ns
Buffer 27 - Read issue delay: 443200ns - Issue to completion delay: 
87811100ns
Buffer 28 - Read issue delay: 456700ns - Issue to completion delay: 
87682600ns
Buffer 29 - Read issue delay: 467800ns - Issue to completion delay: 
87583500ns
Buffer 30 - Read issue delay: 480100ns - Issue to completion delay: 
87518600ns
Buffer 31 - Read issue delay: 493500ns - Issue to completion delay: 
87727200ns
Buffer 32 - Read issue delay: 503800ns - Issue to completion delay: 
89320200ns
Buffer 33 - Read issue delay: 518100ns - Issue to completion delay: 
89303900ns
Buffer 34 - Read issue delay: 533700ns - Issue to completion delay: 
89251700ns
Buffer 35 - Read issue delay: 549600ns - Issue to completion delay: 
89216900ns
Buffer 36 - Read issue delay: 566600ns - Issue to completion delay: 
89181200ns
Buffer 37 - Read issue delay: 579400ns - Issue to completion delay: 
89148600ns
Buffer 38 - Read issue delay: 590900ns - Issue to completion delay: 
89204900ns
Buffer 39 - Read issue delay: 604700ns - Issue to completion delay: 
89104600ns
Buffer 40 - Read issue delay: 616600ns - Issue to completion delay: 
89069300ns
Buffer 41 - Read issue delay: 627600ns - Issue to completion delay: 
89065400ns
Buffer 42 - Read issue delay: 779700ns - Issue to completion delay: 
88885200ns
Buffer 43 - Read issue delay: 793400ns - Issue to completion delay: 
88855500ns
Buffer 44 - Read issue delay: 804600ns - Issue to completion delay: 
88833200ns
Buffer 45 - Read issue delay: 817900ns - Issue to completion delay: 
88821600ns
Buffer 46 - Read issue delay: 831400ns - Issue to completion delay: 
88780400ns
Buffer 47 - Read issue delay: 842900ns - Issue to completion delay: 
88775600ns
Buffer 48 - Read issue delay: 854700ns - Issue to completion delay: 
88733300ns
Buffer 49 - Read issue delay: 866800ns - Issue to completion delay: 
88715100ns
Buffer 50 - Read issue delay: 878100ns - Issue to completion delay: 
88684100ns
Buffer 51 - Read issue delay: 891300ns - Issue to completion delay: 
88642600ns
Buffer 52 - Read issue delay: 903400ns - Issue to completion delay: 
88554400ns
Buffer 53 - Read issue delay: 915000ns - Issue to completion delay: 
88520300ns
Buffer 54 - Read issue delay: 927400ns - Issue to completion delay: 
88488900ns
Buffer 55 - Read issue delay: 1544000ns - Issue to completion delay: 
87853500ns
Buffer 56 - Read issue delay: 1556400ns - Issue to completion delay: 
87822400ns
Buffer 57 - Read issue delay: 1571200ns - Issue to completion delay: 
87787800ns
Buffer 58 - Read issue delay: 1583900ns - Issue to completion delay: 
87755400ns
Buffer 59 - Read issue delay: 1595800ns - Issue to completion delay: 
87724500ns
Buffer 60 - Read issue delay: 1608900ns - Issue to completion delay: 
87692300ns
Buffer 61 - Read issue delay: 1621800ns - Issue to completion delay: 
87661000ns
Buffer 62 - Read issue delay: 1633300ns - Issue to completion delay: 
87862100ns
Buffer 63 - Read issue delay: 1647100ns - Issue to completion delay: 
87604000ns
Buffer 64 - Read issue delay: 1659400ns - Issue to completion delay: 
87585700ns
Buffer 65 - Read issue delay: 1671600ns - Issue to completion delay: 
87597300ns
Buffer 66 - Read issue delay: 1684800ns - Issue to completion delay: 
87535600ns
Buffer 67 - Read issue delay: 1697100ns - Issue to completion delay: 
87508500ns
Buffer 68 - Read issue delay: 1709000ns - Issue to completion delay: 
87474400ns
Buffer 69 - Read issue delay: 1721500ns - Issue to completion delay: 
87491700ns
Buffer 70 - Read issue delay: 1733300ns - Issue to completion delay: 
87426200ns
Buffer 71 - Read issue delay: 1744800ns - Issue to completion delay: 
87393300ns
Buffer 72 - Read issue delay: 1756200ns - Issue to completion delay: 
87347800ns
Buffer 73 - Read issue delay: 1768100ns - Issue to completion delay: 
87315800ns
Buffer 74 - Read issue delay: 1779900ns - Issue to completion delay: 
87285300ns
Buffer 75 - Read issue delay: 1792400ns - Issue to completion delay: 
87444300ns
Buffer 76 - Read issue delay: 1804000ns - Issue to completion delay: 
87267700ns
Buffer 77 - Read issue delay: 1815100ns - Issue to completion delay: 
87228600ns
Buffer 78 - Read issue delay: 1826700ns - Issue to completion delay: 
87190800ns
Buffer 79 - Read issue delay: 1839800ns - Issue to completion delay: 
87187400ns
Buffer 80 - Read issue delay: 1851400ns - Issue to completion delay: 
87135400ns
Buffer 81 - Read issue delay: 1863700ns - Issue to completion delay: 
87041800ns
Buffer 82 - Read issue delay: 1876400ns - Issue to completion delay: 
86996700ns
Buffer 83 - Read issue delay: 1887600ns - Issue to completion delay: 
86999400ns
Buffer 84 - Read issue delay: 1899800ns - Issue to completion delay: 
86946600ns
Buffer 85 - Read issue delay: 1911600ns - Issue to completion delay: 
86923800ns
Buffer 86 - Read issue delay: 1922000ns - Issue to completion delay: 
86816700ns
Buffer 87 - Read issue delay: 1934200ns - Issue to completion delay: 
86750400ns
Buffer 88 - Read issue delay: 1946000ns - Issue to completion delay: 
84927600ns
Buffer 89 - Read issue delay: 1956500ns - Issue to completion delay: 
84811300ns
Buffer 90 - Read issue delay: 1968200ns - Issue to completion delay: 
84941500ns
Buffer 91 - Read issue delay: 1979500ns - Issue to completion delay: 
85109100ns
Buffer 92 - Read issue delay: 1990100ns - Issue to completion delay: 
85260200ns
Buffer 93 - Read issue delay: 2002400ns - Issue to completion delay: 
85266500ns
Buffer 94 - Read issue delay: 2015100ns - Issue to completion delay: 
85142900ns
Buffer 95 - Read issue delay: 2029500ns - Issue to completion delay: 
85384900ns
Buffer 96 - Read issue delay: 2042000ns - Issue to completion delay: 
85487900ns
Buffer 97 - Read issue delay: 2054300ns - Issue to completion delay: 
85668700ns
Buffer 98 - Read issue delay: 2255700ns - Issue to completion delay: 
85606800ns
Buffer 99 - Read issue delay: 2269400ns - Issue to completion delay: 
85515700ns
Buffer 100 - Read issue delay: 2281200ns - Issue to completion delay: 
85704100ns
Buffer 101 - Read issue delay: 2292000ns - Issue to completion delay: 
85765900ns
Buffer 102 - Read issue delay: 2306100ns - Issue to completion delay: 
86201500ns
Buffer 103 - Read issue delay: 2318800ns - Issue to completion delay: 
86170400ns
Buffer 104 - Read issue delay: 2329100ns - Issue to completion delay: 
86079800ns
Buffer 105 - Read issue delay: 2340600ns - Issue to completion delay: 
85972700ns
Buffer 106 - Read issue delay: 2353100ns - Issue to completion delay: 
85594300ns
Buffer 107 - Read issue delay: 2365000ns - Issue to completion delay: 
86082600ns
Buffer 108 - Read issue delay: 2377500ns - Issue to completion delay: 
86156500ns
Buffer 109 - Read issue delay: 2390200ns - Issue to completion delay: 
86272000ns
Buffer 110 - Read issue delay: 2400300ns - Issue to completion delay: 
86392800ns
Buffer 111 - Read issue delay: 2412200ns - Issue to completion delay: 
86181900ns
Buffer 112 - Read issue delay: 2423800ns - Issue to completion delay: 
86238900ns
Buffer 113 - Read issue delay: 2434200ns - Issue to completion delay: 
86123900ns

On 2025-09-25 03:44, Chris Blume (ProgramMax) wrote:
> Hello everyone,
>
> I just uploaded a first pass at a new tool to help us in our effort to 
> improve PNG decoding, FileReadSpeedTest 
> <https://github.com/ProgramMax/FileReadSpeedTest>.
>
> It works by finding the optimal buffer size for a given drive & file 
> system, then loads a file buffer-by-buffer. It reports the time each 
> buffer arrives. This allows us to "replay" file loading for 
> performance testing. (The drive and OS will cache data, changing the 
> load speeds & performance results. We can instead feed the buffers to 
> the test rig at known good intervals to keep tests consistent.)
>
> This is how the hardware works under the hood. It does not load an 
> entire file in one go. This also gives us a target for our decode 
> speeds. In an ideal world, we can decode a buffer faster than the next 
> buffer arrives. That would mean the decode speed is limited by the 
> drive, not the format/algorithm.
>
> I tested on my laptop, which has a WD_BLACK SN770 2TB drive. That is a 
> seriously fast drive. Advertised speeds are "up to 5,150 MB/s". I was 
> able to reach 5,259 MB/s. It is formatted with NTFS (BitLocker 
> encrypted). Windows reports the ideal buffer size is 4096 bytes.
>
> A buffer load took ~10 microseconds. So a simple, not-quite-accurate 
> reaction is "Our format should decode 4096 bytes in ~10 microseconds 
> for this machine".
> For a machine with a more normal drive, we'll have even more time.
>
> (In order to be more accurate, I'll need to also measure IO command 
> queuing and OS call overhead. That'll come soon.)
>
> An important thing to note is this is a moving target. CPU speeds have 
> leveled out, but drive speeds are still increasing. If we want to 
> target crazy fast server hardware, that's a different target. 
> Additionally, that 4096 bytes in ~10 microseconds assumes a 
> single-threaded workload. If we were able to spread the work across 8 
> threads, we would have ~80 microseconds. But with command queuing, 
> multiple threads worth of buffered data might arrive at nearly the 
> same time, reducing the available per-thread decode time back down.
>
> I'll work on improving the tool and gathering more sample data for us 
> to replay under various conditions. I'll also add Linux and Mac 
> support when I can.

-- 
Chris Lilley
@svgeesus@mastodon.scot
W3C Distinguished Expert, Color, Graphics & Fonts
W3C Technical Programming Team, Core Web Design

Received on Sunday, 28 September 2025 14:31:36 UTC