Deribit: where its trading screen loses time, and what to fix

Measured from the Netherlands in a logged-in Chrome, October 2026.

In short. On a warm reload the screen is trade-ready after 4.2 s (median of 5 loads), 11 of 27 perpetual trading screens, possible rank 9 to 12; after an uncached reload 4.1 s. The largest bottleneck: Price and book show 2.6 s after the feed delivers. First change to try: Render price and book from the first socket messages before the grid layout and other modules load.

Three measurements appear on this page, and their times differ. Rank and results come from the campaign's timed reloads. The diagnostic capture and the recorded reload are single loads made with recording switched on, which slows the page: read them for the order of events and the gaps, not for totals.

Resultscampaign: 5 warm and 5 uncached reloads

Warm reloadmedian 4.2 s, range 3.8 s–4.4 s; loads: 4.4 s, 4.2 s, 4.0 s, 3.8 s, 4.2 s
Uncached reloadmedian 4.1 s, range 4.0 s–4.2 s; loads: 4.2 s, 4.1 s, 4.2 s, 4.0 s, 4.1 s
Standing11 of 27 by median; possible rank 9 to 12. 1.7 s behind the fastest, Thalex (2.4 s): 1.7 times as long. The possible rank is the range the measurements leave open: it counts only the exchanges that clearly beat this one and those it clearly beats. Exchanges whose ranges overlap cannot be told apart.
Loads ready5 of 5 warm, 5 of 5 uncached
Notesloaded behind a pop-up that appears on every load

Where the time goescampaign medians, warm reload

Panels in the order they first showed real, usable data on a warm reload. The coloured part of each row is the time that panel added after the one before it. The last row is trade-ready: every panel is ready and the page has stopped moving.

0 s1 s2 s3 s4 s
Price2.8 s
Order book2.8 s +0.0 s
Recent trades2.8 s +0.0 s
Order form2.8 s +0.0 s
Chart3.5 s +0.6 s
Trade-ready4.2 s +0.7 s settling

Stack

React, built with Vite; TradingView chart library from assets.deribit.com; Highcharts; Sentry.

Delivery

www.deribit.com through Cloudflare over HTTP/2; hashed app files cached for only 4 hours; two of the seven fonts shipped as uncompressed TTF; market data over two sockets (www.deribit.com, streams.deribit.com).

HostRoleCDN edge seenConnectResponse
www.deribit.compageCloudflare Amsterdam13 ms22 ms
deribit.commarket dataCloudflare Amsterdam13 ms22 ms

Median of up to 10 attempts from the test machine. Response time includes the server's own time, so it is not a distance.

What happened, in orderdiagnostic capture 1 October, uncached

From one uncached diagnostic load recorded on 1 October 2026 (cache disabled, browser extensions active), so totals are slower than the campaign's timed loads; file names, sizes, headers, order of events and main-thread times are what the findings rely on. A main-thread time given for a script counts all the work that starts in that script, including code it calls in other files, so it shows where start-up work begins, not what one library costs. Endpoint paths were masked when the capture was saved.

WhenWhat
0.03 sHTML arrives.
0.40–0.62 sindex (2.4 MB unpacked), GlobalEventEmitter (1.3 MB), CurrencySearch (1.15 MB), LayoutWithHeader (0.7 MB). index.js later starts 1.53 s of main-thread work.
0.90 sBoth market sockets open; first messages at 0.99 and 1.07 s. First paint at 0.90 s.
1.09 sA 5.0 MB (unpacked) instrument response, no-store: the same one Coinbase's pages download.
1.31–1.51 sGridLayout (2.5 MB unpacked), Highcharts and the trading modal.
2.42 sPage header shows the market.
2.58–3.34 sThe chart library (library.js, 2.4 MB unpacked).
3.55 sPrice and order book show, 2.6 s after the feed's first messages.
4.55 sChart drawn: trade-ready in this load.

Recorded warm reload, 3 October

One warm reload recorded with Chrome's performance trace. Recording slows the page, so read the order and the gaps, not the total.

WhenWhat
0.0 sHTML arrives
0.6 sFirst frame sent on a live feed
0.6 sFirst frame received on a live feed
2.6 sPrice ready
2.6 sOrder book ready
2.6 sRecent trades ready
2.6 sOrder form ready
3.3 sChart ready
4.0 sTrade-ready

172 requests before trade-ready; 10 long main-thread tasks (over 50 ms) before trade-ready, longest 263 ms; 57 script requests before the first panel; 0 requests over HTTP/1.1.

Request waterfalldiagnostic capture 1 October, uncached

64 of the 159 requests (the page itself, the longest and the largest) started before market data was ready in the 1 October uncached capture, in start order. The outlined part of a bar is waiting for the server; the solid part is downloading. Rows are numbered so a request can be pointed to. The numbers on the right are the size received and the total time. Vertical lines mark when a panel had data in this capture.

PageScriptData requestFont, media, other fileStylesheetwaiting for the serverdownloading

0 s0 s1 s1 s2 s2 s3 s3 s4 s4 s1www.deribit.com5 kB17 ms2www.deribit.com/index-B0a…609 kB222 ms3www.deribit.com/GlobalEve…452 kB191 ms4www.deribit.com/CurrencyS…319 kB155 ms5www.deribit.com/LayoutWit…188 kB140 ms6o1264522.ingest.sentry.io20 B136 ms7www.deribit.com115 kB76 ms8www.deribit.com/GridLayou…704 kB204 ms9www.deribit.com/makeCance…69 kB135 ms10www.deribit.com/TradingMo…93 kB142 ms11www.deribit.com/dataSourc…7 kB135 ms12www.deribit.com/uniq-BEew…507 B134 ms13www.deribit.com/OptionWiz…15 kB136 ms14www.deribit.com/calculati…5 kB133 ms15www.deribit.com/highchart…101 kB139 ms16www.deribit.com/PriceLadd…731 B135 ms17www.deribit.com/DeribitHi…134 kB144 ms18www.deribit.com/OptionsCh…51 kB138 ms19www.deribit.com/EconomicC…20 kB135 ms20www.deribit.com/Liquidati…31 kB141 ms21www.deribit.com150 ms22www.deribit.com/CoinbaseS…31 kB231 ms23www.deribit.com/CoinbaseT…31 kB232 ms24www.deribit.com/CoinbaseT…31 kB234 ms25assets.deribit.com/librar…587 kB758 ms26www.deribit.com2 kB496 ms27assets.deribit.com/en.565…884 B219 ms28assets.deribit.com/8619.3…2 kB140 ms29assets.deribit.com/8009.1…438 B132 ms30assets.deribit.com/3562.7…2 kB131 ms31assets.deribit.com/105.10…652 B136 ms32assets.deribit.com/8819.3…126 B132 ms33assets.deribit.com/6879.b…858 B133 ms34assets.deribit.com/7263.3…2 kB133 ms35assets.deribit.com/962.e2…44 kB216 ms36assets.deribit.com/1075.1…5 kB214 ms37assets.deribit.com/5747.5…5 kB212 ms38assets.deribit.com/line-t…12 kB213 ms39assets.deribit.com/2182.e…10 kB212 ms40assets.deribit.com/2804.5…9 kB210 ms41assets.deribit.com/floati…22 kB213 ms42assets.deribit.com/3795.6…210 B131 ms43assets.deribit.com/9415.4…410 B131 ms44assets.deribit.com/7507.1…191 B131 ms45assets.deribit.com/7895.2…1 kB132 ms46assets.deribit.com/chart-…23 kB208 ms47assets.deribit.com/en.246…941 B190 ms48assets.deribit.com/restri…28 kB188 ms49assets.deribit.com/2158.4…6 kB185 ms50assets.deribit.com/header…11 kB185 ms51assets.deribit.com/user-d…4 kB159 ms52assets.deribit.com/en.684…2 kB159 ms53assets.deribit.com/2215.e…5 kB157 ms54assets.deribit.com/chart-…40 kB159 ms55assets.deribit.com/get-er…5 kB148 ms56assets.deribit.com/3016.5…4 kB141 ms57assets.deribit.com/change…15 kB143 ms58assets.deribit.com/en.478…1 kB144 ms59assets.deribit.com/2842.6…9 kB138 ms60assets.deribit.com/drawin…27 kB143 ms61assets.deribit.com/study-…5 kB140 ms62assets.deribit.com/Coinba…114 kB76 ms63assets.deribit.com/Coinba…114 kB22 ms64history.deribit.com9 kB138 msprice 3.6 sorder book 3.6 schart 4.5 s
Download this figure as an image:

Bottlenecks and fixes, largest firstdiagnostic capture 1 October, uncached

DB-1Price and book show 2.6 s after the feed delivers.grade C
Evidence
1 October capture: first socket messages at 0.99 s (www.deribit.com) and 1.07 s (streams.deribit.com); price and book at 3.55 s. Meanwhile about 9 MB of unpacked script loads (GridLayout-B3XAMKEz.js 2.5 MB at 1.31 s, index-B0aPppd7.js 2.4 MB, GlobalEventEmitter 1.4 MB, CurrencySearch 1.2 MB) and 1.53 s of main-thread work starts in index.js. The 3 October recorded warm reload shows the same pattern with a 1.9 s gap: first message at 0.63 s, price and book at 2.56 s. With the files cached, that load still has 1.16 s of long tasks, the two longest (263 ms at 1.58 s and 183 ms at 2.00 s) before the price shows. The captures do not show that the first message already carries the price.
Gap observed
2.6 s between the first socket message and the price, in the 1 October capture
Holds back
Price (median 2.8 s in the timed loads), book (median 2.8 s in the timed loads).
Fix
Render price and book from the first socket messages before the grid layout and other modules load.
Where
Trading page start-up order (GridLayout, modules).
Verify
DevTools → Performance: price paint within 200 ms of the first ticker message.
DB-2The 5 MB instrument list is fetched twice on every load and cannot be cached.grade B
Evidence
All 20 timed loads request /api/v2/public/get_instruments twice with the same address (for example at 1.10 and 1.38 s), 5.1 MB unpacked each time, 10.2 MB together; it compresses to 116 KB, so the download is small; handling 10 MB of JSON is the likely cost, though the captures do not time it. In the 1 October capture the response is marked "no-store, public, max-age=10": the no-store cancels the 10 seconds it declares. Coinbase's perpetuals pages request the same endpoint.
Measured
two 5.1 MB no-store instrument responses per load
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Share one get_instruments request between its two callers, ask only for the currency and kind the page shows, and drop no-store so the declared max-age can work.
Where
The two start-up callers of /api/v2/public/get_instruments; its cache-control header.
Verify
DevTools → Network, filter "get_instruments": one request, under 100 KB unpacked or from cache on reload.
DB-3Hashed files cached for only 4 hours.grade B
Evidence
max-age=14400 on the content-hashed scripts (index, GridLayout, GlobalEventEmitter, CurrencySearch, LayoutWithHeader) and on the chart library assets.deribit.com/library.1ac08da24621d68cbd6c.js (2.5 MB unpacked). Five fonts are already WOFF2; the two on the chart host, CoinbaseSans-Regular.ttf and CoinbaseSans-Medium.ttf, are uncompressed TTF of 114 KB each, requested at 4.0 and 4.3 s.
Measured
max-age=14400 on hashed scripts and the chart library; two uncompressed TTF fonts
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Cache hashed assets for a year (immutable), and ship the two CoinbaseSans fonts on assets.deribit.com as WOFF2.
Where
Cloudflare cache rules; the chart's font files on assets.deribit.com.
Verify
DevTools → Network → Headers on index-*.js: max-age=31536000; CoinbaseSans files are woff2.
DB-4Trade-ready comes 0.7 s after the chart has its data: the chart is still animating.grade B
Evidence
All 5 warm and all 5 uncached campaign loads: between the chart having its data and trade-ready (warm 0.69 to 0.78 s, median 0.69 s) the only readiness condition failing is an animation running in the chart panel. Recorded load: 0.70 s, 7 of 8 samples. Nothing moves and no font or image is pending.
Gap observed
0.69 s median between the chart and trade-ready in the five warm loads
Holds back
Trade-ready itself: the page counts as ready only when nothing in a panel is still animating or loading.
Fix
Record a reload with DevTools → Animations and find what still animates in the chart after the candles are drawn, for example a toolbar loading spinner or a fade-in; end it when the data is in.
Where
The chart panel and its loading states.
Verify
DevTools → Animations during a reload: nothing in the chart container animates after the candles appear.
Likely saving
Up to ~0.7 s
DB-5The chart code arrives in a late wave, also when cached.grade C
Evidence
All 20 timed loads make 83 script requests in the same four steps: about 31 at the start, 21 a second later, 5 more, and a last group of about 26 chart files 1.5 to 2.5 s after the second step (at 2.5 s in the recorded warm load, at 3.5 s in the 1 October capture). The chart library itself is requested at 2.58 s and takes until 3.34 s in the capture. In the campaign the chart is the last panel in all 5 warm loads (median 3.5 s against 2.8 s for the other panels).
Gap observed
0.63 s between the median of the other panels and the chart median
Holds back
Chart (median 3.5 s in the timed loads).
Fix
Add preload links for the chart library and its chunks on the trading route so they load with the first wave.
Where
Trading route entry and HTML head; the chart loader.
Verify
DevTools → Network, filter JS: no new group of script requests after 1.5 s; library.js starts before 1 s.
Likely saving
Up to ~0.6 s on the chart (chart 3.5 s, other panels 2.8 s)
DB-6Twelve media files (0.35 MB) are downloaded in the first second.grade C
Evidence
1 October capture: 12 media files (sounds or short clips; the capture masks their names) from www.deribit.com, 349 KB together, requested from 0.78 s and complete by 0.87 s, before either feed delivers its first message at 0.99 s.
Measured
12 media files, 349 KB, in the first second
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Load notification sounds and other media on first use, not at start-up.
Where
The code that preloads media on the trading page.
Verify
DevTools → Network, filter "Media": no requests before the order book shows.
Likely saving
Small

Grade B: the capture shows the problem directly. Grade C: the order of events in the capture points to it; the dependency is for the team to confirm. The order is our judgement of each finding's effect on trade-ready, largest first; it is not sorted by gap. A gap is the time between two observed events or the time one piece of work takes; gaps overlap and do not add up. Where a finding is about size or count and no time was measured, the row says what was measured instead. Holds back names the panel the finding delays. Nothing here is graded higher, because no fix was confirmed by changing a page and measuring again.

Savings are estimates from the timeline, not measured after a change. They overlap, so they do not add up; the summary gives the combined estimate.

How this was measured

Timings: 5 warm and 5 uncached reloads in a seeded random order across all exchanges, each judged against a checklist frozen for this page before the campaign; trade-ready is the first moment every checklist panel shows real data, nothing is still loading, and the layout holds still for 0.5 s. The findings on this page come from separate recorded loads, which are never part of the timings. Full method.