Mempercepat parsing JSON berukuran besar
Intinya: Mengoptimalkan dalam urutan yang salah membuat setiap penggantian library sia-sia. Ukur network, parse dan render secara terpisah, lalu kurangi parse, perkecil payload dan gunakan streaming.

Intinya: ukur network, parse dan render secara terpisah lebih dulu — sebagian besar "parsing lambat" ternyata adalah render lambat — lalu naiki tangga secara berurutan: lebih sedikit parse, payload lebih kecil, streaming, worker, dan format biner paling akhir.
Jangan mulai dengan mengganti library. Tambahkan satu timer dan biasanya Anda akan menemukan bahwa render adalah masalahnya.
Langkah satu: ukur setiap tahap
const t0 = performance.now();
const response = await fetch(url);
const text = await response.text();
const t1 = performance.now();
const data = JSON.parse(text);
const t2 = performance.now();
render(data);
const t3 = performance.now();
| Tahap dominan | Masalah sebenarnya | Perbaikan |
|---|---|---|
| Network | Payload terlalu besar | Pemilihan field, pagination, kompresi |
JSON.parse |
Input yang memang besar | Lebih sedikit parse, streaming, worker |
| Render | Puluhan ribu node sekaligus | Virtual list, paging, collapsing |
Browser modern mem-parsing 1MB dalam sekitar 5–15ms dan 10MB dalam 80–150ms. Jika 10MB butuh dua detik, JSON.parse bukan bottleneck Anda.
Langkah dua: parse lebih sedikit
Kemenangan termurah, dan paling sering terlewat.
- Berhenti mem-parsing payload yang sama berulang kali. Sepuluh komponen yang masing-masing memanggil
JSON.parse(localStorage.getItem(...))berarti sepuluh parse. Cache sekali di level modul. - Berhenti memakai
JSON.parse(JSON.stringify(x))untuk deep copy. Biayanya lebih dari dua kali volume data;structuredClonetidak. - Jangan parse di main thread lalu mengirim objeknya ke worker.
postMessagemengkloningnya lagi. Kirim teks mentahnya dan biarkan worker yang mem-parsing. - Minta lebih sedikit field. Jika UI butuh tiga properti, API tidak seharusnya mengirim tiga ratus.
Langkah tiga: perkecil payload
Pagination dengan page/size, cursor alih-alih offset yang dalam, field ringkasan di endpoint daftar. Ini biasanya mengalahkan semua optimasi frontend digabung, karena sekaligus mengurangi network, parse dan memori.
Langkah empat: streaming
Ketika data harus diproses secara keseluruhan dan memang besar:
import { parser } from 'stream-json';
import { streamArray } from 'stream-json/streamers/StreamArray';
const pipeline = fs.createReadStream('big.json').pipe(parser()).pipe(streamArray());
for await (const { value } of pipeline) {
await handleOne(value);
}
Lebih banyak kode, dan tanpa akses acak — hanya cocok untuk pemrosesan catatan per catatan.
Langkah lima: pindahkan dari main thread
Parsing itu cepat tetapi memblokir. Pindahkan ke worker dan kirim teks, bukan objek hasil parse, atau structured cloning menggandakan biayanya.
Langkah enam: ganti format, paling akhir
Untuk lalu lintas internal yang konsisten puluhan megabyte, NDJSON mengalir secara alami, dan Protobuf atau MessagePack lebih kecil dan lebih cepat. Keduanya adalah perubahan protokol yang membutuhkan koordinasi.
Jangan
evalJSON: tidak aman dan tidak lebih cepat- Stringify JSON untuk menyematkannya dalam JSON: menggandakan ukuran
- Parse ratusan ribu string kecil dalam loop: batch-kan
FAQ
Bagaimana saya tahu apakah parsing atau render yang menjadi bottleneck?
Ukur waktu request, pembacaan teks, JSON.parse dan render secara terpisah dengan performance.now(), lalu anggap tahap terbesar sebagai bottleneck sebenarnya. Browser modern mem-parsing 1MB dalam sekitar 5–15ms dan 10MB dalam 80–150ms, jadi payload 10MB yang butuh dua detik jarang merupakan masalah JSON.parse.
Mengapa mengganti library biasanya tidak membantu?
JSON.parse sudah native dan cepat; sebagian besar "parsing lambat" berasal dari parsing berulang atau merender puluhan ribu node sekaligus. Mengganti library memberi 10–30%, sementara menghapus satu parse penuh sering menghemat separuh.
Haruskah saya memindahkan parsing ke Web Worker?
Pindahkan ke worker ketika parsing memblokir main thread dan halaman membeku atau animasi kehilangan frame. Kirim teks mentah alih-alih objek hasil parse, jika tidak structured cloning postMessage menggandakan biayanya.