Altifigence Academy

15 / 24 · Praktikum

Praktikum: periksa 1024 pola penundaan

Uji penahanan, penggantian, dan pengosongan dengan seluruh pola ready sepuluh siklus.

Pertahankan nilai dan urutan saat tertunda

Buat elastic-model.mjs secara manual, simpan kode berikut, lalu jalankan node elastic-model.mjs. Sumber menawarkan empat item berurutan dan hanya maju ketika diterima. Bit pola nol mengendalikan tepi 0, bit satu mengendalikan tepi 1, dan seterusnya. Uji seluruh 1024 pola ready sepuluh bit, lalu pertahankan penerima siap untuk menguras pekerjaan yang belum selesai.

Kirim dari slot lama sebelum menentukan penggantinya. Slot kosong menerima satu item meskipun penerima tertunda. Slot penuh yang tertunda tidak dapat memajukan sumber. Menaikkan next pada setiap tepi akan membuang item yang belum diterima dan membuat sumber uji salah meskipun penyangganya benar.

javascript
import assert from 'node:assert/strict';
const values = [0, 9, 255, 12];
let deliveries = 0;
for (let pattern = 0; pattern < 1024; pattern++) {
  let slot = null, next = 0;
  const seen = [];
  for (let edge = 0; edge < 20; edge++) {
    const ready = edge >= 10 || ((pattern >>> edge) & 1) === 1;
    const old = slot;
    const inReady = old === null || ready;
    if (old !== null && ready) seen.push(old);
    if (inReady) {
      slot = next < values.length ? { tag: next, y: values[next] } : null;
      if (slot !== null) next++;
    } else {
      assert.deepEqual(slot, old);
    }
    assert.equal(next - seen.length, Number(slot !== null));
  }
  assert.deepEqual(seen, values.map((y, tag) => ({ tag, y })));
  assert.equal(slot, null);
  deliveries += seen.length;
}
console.log(`ELASTIC PASS: 1024 patterns, ${deliveries} deliveries`);

Untuk pola nol, penerima tertunda selama sepuluh tepi pertama. Tag0,y0 masuk ke slot kosong pada tepi 0 dan tetap di sana hingga tepi 9. Tepi 10 mengirimnya dan menyimpan tag1,y9. Tag 1,2,3 kemudian ditransfer pada tepi 11,12,13. Nol yang valid tidak boleh dianggap sebagai null. Keberhasilan melaporkan 1024 pola dan 4096 pengiriman.

Jumlah yang diterima dikurangi yang dikirim sama dengan okupansi saat ini setelah setiap tepi. Pencatatan lokal ini mempersempit lokasi kegagalan lebih awal daripada perbandingan keluaran akhir. Pemeriksaan penahanan mencakup pemeliharaan muatan, meskipun membandingkan implementasi nyata memerlukan pengamatan keluaran sebenarnya, bukan hanya variabel model yang tidak berubah. Menguji semua pola sepuluh siklus merupakan pengujian terbatas, bukan bukti untuk setiap panjang penundaan yang mungkin. Penyelesaian pada akhirnya juga mengasumsikan penerima akhirnya siap; tekanan balik tanpa batas menuntut pemeliharaan, bukan pengiriman yang dijamin.

Coba sendiri

Untuk pola nol, seberapa jauh next pada sumber maju selama tepi 0 hingga 9? Berapa okupansi dan next-seen.length setelah tepi 10?

Baca penjelasan

Hanya item pada tepi 0 yang diterima, jadi next=1. Pada tepi 10, tag0 ditransfer dan tag1 masuk: next=2, seen.length=1, serta selisih dan okupansi slot sama-sama satu.

Lesson files

elastic-model.mjs ↓

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.