İçeriğe geç
Muhammet Şafak
en
Arayüz performansı

Chart.js'i nasıl import ettiğin, ziyaretçiye kaç kilobayt gönderdiğini belirliyor

`chart.js/auto` ile seçmeli `Chart.register()` arasındaki fark, gerçek bir üretim derlemesinde kaç kilobayt?

Bulgu

Seçmeli register, `chart.js/auto` yerine 9,7 kB gzip tasarruf ettiriyor (67,8 → 58,1 kB, %14,3). Asıl büyük düşüş kütüphanenin kendisinde değil, hiç kullanılmayan controller'ları dışarıda bırakmakta: yalnız çubuk grafiği kaydeden bir sayfa 46,0 kB'a iniyor — auto'nun üçte ikisi.

Seçmeli register
58,1 kB -14,3%
chart.js/auto
67,8 kB
Yalnız çubuk
46,0 kB -33,9%
Sayfanın ada maliyeti
65,3 kB

Yöntem

Aynı depo, aynı grafik bileşeni ve aynı içerik dosyasıyla dört ayrı `npx astro build` koşuldu; her koşuda yalnız `chart-render.ts`'in import/register satırları değiştirildi. Ölçülen şey Rolldown'ın ürettiği `dist/_astro/chart-render.*.js` parçasının `gzip -9` boyutudur. Derleme deterministik olduğu için tek koşu yeterli: aynı girdi aynı baytı üretti, dört strateji de iki kez koşulup aynı sonuç doğrulandı.

Yüksek güven Tekrarlı ölçüm, denetimli ortam, ham veri paylaşıldı.
Ölçüm tarihi

3 gün önce ölçüldü

Yayın

Ortam

Astro
7.1.3
Chart.js
4.5.1
Bundler
Rolldown (Astro 7 varsayılanı)
Node
24.18.0
İşletim sistemi
macOS (Darwin 25.6)
Sıkıştırma
gzip -9

Teknolojiler

Chart.js Astro Rolldown Preact

Tekrarlamak için

npx astro build && gzip -9 -c dist/_astro/chart-render.*.js | wc -c

Bu sitede yıllardır tek bir kural vardı: zorunlu istemci JS yok. Research bölümünü açarken o kuralı bilerek deldim — çok serili bir ölçüm, tooltip’i olmayan bir grafikte okunmuyor. Ama “deldim” ile “önemsedim” arasındaki fark, gönderilen baytı ölçüp ölçmediğinde ortaya çıkıyor.

Chart.js’in dokümantasyonu iki yol gösteriyor. Kısa yol:

import Chart from 'chart.js/auto';

Uzun yol:

import { Chart, BarController, BarElement, CategoryScale, LinearScale } from 'chart.js';
Chart.register(BarController, BarElement, CategoryScale, LinearScale);

İkisi de çalışıyor. Sorum şuydu: aradaki fark, gerçek bir derlemede ölçülebilir bir sayı mı, yoksa mikro-optimizasyon mu?

Neyi ölçtüm

Sentetik bir bundler kurmadım — çünkü ölçmek istediğim şey “Chart.js ne kadar küçülebilir” değil, bu depo ne kadar gönderiyor. O yüzden dört koşunun dördü de sitenin kendi astro build hattından geçti: aynı MDX kaydı, aynı grafik bileşeni, aynı Preact adası. Koşular arasında değişen tek şey src/components/research/chart-render.ts dosyasının ilk on satırıydı.

Chart.js parçasının gzip boyutu, import stratejisine göre

Dördü de aynı grafiği çiziyor. Fark yalnızca hangi controller ve eklentinin pakete girdiğinde.

kB düşük olan iyi Kaynak: astro build çıktısı, dist/_astro/chart-render.*.js, gzip -9

Veri tablosu
astro build çıktısı, dist/_astro/chart-render.*.js, gzip -9
Seri chart.js/autobar+line+tooltip+fillerbar+line, eklentisizyalnız bar
gzip 67,8 kB58,1 kB51,2 kB46 kB

Grafik tarayıcıda çizilir; aşağıdaki tablo aynı veriyi taşır.

Ham (sıkıştırılmamış) boyutlarla birlikte tablo şöyle:

Strateji Ham gzip auto’ya göre
chart.js/auto 204.965 B 69.466 B
bar + line + Tooltip + Filler bu sitede kullanılan 172.313 B 59.538 B −9.928 B (%14,3)
bar + line, eklentisiz 149.793 B 52.378 B −17.088 B (%24,6)
yalnız bar 134.868 B 47.114 B −22.352 B (%32,2)
Ham boyut ile gzip boyutu aynı yönde ama aynı oranda hareket etmiyor: sıkıştırma, silinen kodun bir kısmını zaten sıkıştırıyordu.

Sayı ne söylüyor

Seçmeli register, auto’ya göre 9,7 kB gzip kazandırdı. Bu, dokümantasyonun “tree-shaking destekleniyor” cümlesinin arkasındaki gerçek rakam — ve tek başına bakıldığında mütevazı: %14,3.

Asıl bilgi ikinci ve üçüncü satırda. Tooltip ile Filler eklentilerini düşürmek 7,2 kB daha götürüyor; çizgi grafiği hiç kullanmayan bir sayfa 5,3 kB daha kazanıyor. Yani maliyetin çoğu kütüphanenin çekirdeğinde değil, kullanılmayan çizim türlerinde. auto’nun yaptığı şey de tam olarak bu: hepsini kaydediyor.

Sayfanın tamamı ne ödüyor

Chart.js parçası tek başına anlamlı değil; ziyaretçi ada hidratlandığında şunları indiriyor:

Parça gzip Ne
chart-render 58,1 kB Chart.js + tema köprüsü
preact 4,9 kB çalışma zamanı çekirdeği
hooks 0,8 kB useRef / useEffect
client 0,8 kB @astrojs/preact istemci köprüsü
ChartIsland 0,6 kB bileşenin kendisi
Toplam 65,3 kB
Ölçüm, tek grafikli bir research sayfasının ada maliyetidir. `signals.module` parçası derlemede üretiliyor ama sayfa onu hiç istemiyor — @astrojs/preact yalnız `data-preact-signals` varsa yüklüyor.

Framework tarafı toplamın %10’undan azı (6,3 kB). Yani Preact yerine React seçmek burada asıl fark yaratmazdı demek yanlış olur — tam tersi: React’in react-dom maliyeti tek başına Chart.js’e yaklaşıyor. Ama bu ayrı bir ölçüm, ayrı bir kayıt.

Ne yaptım

chart-render.ts bu dört satırla açılıyor ve auto girişini hiç kullanmıyor:

import {
  BarController, BarElement, LineController, LineElement, PointElement,
  CategoryScale, LinearScale, Tooltip, Filler,
} from 'chart.js';

Chart.register(
  BarController, BarElement, LineController, LineElement, PointElement,
  CategoryScale, LinearScale, Tooltip, Filler,
);

Legend listede yok: gösterge sunucuda HTML olarak basılıyor. Böylece hem sitenin kendi token’larıyla biçimleniyor hem de JavaScript hiç çalışmasa bile yerinde duruyor — bu sayfadaki grafiğin altındaki “Veri tablosu” katlamasıyla aynı mantık.

İlgili yazılar

Paylaş:

Diğer Kayıtlar

Tüm kayıtlar
Araç karşılaştırması Ölçüm

Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor

Yedi PHP framework'ü kurulduğunda diskte kaç megabayt, istek başına kaç dosya ve ilk istekte kaç milisaniye tutuyor — ve bu sayılardan hangisi gerçekten yük altındaki hızı öngörüyor?

Bulgu

Disk boyutu hiçbir şey öngörmüyor: Yii2 en büyük vendor'a sahip (34,1 MB) ama istek başına yalnız 62 dosya yüklüyor — sahanın en azlarından. İstek başına dosya sayısı da öngörmüyor: CodeIgniter 96 dosya yükleyip 6.431 istek/sn veriyor, Symfony 224 dosya yükleyip 13.067 veriyor. Gerçekten ayrışan tek şey opcache soğukken ödenen ilk istek: Phalcon 2,2 ms, Laravel 72,2 ms — otuz üç kat. Bu, her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturasıdır ve framework başına birkaç kilobayt değil, onlarca milisaniye tutuyor.

Yüksek güven
Servis & yük Ölçüm

Yedi PHP framework'ü aynı yükte ölçtüm: fark, istek gerçek iş yaptıkça küçülüyor

Aynı donanımda, aynı PHP sürümünde ve aynı yedi rotayla, Laravel, Symfony, CodeIgniter, Yii2, Phalcon, Laminas ve Slim saniyede kaç isteği ne gecikmeyle karşılıyor?

Bulgu

Boş bir rotada en hızlı ile en yavaş arasında 4,4 kat var (Slim 25.975, Laravel 5.966 istek/sn). Ama istek gerçek iş yapmaya başlayınca fark kapanıyor: veritabanından tek satır çeken bir istekte 3,7 kata, yirmi satır çekende 3,5 kata iniyor. Phalcon boş rotada üçüncüyken veritabanı isteğinde beşinciye düşüyor — C eklentisi olmak, sorgu beklerken bir işe yaramıyor. Asıl pahalı olan şey framework seçimi değil: Laravel'in kendi varsayılan web middleware grubu, aynı yanıtı 5.858'den 2.176 istek/sn'ye düşürüyor — yani tek bir varsayılan, framework'ler arasındaki farkın çoğundan daha pahalı.

Orta güven

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi