I Tried a Bunch of High-Performance JavaScript Charts. Here’s What Actually Felt Fast.

Hi, I’m Kayla. I make charts for a living. And for fun. I know, that’s a little nerdy. But I like when data moves smooth, and the page doesn’t hiccup. If you want the blow-by-blow numbers, my extended benchmark write-up lives here.

This past month I tested a bunch of chart libraries. I wanted speed. Smooth zoom. No weird stutter when I pan. I focused on the heavyweight contenders—the so-called “big” JavaScript chart tools—which I also covered in a separate post here.

Some tools surprised me. Some… didn’t. If you’re shopping for a broader roundup of popular libraries, you might like the notes I kept here. For an even deeper, third-party look at the landscape, check out this comprehensive comparison of JavaScript charting libraries, detailing features, performance, and use cases.

Let me explain. By the way, I dug through a bunch of white-papers on rendering pipelines at EJSChart and they shaped some of the test ideas you’ll see below.

My setup (so you know I’m not guessing)

  • Laptop 1: MacBook Pro (M1 Pro), 16GB RAM, Chrome.
  • Laptop 2: ThinkPad T14, 32GB RAM, Edge.
  • Screen: 60 Hz. Nothing fancy.

I ran each chart on both. I watched frame rate using Chrome’s perf tools. Mostly, I looked at feel. Does it drag? Does my fan spin? Does the UI freeze when I zoom?

What I charted (real stuff, not just fake lines)

  • 1,000,000 points of sensor-style data (sine wave with noise).
  • 120,000 minute stock prices (two years, one symbol).
  • 5,000 bars for sales by SKU (gross, but it happens).
  • A small dashboard with 6 charts live at once.

You know what? Big line charts are where most tools break a sweat.


Chart.js — friendly face, okay speed

I like Chart.js for small to mid charts. It feels cozy. The docs are clear. I used it in a school dashboard last spring.

  • With 120k points, the decimation plugin helped. Use “decimation: enabled, algorithm: lttb” and “parsing: false.”
  • Panning was okay. Zoom was a bit choppy. I got maybe 25–35 fps when moving fast.
  • With a million points, it crawled or froze. Decimation still helped, but it wasn’t happy.

Quirk: clicking legend items with lots of data can lag.

Verdict: great for most apps, not my pick for huge streams. For more on how other open-source chart packages stacked up, check out my dedicated comparison here.


Apache ECharts — fast and pretty, with tricks that matter

ECharts surprised me. It looks good right out of the box. The “large” mode and “progressive” settings saved the day.

What worked:

  • Line series with “showSymbol: false.”
  • “sampling: lttb,” “large: true,” and “progressive: 4000.”
  • Tooltips stayed usable up to 200k points.

Feel:

  • 120k points: smooth pan and zoom, around 45–50 fps.
  • 1M points: usable with the settings above, about 15–20 fps, and it didn’t freeze.

Quirk: I saw a tiny tooltip flicker once under heavy load. Not a dealbreaker.

Verdict: fast, stylish, and easier than rolling your own.


uPlot — silly fast for time series

If I only need line charts, uPlot is a rocket. It’s tiny and uses canvas. Not flashy, but wow.

  • 120k points: 55–60 fps while panning hard.
  • 1M points: stayed interactive, around 18–22 fps.
  • Memory stayed calm. Typed arrays help here.

It doesn’t come with every widget. You might add your own legend or date controls. But the core is quick and clean.

Verdict: my go-to for big time series when I want speed and I don’t need fancy shapes.


LightningChart JS — the speed champ (but bring your wallet)

This one is commercial. WebGL all the way. I used it for a short-term IoT demo with a gnarly stream.

  • 120k points: very smooth at 60 fps.
  • 1M points: still smooth, and zoom felt crisp.
  • Multiple charts on one page? It held up best of all.

It’s pricey, and licensing is a bit of a process. But if you need real-time charts with zero drama, this is the tank.

Verdict: best raw speed I saw. Great for trading, sensors, or labs.


D3 + Canvas — fast if you build it right

I love D3 for control. But SVG slows with big data. I switched to canvas for the draw calls.

  • With canvas, 120k points ran smooth, about 50–60 fps.
  • With 1M, I got 12–18 fps, and it stayed stable.
  • You do more work yourself. Axes. Zoom. Hit tests. All on you.

Tip: render lines on canvas, but keep axes and UI in DOM. It feels neat and still runs fast. If you want a deeper dive into my D3 canvas workflow, the full breakdown is here.

Verdict: great if you need custom rules or weird scales, and you don’t mind elbow grease.


Plotly.js — rich features, slower with huge data

Plotly is easy to explore with. You click, you get info. 3D. Stats. It’s loaded.

  • Up to ~50k points, it’s fine.
  • At 120k, panning dropped to about 8–15 fps.
  • With 1M, the tab groaned or locked up.

For dashboards with modest sizes, it shines. For giant series, not so much. I also spent time with Google Charts; spoiler: it’s fine for small dashboards but struggled in the same places—full notes here.

Verdict: choose it for features and quick wins, not for monster sets.


Recharts (React) — nice dev flow, not a big-data tool

I used Recharts in a React app for a sales team. It’s smooth for small stuff.

  • 5,000 bars? It worked, but hover felt laggy.
  • 120k points: panning was 2–5 fps. Not fun.
  • It’s SVG-based. That’s the limit.

Verdict: comfy for business charts, not made for heavy loads.


How they stacked up for me

These numbers mirror the condensed “7-library shoot-out” I published here.

Big line chart, 120k points (panning/zooming feel):

  • LightningChart JS: smooth 60 fps
  • uPlot: 55–60 fps
  • ECharts (progressive/large/sampling): 45–50 fps
  • D3 + Canvas: 50–60 fps
  • Chart.js (decimation): 25–35 fps
  • Plotly: 8–15 fps
  • Recharts: 2–5 fps

At 1,000,000 points:

  • LightningChart JS: ~45–60 fps
  • uPlot: ~18–22 fps
  • ECharts (large+progressive): ~15–20 fps
  • D3 + Canvas: ~12–18 fps
  • Chart.js: ~1–3 fps or freeze
  • Plotly: often unresponsive
  • Recharts: nope

Note: frame rates vary with your hardware and what else is on the page.

If you care about raw numbers and methodology, there’s also an in-depth analysis of high-performance JavaScript chart libraries, including benchmarks and performance tests that’s worth a read.


Bugs and quirks I hit

  • Chart.js: legend toggles hang with giant data.
  • ECharts: saw a brief tooltip flicker under heavy load.
  • uPlot: fewer built-ins; I wrote my own tooltip to match brand style.
  • LightningChart: licensing setup took time; docs are fine, just more steps.
  • Plotly: double-click to reset axes lagged with big sets.
  • Recharts: frequent re-renders in React can hurt; memoization helps a bit.

Small