{
  "id": 9012586,
  "title": "I Benchmarked Five Ways to Speed Up a Slow React Table. Two of Them Did Nothing.",
  "url": "https://urgent.news/2026/09/21/i-benchmarked-five-ways-to-speed-up-a-slow-react-table-two-of-them",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-21T21:24:17.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/adityaprakash/i-benchmarked-five-ways-to-speed-up-a-slow-react-table-two-of-them-did-nothing-4b0i"
  },
  "original_language": "en",
  "account": "Five methods to enhance the performance of a slow React table were examined, with two yielding no improvement. The initial approach was to wrap the row in `React.memo`, but this alone offered only a negligible 13ms reduction. Another method involved utilizing `memo`, `useCallback`, and `useMemo` together, which reduced the render time to 47ms, a 3.5x improvement. However, two crucial details were overlooked: `handleSelect` should accept the `id` argument directly rather than closing over it, and the dependency array for `useMemo` should accurately reflect the dependencies to avoid unnecessary recomputation. An intriguing result was variant 4, which achieved the fastest render time of 0.4ms by omitting the table's filtering capability. This occurred because the table's children were created outside the parent component responsible for rendering it, effectively bypassing the need for re-rendering. While this pattern can be beneficial for components whose state doesn't affect expensive subcomponents, it's ineffective for filtering scenarios where the filtered data is required. Thus, the optimal solution combines variations 2 and 3, implementing `useCallback` and `useMemo` correctly to achieve significant performance enhancements in React tables.",
  "summary": "A table of 4,000 rows with a filter box above it. You type \"acme\" and the cursor lags behind your fingers. Every frontend developer hits this shape eventually, and the advice for fixing it is remarkably consistent: wrap the row in React.memo . That advice is where I started too, and it turns out to be close to worthless on its own. So rather than argue about it, I built a harness that measures…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}