- Evidence
- A request to a masked data host starts at 2.65 s and its 7.6 KB response arrives at 3.44 s; the book is drawn at 3.44 s. A live feed had been delivering since 1.83 s, 1.6 s earlier. One recorded load: the match in time suggests the book waits for this request, but does not prove it.
- Gap observed
- 0.79 s for the data request that completes when the book is drawn
- Holds back
- Book (median 3.2 s in the timed loads).
- Fix
- Send the request that completes when the book appears together with the first data requests at 1.0 s, or draw the book from the first socket depth message.
- Where
- Book panel data start-up: the request that starts at 2.65 s in the recording.
- Verify
- DevTools → Network, sorted by start time: the request that ends when the book appears starts before 1.5 s. DevTools → Performance: book paint within 200 ms of the first depth message.
- Likely saving
- Unknown: the request takes 0.79 s and starts 1.6 s after the first data requests
Insilico Terminal: where its trading screen loses time, and what to fix
Measured from the Netherlands in a logged-in Chrome, October 2026.
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 reload | median 3.5 s, range 3.5 s–4.0 s; loads: 4.0 s, 3.5 s, 3.7 s, 3.5 s, 3.5 s |
| Uncached reload | median 3.7 s, range 3.4 s–4.0 s; loads: 3.7 s, 3.7 s, 3.4 s, 4.0 s, 3.4 s |
| Standing | 7 of 27 by median; possible rank 6 to 10. 1.1 s behind the fastest, Thalex (2.4 s): 1.4 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 ready | 5 of 5 warm, 5 of 5 uncached |
| Notes | order book or trades drawn as a picture; checked as drawn and updating, values not read; chart checked as drawn and updating, prices not read; recent trades not measured: left out; measured with an Extended exchange account connected, so its market and account panels show Extended's data |
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.
Stack
A trading terminal for other exchanges, measured with an Extended exchange account connected; it draws its book and trades on canvas. From the 3 October recorded warm load.
Delivery
insilicoterminal.com over HTTP/2; a service worker answers the HTML (in 5 ms) and 28 of the 31 scripts. Market and account data come from the connected exchange; the recording masks the data hosts, so it does not show whether the terminal reaches Extended directly or through its own servers.
| Host | Role | CDN edge seen | Connect | Response |
|---|---|---|---|---|
| insilicoterminal.com | page | — | 28 ms | 27 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.
| When | What |
|---|---|
| 0.005 s | HTML arrives from the service worker. |
| 0.11 s | Two Google Fonts stylesheets, each holding up the first paint for about 0.12 s. |
| 0.45–0.65 s | A 305 KB (compressed) data response from insilicoterminal.com; older timed loads suggest it is /settings, which unpacks to 7.3 MB. |
| 0.65–1.18 s | One 534 ms main-thread task, in a script from insilicoterminal.com. |
| 1.0–1.76 s | Four data requests to the masked data hosts, 0.27 to 0.44 s each. |
| 1.55 s | Price shows. |
| 1.67 s | First market-data request. |
| 1.85 s | Order form shows. |
| 1.83–2.22 s | First frames received on a live feed at 1.83 s; first frame sent at 1.99 s and the next one received at 2.22 s. |
| 2.65 s | A data request starts; its response arrives at 3.44 s. |
| 2.75 s | Chart drawn. |
| 3.14 s | Orders panel shows. |
| 3.44 s | Order book drawn, as the 2.65 s request completes: trade-ready in the recorded load. |
Request waterfallrecorded warm reload 3 October
62 of the 136 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.
PageScriptData requestStylesheetFont, media, other filewaiting for the serverdownloading
Bottlenecks and fixes, largest firstrecorded warm reload 3 October
- Evidence
- Campaign warm reloads: the orders panel finished last in 5 of 5, median 3.5 s; the order book 3.2 s, the chart 2.5 s, the price 1.7 s. Uncached: orders last in 4 of 5. In the recorded load the order is reversed: orders at 3.14 s, book at 3.44 s. The recording masks the data hosts, so it does not show which request the panel waits for.
- Gap observed
- 0.35 s between the order book median and the orders panel median
- Holds back
- The orders panel (median 3.5 s in the timed loads), and with it trade-ready.
- Fix
- Find the request the orders panel waits for and send it with the first data requests at 1.0 s, not after the market panels.
- Where
- Orders and positions panel data start-up.
- Verify
- Reload with DevTools → Network open: the orders panel fills before the order book, not after it.
- Likely saving
- Unknown; the orders median is 0.35 s after the book median
- Evidence
- First ticker-class request at 1.67 s and first frame sent on the socket at 1.99 s, although the HTML is there at 5 ms and the last script starts at 1.65 s. Four other data requests to masked hosts start at 1.0 s; the recording does not show what they fetch.
- Gap observed
- 1.67 s between HTML arrival and the first market-data request
- Holds back
- Every panel: nothing is shown before this ends.
- Fix
- Open the socket and subscribe from the first script, not after the app has started.
- Where
- Feed client start-up.
- Verify
- DevTools → Network → WS: the first subscription frame is sent before 0.5 s.
- Likely saving
- Unknown
- Evidence
- Five long tasks total 0.83 s before the price shows at 1.55 s. The longest, 534 ms, starts at 0.65 s, the moment a 305 KB (compressed) response from insilicoterminal.com finishes. All 20 older timed loads show one request of that size, insilicoterminal.com/settings, which unpacks to 7.2–7.3 MB. The recording attributes the task to a script from insilicoterminal.com but not to a function, so the link between the response and the task is by timing only.
- Gap observed
- 0.83 s of main-thread time before the first panel
- Holds back
- Every panel: nothing is shown before this ends.
- Fix
- Check with a start-up profile whether the 534 ms task is the handling of the /settings response; if so, send less in /settings (7.3 MB unpacked) or parse it in a worker.
- Where
- The /settings endpoint and the script that handles its response.
- Verify
- DevTools → Performance: no task over 200 ms before the price shows; Network: /settings well under 1 MB unpacked.
- Likely saving
- Unknown until profiled; the task is 0.53 s
- Evidence
- In the campaign the trades panel drew nothing in 9 of 10 loads; it was left out of the checklist for this campaign.
- Gap observed
- 45 s with the recent-trades canvas blank
- Holds back
- The recent-trades panel, which is not in the timed checklist.
- Fix
- Check the trades canvas subscription: it stays empty on most loads.
- Where
- Recent-trades panel.
- Verify
- Reload 10 times: trades appear within a few seconds every time.
- Likely saving
- None on trade-ready: a correctness fix
- Evidence
- Two stylesheets from fonts.googleapis.com each block rendering for about 0.12 s (124 and 123 ms), although both come from the browser cache.
- Gap observed
- 0.12 s of render blocking for each of two stylesheets
- Holds back
- The first paint, not a trading panel.
- Fix
- Serve the font CSS from insilicoterminal.com or inline it, with font-display: swap.
- Where
- The two fonts.googleapis.com stylesheet links in the HTML head.
- Verify
- DevTools → Performance → Insights: no render-blocking request to fonts.googleapis.com.
- Likely saving
- Small; first paint only
- Evidence
- An older timed load (the recording masks file names): seven background images under /card-bg/ total 2.8 MB (BG-3.png alone 1.9 MB), requested at 1.6–1.7 s; the font Inter-VariableFont_opsz_wght-c8O0ljhh.ttf is 875 KB as uncompressed TTF; main-CN527iUI.js is 3.1 MB unpacked and Trade-DI0U4JDP.js 2.4 MB. A service worker serves most of these on a warm reload, so the cost is mostly on a first visit.
- Measured
- 2.8 MB of background images and a 0.9 MB font
- Holds back
- Not established: the captures do not show which panel waits for this.
- Fix
- Convert the card backgrounds to a modern format and load them where they are shown; ship the font as a WOFF2 subset.
- Where
- The /card-bg/ images and the font file in the app build.
- Verify
- DevTools → Network on a first visit: no /card-bg/ request on the trading screen; the font is woff2.
- Likely saving
- Small on a reload; about 3.5 MB less on a first visit
- Evidence
- All 20 older timed loads: /assets/SlaveWrapper-azUJVPJl.js appears 16 times per load (1.76–1.79 s in one), and the status request for the market (jp.td.insilicoterminal.com/status/extended/…) two or three times, each taking about 0.95 s (1.48–2.43 s). The script comes from the cache; the count suggests 16 workers are started.
- Measured
- one script requested 16 times and one status request sent two or three times per load
- Holds back
- Not established: the captures do not show which panel waits for this.
- Fix
- Check how many workers the trading screen needs at start-up, and share one status request.
- Where
- The worker pool that loads SlaveWrapper; the callers of /status/extended.
- Verify
- DevTools → Network, filter "SlaveWrapper" and "status/extended": the number of requests at start-up.
- Likely saving
- Unknown
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 (this page's stored loads were scored again afterwards with one change: the recent-trades panel was left out); 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.