deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Bağımsız benchmark: TypeScript 7.1 beta, 353 bin satırlık NestJS projesini 12,4 saniyeden 2,8 saniyeye düşürdü

Bağımsız bir dev.to benchmark'ı, TypeScript 7.1.0-beta'nın native derleyicisinin 353.000 satırlık bir NestJS kopyasını 12,42 saniyeye karşılık 2,76 saniyede tip denetiminden geçirdiğini gösteriyor — 4,5 katlık bir kazanç ama Microsoft'un duyurduğu 12 katın altında.

Bağımsız benchmark: TypeScript 7.1 beta, 353 bin satırlık NestJS projesini 12,4 saniyeden 2,8 saniyeye düşürdü

Pazarlama benchmark'ı yerine gerçek bir proje

dev.to'da yayımlanan bağımsız bir benchmark, native TypeScript derleyicisini kimsenin bir tanıtım slaytı için seçmediği bir kod tabanında test etmeyi amaçladı: gerçek bağımlılıkları kurulmuş, taze bir NestJS framework klonu. 2.934 dosya ve yaklaşık 353.000 satırdan oluşan proje, tsc --noEmit ile — bir CI hattının ya da pre-commit hook'unun her gün yaptığı iş — üç derleyici sürümü altında tip denetiminden geçirildi: son JavaScript tabanlı sürüm olan 6.0.3, ilk kararlı native sürüm olan 7.0.2 ve 7.1.0-beta. Her sürüm aynı makine ve aynı kod üzerinde üç kez çalıştırıldı ve en hızlı süre raporlandı.

Derleyici En hızlı çalışma Yoğun bellek
TypeScript 6.0.3 12,42s 1,13 GB
TypeScript 7.0.2 4,95s 1,86 GB
TypeScript 7.1.0-beta 2,76s 1,06 GB

Büyük kazançlar, duyurulan rakamın altında

Gönderide alıntılandığı üzere Microsoft'un sürüm materyalleri, Go tabanlı yeniden yazılımın tek bir derlemeyi 125,7 saniyeden 10,6 saniyeye, kabaca 12 kat iyileştirdiğini anlatıyor. NestJS'de tablo daha mütevazı: dev.to benchmark'ına göre 7.0.2, 6.0.3'ten 2,5 kat; 7.1 beta ise 4,5 kat daha hızlı. Yazarın pratik önerisi, TypeScript derleyicisinin kendi tip ağırlıklı kaynağı yerine orta ölçekli bir Node framework'üne benzeyen projelerin 12 kat değil, 2,5 ile 4,5 kat arasında bir hızlanma planlaması gerektiği yönünde.

7.0.2'deki bellek sapması

Sonuçlardan biri, native bir yeniden yazımın vaat ettiğinin tersine düşüyor. Üç çalıştırmanın tümünde 7.0.2, yerini aldığı JavaScript derleyicisinden yaklaşık %65 daha fazla bellek zirvesine ulaştı — kabaca 1,8 GB'a karşılık 1,13 GB. Yazar, TypeScript 6'nın ayak izine göre boyutlandırılmış bir CI runner'ının 7.0.2'de bellek yetersizliği hatalarıyla karşılaşabileceği uyarısında bulunuyor. 7.1 beta bu gerilemeyi tersine çevirerek yaklaşık 1,06 GB ile 6.0.3'ün hafif altına iniyor. Tutarlı gözlemlerin ötesinde bir kök neden sunulmuyor.

Eski JavaScript API'si bozuk kalmaya devam ediyor

Yeniden yazılım, araçların yıllardır bel bağladığı programatik arayüzü kaldırdı. 7.0.2'de typescript paketini require etmek yalnızca sürüm dizgileri veriyor — createProgram yok, ts.sys yok. Yazar bunu, ts-node 10.9.2'yi yeni derleyiciye yönlendirerek doğruladı; ts-node anında çöktü. Beta'nın öne çıkan özelliği stabilize edilmiş bir API olduğu için yazar geri getirildiğini bekliyordu; bunun yerine 7.1, 7.0'ın typescript/unstable/sync yolundan taşınarak typescript/sync ve typescript/async konumunda yeni bir arayüz sunarken varsayılan dışa aktarım yalnızca sürüm bilgisi vermeyi sürdürüyor. Aynı ts-node testi beta üzerinde de birebir aynı çökmeyle sonuçlandı. Derleyiciyi bir alt süreç olarak çalıştırmak yerine programatik biçimde çağıran araçların — ts-node, ts-jest ve typescript-eslint'nin tip duyarlı kuralları — yeni giriş noktalarına göre yeniden yazılması gerekiyor; sürüm yükseltmek tek başına hiçbir şeyi çözmez.

Varsayılan olarak daha katı yapılandırmalar ve paralel derlemeler

Yapılandırma dosyaları da yükseltmeleri engelleyebilir. Kullanımdan kaldırılan importsNotUsedAsValues seçeneği 6.0.3'te ses çıkarmadan kabul ediliyordu ama 7.0 altında sert bir hata üretiyor. Yazar, yükseltmeden önce eski tsconfig dosyalarında önceden göz ardı edilebilen seçenekler için grep yapılmasını öneriyor.

Performans tarafında paralel project-reference derlemeleri artık varsayılan ve kaçış kapısı olarak --singleThreaded bayrağı var. Sentetik bir dört paketli composite projede 7.0.2'nin varsayılan kipi bir saniyenin altında tamamlanırken, tek iş parçacıklı modda yaklaşık 1,4 saniye, 6.0.3'te ise 4,26 saniye sürdü — dört çekirdekli bir makinede yalnızca paralellikten gelen kabaca 1,8 kat, native denetleyicinin ham hızının üzerine biniyor. Yazar, farkın daha fazla bağımsız proje ve daha fazla çekirdeğe sahip büyük monorepo'larda açılmasını bekliyor.

Teşhisler kazanımın nereden geldiğini gösteriyor

Gönderideki --extendedDiagnostics çıktısına göre tip denetimi her sürümde duvar saatini domine ediyor ve native derleyicinin oransal olarak en çok kazandığı yer orası: parse süresi 1,16s'den 0,291s'ye, bind süresi 0,61s'den 0,093s'ye, check süresi ise 9,91s'den 2,502s'ye düştü. Çabasının büyük kısmını denetlemekten çok ayrıştırmaya harcayan kod tabanları daha küçük kazançlar görecek. Yazar ayrıca Symbols ve Types sayaçlarının aynı kod üzerinde sürümler arasında kabaca iki katına çıktığı konusunda uyarıyor; bu büyük olasılıkla gerçek bir iş değil, iç muhasebedeki bir değişikliği yansıtıyor.

Neden önemli

Benchmark, native yeniden yazımın temsilî bir projede 12 saniyelik bir denetimi 3 saniyenin altına indiren büyük ve günlük bir hızlanma sağladığını bağımsız biçimde doğruluyor — aynı zamanda beklentileri Microsoft'un duyurduğu katların epey altına kalibre ediyor. Ayrıca gerçek yükseltme maliyetini de haritalıyor: güncel kararlı sürümde daha yüksek bellek, geniş araç ekosisteminin göç etmesi gereken hâlâ bozuk klasik API ve daha katı yapılandırma doğrulaması. Atlayı planlayan ekipler, önce ve sonra kendi teşhis çıktılarını ölçmeli ve CI runner'larını 7.0.2'nin bellek ayak izini göz önünde bulundurarak boyutlandırmalı.

  • #typescript
  • #compilers
  • #benchmarks
  • #javascript
  • #developer-tools

İlgili yazılar