BloFin: 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.6 s (median of 5 loads), 14 of 27 perpetual trading screens, possible rank 11 to 21; after an uncached reload 5.2 s. The largest bottleneck: Trade-ready comes 1.1 s after the last panel has its data: the chart is still animating. First change to try: Stop the chart toolbar's loading animation (tv-button-loader) once the candles are in, and check with DevTools → Animations that nothing else in the chart keeps animating.

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.6 s, range 4.3 s–5.2 s; loads: 4.3 s, 4.6 s, 4.3 s, 5.2 s, 4.7 s
Uncached reloadmedian 5.2 s, range 5.0 s–5.3 s; loads: 5.0 s, 5.2 s, 5.2 s, 5.3 s, 5.0 s
Standing14 of 27 by median; possible rank 11 to 21. 2.2 s behind the fastest, Thalex (2.4 s): 1.9 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
Notesrecent trades not measured: inactive tab

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
Price1.2 s
Account panel2.6 s +1.4 s
Order book2.7 s +0.1 s
Order form2.7 s +0.0 s
Chart3.5 s +0.8 s
Trade-ready4.6 s +1.1 s settling

Stack

Not captured on 1 October: that diagnostic load was stopped by a Cloudflare bot check before the trading page loaded.

Delivery

blofin.com through Cloudflare over HTTP/3.

HostRoleCDN edge seenConnectResponse
blofin.compageCloudflare Amsterdam13 ms272 ms
openapi.blofin.commarket dataCloudflare Amsterdam14 ms10 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 orderrecorded warm reload 3 October

From one warm reload recorded with Chrome's performance trace on 3 October 2026. Recording slows the page, so read the order and the gaps, not the totals. Some host names were masked when the recording was saved.

WhenWhat
0.38 sHTML arrives (3 October recorded warm load).
1.10 sPrice shows.
2.01–3.38 sThree groups of chart requests, one after another: 2.01–2.29 s (probably the chart settings), 2.67–2.94 s and 3.12–3.38 s (probably two rounds of candles).
2.58 sAccount panel shows; order book and order form at 2.73 s.
3.09 sChart drawn.
4.22 sTrade-ready in the recorded load: the chart keeps animating for 1.1 s after it has its data.

Request waterfallrecorded warm reload 3 October

62 of the 355 requests (the page itself, the longest and the largest) started before trade-ready in the warm reload recorded on 3 October, 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.

PageData requestwaiting for the serverdownloading

0 s0 s1 s1 s2 s2 s3 s3 s4 s4 s1blofin.com · trades223 kB428 ms2blofin.com1 kB259 ms3blofin.com355 ms4blofin.com · ticker352 ms5blofin.com1 kB280 ms6blofin.com939 B361 ms7blofin.com806 B258 ms8blofin.com941 B360 ms9blofin.com915 B283 ms10blofin.com788 B274 ms11blofin.com1 kB634 ms12blofin.com907 B268 ms13blofin.com2 kB276 ms14blofin.com2 kB277 ms15blofin.com812 B278 ms16blofin.com839 B278 ms17blofin.com875 B276 ms18blofin.com1 kB283 ms19blofin.com874 B296 ms20blofin.com779 B293 ms21blofin.com787 B260 ms22blofin.com2 kB287 ms23blofin.com46 kB23 ms24blofin.com905 B278 ms25blofin.com825 B260 ms26blofin.com1 kB272 ms27blofin.com333 ms28blofin.com · ticker318 ms29blofin.com1 kB302 ms30blofin.com806 B285 ms31blofin.com915 B290 ms32blofin.com788 B275 ms33blofin.com939 B352 ms34blofin.com939 B351 ms35host masked471 B257 ms36blofin.com753 B281 ms37blofin.com763 B271 ms38blofin.com1 kB648 ms39blofin.com748 B287 ms40blofin.com810 B271 ms41blofin.com1 kB304 ms42blofin.com925 B264 ms43blofin.com746 B263 ms44blofin.com746 B279 ms45blofin.com · ticker37 kB285 ms46blofin.com · ticker32 kB277 ms47blofin.com · candles829 B280 ms48blofin.com846 B278 ms49blofin.com981 B280 ms50host masked1 ms51blofin.com57 kB283 ms52blofin.com42 kB280 ms53blofin.com · candles21 kB277 ms54blofin.com · candles986 B277 ms55blofin.com1 kB286 ms56blofin.com1 kB276 ms57host masked470 B282 ms58blofin.com846 B258 ms59blofin.com · candles8 kB263 ms60blofin.com · candles747 B262 ms61blofin.com925 B274 ms62blofin.com974 B294 msprice 1.1 sorder book 2.7 schart 3.1 s
Download this figure as an image:

Bottlenecks and fixes, largest firstrecorded warm reload 3 October

BF-1Trade-ready comes 1.1 s after the last panel has its data: the chart is still animating.grade B
Evidence
All 5 warm campaign loads have the chart last (median 3.5 s) with trade-ready at a median 4.6 s; the median wait inside the loads is 1.13 s, and the recorded load shows 1.13 s too. In the recorded load and in all 10 timed loads we could replay, the readiness condition still failing during this wait is an animation running inside the chart panel; nothing moves in that interval. A logged-out recording the same morning names it: the chart toolbar's loading spinner (an animation named tv-button-loader) still runs on 3 to 9 elements from 4.46 to 5.67 s, after the chart legend and candles are on screen at 4.05 s. In 3 of the 5 warm loads a placeholder in the account panel also lasts into the wait.
Gap observed
1.13 s median between the last panel and trade-ready inside 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
Stop the chart toolbar's loading animation (tv-button-loader) once the candles are in, and check with DevTools → Animations that nothing else in the chart keeps animating.
Where
The chart toolbar's loading animation (tv-button-loader) and the chart's loading states.
Verify
DevTools → Animations during a reload: nothing in the chart container animates after the candles appear.
BF-2The chart's first candles are requested late, after a settings request.grade C
Evidence
Recorded load: three groups of chart requests at 2.01–2.29 s, 2.67–2.94 s and 3.12–3.38 s; the chart shows at 3.09 s, after the second group. The timed loads name them: first /uapi/v1/kline_drawings/sync-setting (chart settings, not candles), then two rounds that each pair /uapi/v1/market/candlesticks with /uapi/v1/candlesticks/query/order_kline. In one timed warm load the settings run 2.61–2.90 s and the candle rounds 3.61–3.90 s and 4.18–4.47 s, each about 0.3 s, with the chart at 4.14 s. In all 5 timed warm loads the chart shows after the first candle round, before the second starts. The first chart request starts 0.9 s after the price is on screen.
Gap observed
0.91 s between the price and the first chart request
Holds back
Chart (median 3.5 s in the timed loads).
Fix
Send the first /uapi/v1/market/candlesticks request at start-up, in parallel with the settings request and the other market data; the chart shows as soon as that first round is in.
Where
Chart datafeed: when the first candlesticks request is sent, and its size.
Verify
DevTools → Network, filter "candlesticks": the first request starts before 1 s.
BF-3Small account and header requests are repeated, and a chatbot and a large header bundle load while the chart is starting.grade C
Evidence
A timed warm load: the header configuration and public/time are each requested twice, the ticker three times, and notification/unread/count twice, taking 0.66 and 1.01 s. A logged-out recording shows the shared site header script (blofin-nav-header-bundled, 527 KB) at 1.68 s and a 640 KB animated image for the header at 2.02 s, then chatbot-entry.js (2.60–3.36 s) followed by the chatbot script (146 KB) and stylesheet from 3.37 to 4.15 s, while the chart appears at 4.05 s.
Measured
four small endpoints requested two or three times; a chatbot script, a 527 KB header script and a 640 KB header image before the chart
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Share one request per address for the header, time, ticker and notification calls; load the chatbot after trade-ready; replace the 640 KB header GIF with a lighter image.
Where
The callers of those four endpoints; the chatbot loader; the site header bundle and its image.
Verify
DevTools → Network, filter "notification/unread", "public/time": one request each; filter "chatbot": no request before the chart is drawn.
Likely saving
Not measured
BF-4151 script requests on a warm reload, a third of them in a group at 2 s.grade C
Evidence
Recorded load: 151 script requests; 62 start between 0.5 and 1.0 s and a second group of 56 between 2.0 and 2.5 s, after the price is on screen at 1.10 s. All 10 timed loads show an early group of 41 and later groups that run until shortly before trade-ready (up to 4.5–5.0 s). Two tasks block the main thread for 199 ms (at 0.85 s) and 105 ms (at 2.95 s, just before the chart).
Measured
151 script requests, 56 of them in a second group at 2.0–2.5 s
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Preload or bundle the scripts of the later group with the first one.
Where
Bundler chunking for the futures route; the HTML head.
Verify
DevTools → Network, filter JS: no new group of script requests after 1.5 s.
Likely saving
Unknown
BF-5One of three public feed sockets is opened and connected but never used.grade B
Evidence
Both logged-out follow-up recordings: three sockets to ws-public.blofin.com are opened; the second one connects (handshake at 4.18 s in one recording, 3.76 s in the other) but sends and receives nothing for the rest of the recording, while the other two exchange frames. Its purpose is unknown.
Measured
one of three public sockets connected and never used, in two recordings
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Find what opens the second public socket and either use it or stop opening it; each socket costs a connection and a handshake of over a second here.
Where
The feed client's socket set-up (three connections to ws-public.blofin.com).
Verify
DevTools → Network → WS: every open socket shows frames within a second of connecting.
Likely saving
Small: one handshake less, about 1.2 s of connection time in parallel with the others
BF-6The chart library's start-up blocks the main thread for about 0.23 s in its module runtime.grade C
Evidence
Both logged-out follow-up recordings: a task of 223 ms (at 2.74 s) and 233 ms (at 3.06 s), of which 127 and 134 ms are sampled inside one function of the chart library's module runtime (sdk/charting_library10/bundles/runtime.0716c8089d42c5b9ea4c.js) and 25 ms in inserting elements into the page. After the chart is on screen, its resize callback (_invalidationRAFCallback in library.js) forces 31 layout recalculations, 30 ms in total.
Measured
a 223 to 233 ms task in the chart runtime in each of two recordings
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Look at what the chart runtime evaluates synchronously at start-up and defer the optional modules; batch the chart's size reads in its resize callback.
Where
TradingView library set-up and its invalidation callback.
Verify
DevTools → Performance: no task over 100 ms from the chart runtime; no forced reflow from library.js after the candles are drawn.
Likely saving
Up to ~0.2 s

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.