Laboratuvar / Açık yöntem

Java 8 → 25: sipariş entegrasyonunu paralelleştirmek

256 siparişin tamamlanması: 2,95 sn → 380,91 ms. Sentetik laboratuvar; 10 tekrarın medyanı. Kod ve ham veri açık.

TamamlandıKOBİKurumsal BTPartner

Java 8 · sıralı çağrılarşu sistemeJava 25 · sanal iş parçacıkları

Java 8 → 25 LABORATUVAR ÖLÇÜMÜ

Bir sipariş, üç servis. Beklemeleri üst üste koymayın.

Fiyat, stok ve kargo yanıtlarıyla sipariş hazırlama. Aynı sipariş sonucunu sürüm değişikliği ve paralel iş akışıyla ayrı ayrı ölçtük.

İşinize etkisi

Yoğun saatlerde sipariş kuyruğunu daha kısa sürede bitirin. Dış servis beklerken çalışanı meşgul tutan yapı yerine, birbirinden bağımsız işleri birlikte yürütün.

ÖNCEJava 8 · sıralı çağrılar
YENİLENENJava 25 · sanal iş parçacıkları
Birlikte gelen sipariş256
16Yalnız ölçülen yükler256
Gerçek zaman ölçeği
AYNI İŞ · AYNI VERİ10 tekrar · medyan
01

Java 8 · sıralı çağrılar

8 işçi; her siparişin üç bağımsız servisi sırayla beklenir.

2,95 sn
CPU süresi
259,207 ms
Tepe platform iş parçacığı
12
02

Java 25 · aynı eski kod

Aynı bytecode ve aynı 8 işçi. Yalnız çalışma ortamı değişti.

2,93 sn
CPU süresi
256,989 ms
Tepe platform iş parçacığı
14
03

Java 25 · paralel platform kontrolü

Çağrılar paralel; 64 platform işçisi ve 64 dış çağrı sınırı.

399,298 ms
CPU süresi
108,114 ms
Tepe platform iş parçacığı
70
04

Java 25 · sanal iş parçacıkları

Bağımsız çağrılar paralel; aynı 64 dış çağrı sınırı, görev başına virtual thread.

380,91 ms
CPU süresi
125,21 ms
Tepe platform iş parçacığı
18

Çubuklar sıfırdan başlar; tüm uygulamalarda aynı süre ölçeği kullanılır.

Tamamlanma süresi azaldı87,1%Süre farkı: 2,569 snEski uygulama → yenilenen uygulama
Ne değişti?

Sıralı servis çağrılarını ayırıp birlikte başlattık. Java 25 sanal iş parçacıkları bekleyen görevleri az sayıda platform iş parçacığı üzerinde taşıyor. Eşdeğer platform havuzu kontrolü, aynı hızın farklı kaynak yapısıyla da elde edilebildiğini gösteriyor.

Tüm yük noktaları ve ölçüm tablosu
16 · Birlikte gelen sipariş
UygulamaMedyan süreCPU süresiTepe platform iş parçacığı
Java 8 · sıralı çağrılar182,873 ms25,94 ms12
Java 25 · aynı eski kod184,777 ms18,021 ms14
Java 25 · paralel platform kontrolü31,538 ms11,909 ms70
Java 25 · sanal iş parçacıkları31,61 ms10,142 ms18
64 · Birlikte gelen sipariş
UygulamaMedyan süreCPU süresiTepe platform iş parçacığı
Java 8 · sıralı çağrılar729,54 ms52,624 ms12
Java 25 · aynı eski kod725,443 ms65,806 ms14
Java 25 · paralel platform kontrolü97,516 ms29,633 ms70
Java 25 · sanal iş parçacıkları97,451 ms42,585 ms18
256 · Birlikte gelen sipariş
UygulamaMedyan süreCPU süresiTepe platform iş parçacığı
Java 8 · sıralı çağrılar2,95 sn259,207 ms12
Java 25 · aynı eski kod2,93 sn256,989 ms14
Java 25 · paralel platform kontrolü399,298 ms108,114 ms70
Java 25 · sanal iş parçacıkları380,91 ms125,21 ms18
İş yükünüzle CPU maliyeti

Ölçülen işlemci süresini kendi aylık hacminizle karşılaştırın.

Bir çalıştırma = 256 Birlikte gelen sipariş.

Azalan CPU süresi / ay0,3722 saat

İşlem bedeli farkı / ay—Birim bedel girildiğinde hesaplanır.

Laboratuvar CPU süresi × girdiğiniz hacim ve birim bedel. Hosting faturası tahmini değildir; boşta kaynak, ağ, depolama, lisans ve geçiş dahil değil.

Kendiniz deneyin

Kayıtlı laboratuvar sonuçlarını birlikte oynatın.

Ölçek arttığında

İş yüküne göre süre

  • Önce
  • Sonra

İş yüküne göre süre (ms)

01.0002.0003.00016642562.949,73 ms380,91 ms

Veri noktasını seçin

01.0002.0003.0001664256380,91 ms

Veri noktasını seçin

Birlikte gelen siparişİşaretçiler: ölçülen noktalar
Tablo olarak göster
İş yüküne göre süre
Birlikte gelen siparişÖnceSonra
16182,87 ms31,61 ms
64729,54 ms97,45 ms
2562.949,73 ms380,91 ms

Nasıl ölçtük?

Ortam, protokol ve teknik değerlendirme

Ortam ve veri

Ortam
Apple M3 · 8 çekirdek · 24 GiB · macOS · native arm64 · paylaşılan geliştirme makinesi
Veri seti
Üç bağımsız servis çağrısı gerektiren 16/64/256 sentetik sipariş. Her tam sonuç dizisi bağımsız Python hesabıyla aynı.
Araçlar
Corretto 8u432 · Corretto 25.0.3 · -Xms128m -Xmx128m -XX:+UseG1GC · Python output oracle
Tekrarlar
140 taze JVM koşusu: 3 yük × 4 uygulama × 10 tekrar + 20 dar servis kontrolü. En az 2 sn ısınma, sabit rastgele sıra.
Ham ölçüm verisini açın ↗

Bir sipariş, üç servis. Beklemeleri üst üste koymayın.

Fiyat, stok ve kargo yanıtlarıyla sipariş hazırlama. Aynı sipariş sonucunu sürüm değişikliği ve paralel iş akışıyla ayrı ayrı ölçtük.

Aynı Java 8 bytecode’u iki JDK üzerinde; aynı sentetik iş sonucu ve aynı dış servis. Sıralı 8 işçili kol, Java 25 runtime kontrolü ve eşdeğer 64 eşzamanlı platform/virtual kolları. İkincil kontrolde servis kapasitesi 8; tüm 140 koşu yayımlanır. Son nokta 256 sipariş deneyden önce seçildi. Süre bütün kuyruğun tamamlanmasıdır; platform iş parçacığı toplamı ThreadMXBean tepe değerinin medyanıdır.

Ölçüm betiğini inceleyin ↗

İşinize ne kazandırır?

Yoğun saatlerde sipariş kuyruğunu daha kısa sürede bitirin. Dış servis beklerken çalışanı meşgul tutan yapı yerine, birbirinden bağımsız işleri birlikte yürütün.

Değişiklik ve kapsam

Sıralı servis çağrılarını ayırıp birlikte başlattık. Java 25 sanal iş parçacıkları bekleyen görevleri az sayıda platform iş parçacığı üzerinde taşıyor. Eşdeğer platform havuzu kontrolü, aynı hızın farklı kaynak yapısıyla da elde edilebildiğini gösteriyor.

Sentetik sipariş iş akışı; gerçek loopback TCP çağrıları. Servis başına 25 ms ortak bekleme modeli ve 64 çağrı kapasitesi. Sayı, aynı anda verilen sipariş adedidir; canlı kullanıcı sayısı değildir. CPU yalnız istemci JVM; platform iş parçacığı sayısı sanal görevleri içermez.

Dış servis de kapasite ister

Servis kapasitesini 8 eşzamanlı çağrıya indirdiğimiz kontrolü de çalıştırdık: 256 sipariş, eski kolda 2936.0 ms ve sanal iş parçacıklı kolda 2777.3 ms. Darboğaz karşı servise taşındığında yalnız uygulama tarafını paralelleştirmek yetmez. Bu kontrol dahil bütün sonuçlar ham pakette.

Java 8’den sonraki hangi imkânları değerlendiriyoruz?

İmkân İş karşılığı Bu deneyle ilişkisi
Virtual threads · Java 21 Entegrasyon cevabı bekleyen çok sayıda işi daha az platform iş parçacığıyla yürütmek Paralel platform kontrolüyle birlikte ölçüldü
synchronized pinning iyileştirmesi · Java 24 Kilit içindeyken I/O bekleyen sanal görevlerin taşıyıcı thread’i tutmasını azaltmak Uygulama keşfinde kontrol edilir; buradaki hız oranı buna bağlanmaz
Compact Strings · Java 9 Uygun metin ağırlıklı veride daha küçük String belleği Ayrı heap profiliyle değerlendirilir; bu deneyin ölçümü değil
Güncel JDK ve bağımlılık bakım hattı Yama, gözlemleme ve dağıtım süreçlerini sürdürülebilir kılmak Güvenlik bulgusu ve üretim uyumluluğu proje keşfinde sınanır

Önceki aynı-bytecode CPU deneyi de erişilebilir. O deney farklı bir soruyu yanıtlar: aynı CPU işinde yalnız runtime değişince ne olur?

Kendi sisteminizde başlangıç

En çok bekleten işlemi, veri miktarını ve yoğun saatleri birlikte belirleyelim. Önce bu işin baz ölçümünü alır, sonra kodu ve erişim biçimini değiştirip aynı sonucu karşılaştırırız.

Ne yaptık?

  1. İş kuralı ve veri

    YZSentetik iş akışı, testler ve ölçüm otomasyonu hazırlandı.

    DoğrulamaYayınlanan kod ve ham sonuçlar incelemeye açıktır; müşteri projesi değildir.

  2. Uygulama değişikliği

    YZSıralı servis çağrılarını ayırıp birlikte başlattık. Java 25 sanal iş parçacıkları bekleyen görevleri az sayıda platform iş parçacığı üzerinde taşıyor. Eşdeğer platform havuzu kontrolü, aynı hızın farklı kaynak yapısıyla da elde edilebildiğini gösteriyor.

    DoğrulamaÇıktı eşitliği bağımsız kontrolle doğrulandı; bütün tekrarlar pakette tutuldu.