---
title: 'Ölçüm Disiplini'
source: 'https://academia.sh/tr/kurslar/python-eszamanlilik/olcum-disiplini'
course: 'Eşzamanlılık ve Başarım'
language: tr
updated: '2026-08-17T18:10:24+00:00'
license: 'CC BY-SA 4.0'
---

# Ölçüm Disiplini

Aynı koşum altı ayrı bildirimle 26 ile 80 arasında altı ayrı sayı verir; kurulum sayılmadığında 31, sayıldığında 37 tik çıkar ve %19,35'lik bu fark, yalnız bir rejimde sayıldığında iki rejimin sıralamasını tersine çevirir.

Önceki ders bir tablo boyunca her satırın neyi ölçtüğünü satırın adına yazdı, ve iki satır
aynı sayıyı verdi: **37**. Biri sınır maliyeti ödeyen ama kilidi bırakan rejimdi, öbürü
sınır ödemeyen ama kilidi bırakmayan. Adlar silinseydi geriye iki eşit sayı kalırdı ve
ikisinin aynı şeyi ölçtüğü sanılırdı.

Bu kursun son dersi tam bu tehlikeyi ölçer. Sorusu şudur: **bir ölçüm, neyi saydığını
söylemeden karşılaştırılabilir mi?** Yanıt hem gösterilecek hem de kursun kendi yöntemine
uygulanacak.

## Karşılaştırmalı Ölçüm Ne Gerektirir

**Karşılaştırmalı ölçüm (benchmark)**, iki seçeneği aynı iş üzerinde yan yana koyan
ölçümdür. "Aynı iş" koşulu yerine geldiğinde bile karşılaştırma kendiliğinden geçerli olmaz;
üç bildirim daha gerekir.

**Birimin bildirimi:** sayılan şey nedir — tik mi, adım mı, çağrı mı, nesne mi? Bu kursun her
ölçümü birimini adıyla yazdı, ve bunun bir nedeni vardı.

**Rejimin bildirimi:** kaç işçi, kaç yuva, hangi yük? Aynı kurgu sekiz işçi ve tek yuvada 31,
tek akışta 80 tik verir; rejim bildirilmeden sayı bir şey söylemez.

**Sınırın bildirimi:** ölçüm nerede başlıyor ve nerede bitiyor? İşin hangi bölümü sayıma
dahil? Bu üçüncüsü en sık atlanandır ve bu dersin ölçtüğü şeydir.

Üçünün üstünde bir dördüncüsü durur: **kâhin.** Ölçümün doğru sonucu verdiğini ne
söylüyor? Bu kursta kâhin kurgunun kendisidir — görevlerin adım dizisini biz ürettik, bu
yüzden toplam adımın 80 olduğunu ölçmeden biliyoruz ve her tablo bu sayıyla sınanabiliyor.
Kâhini olmayan bir ölçüm büyük sayıyı küçükten ayırabilir ama doğruyu yanlıştan ayıramaz;
eniyilemenin sonucu bozduğu durumda tablo yine güzel görünür.

## Kurulum Sayılır mı

Bir işin başlamadan önce ödenen bir bedeli vardır: yürütme bağlamının kurulması, görevlerin
dağıtılması, ilk turda atlanamayan hazırlık. Modelde bu bir süre değil, **sabit sayıda
adımdır** ve kurulum adı verilir.

Kurulumun sayılıp sayılmaması bir doğru–yanlış sorusu değildir. Uzun süre çalışacak bir
hizmette kurulum bir kez ödenir ve toplamın yanında önemsizleşir; kısa ömürlü bir işte her
koşumda yeniden ödenir ve doğrudan maliyettir. **İki bildirim de savunulabilir.**
Savunulamaz olan, hangisinin yapıldığını yazmadan sayıyı vermektir.

Ölçümün varsayımları:

- **BS19** — Ölçülen iş bütün satırlarda aynıdır: ortak tanımın sekiz görevi, toplam **80
  adım**, girdi/çıktı ağırlıklı yük. Değişen tek şey **neyin sayıldığının bildirimidir.**
- **BS20** — Kurulum bir süre değil, ilk turda atlanamayan **sabit adım sayısıdır.**
- **BS21** — Kurulum iş parçacığı rejimi için **6**, çoklu süreç rejimi için **25** adım
  olarak **bildirilir**. Bu sayılar ölçülmüş değil, modelin varsayımıdır; ayrı bir yürütme
  bağlamı kurmanın daha çok adım gerektirmesine dayanır ve tabloda böyle okunur.
- **BS22** — Altı bildirimin altısı da aynı koşumdan okunur ve **hiçbiri yanlış değildir.**
  Yanlış olan, hangisinin okunduğunu söylemeden sayıyı yazmaktır.
- **BS23** — Kâhin kurgudur: toplam adım **80**'dir ve hangi rejim seçilirse seçilsin 80
  kalır. Rejim adım sayısını değil, adımların kaç tike dağıldığını değiştirir.
- **BS24** — Hiçbir satırda süre ölçülmez. Kurulum dahil ölçüm de bir süre ölçümü değil,
  adım sayımıdır; dersin iddiası zaman üzerine değil, **sayma sınırı** üzerinedir.

## Ölçüm

```python
"""Olcum disiplini: ayni kosum, ayri bildirimler; hangi sayi karsilastirilabilir."""

TOHUM = 20260817
ISLEMCI, GC = "islemci", "g_c"


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def gorevler(sayi=8, adim=10, gc_payi=7, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append([GC if r(10) < gc_payi else ISLEMCI for _ in range(adim)])
    return liste


def kosum(gorevler, isci, islemci_yuvasi):
    kalan = [list(g) for g in gorevler]
    tik = ortusen = islemci_adim = gc_adim = 0
    while any(kalan):
        etkin = [i for i, g in enumerate(kalan) if g][:isci]
        if not etkin:
            break
        yuva, ilerleyen = islemci_yuvasi, 0
        for i in etkin:
            adim = kalan[i][0]
            if adim == ISLEMCI:
                if yuva <= 0:
                    continue
                yuva -= 1
                islemci_adim += 1
            else:
                gc_adim += 1
            kalan[i].pop(0)
            ilerleyen += 1
        tik += 1
        ortusen += max(0, ilerleyen - 1)
    return tik, ortusen, islemci_adim, gc_adim


G = gorevler(gc_payi=7)
TIK, ORTUSEN, IA, GA = kosum(G, 8, 1)
KURULUM = {"iş parçacığı (tek yuva)": 6, "çoklu süreç (dört yuva)": 25}

print("aynı koşum, altı bildirim")
for ad, sayi in (("kurulum hariç, tik", TIK),
                 ("kurulum dahil, tik", TIK + KURULUM["iş parçacığı (tek yuva)"]),
                 ("kurulum hariç, işlemci adımı", IA),
                 ("kurulum hariç, girdi/çıktı adımı", GA),
                 ("örtüşen adım", ORTUSEN),
                 ("toplam adım", sum(len(g) for g in G))):
    print(f"  {ad:<34s} {sayi:4d}")
k = KURULUM["iş parçacığı (tek yuva)"]
print(f"\nkurulum sayılmadan {TIK} tik, sayılınca {TIK + k} tik; "
      f"fark {k} tik ({k / TIK:.4f})")

IP = kosum(G, 8, 1)[0]
CS = kosum(G, 8, 4)[0]
ki, kc = KURULUM["iş parçacığı (tek yuva)"], KURULUM["çoklu süreç (dört yuva)"]
print(f"\n{'kurulum bildirimi':<28s} {'iş parçacığı':>13s} {'çoklu süreç':>12s} "
      f"{'kazanan':>14s}")
for ad, a, b in (("ikisinde de sayılmıyor", IP, CS),
                 ("ikisinde de sayılıyor", IP + ki, CS + kc),
                 ("yalnız süreçte sayılıyor", IP, CS + kc),
                 ("yalnız iş parçacığında", IP + ki, CS)):
    kazanan = "iş parçacığı" if a < b else ("çoklu süreç" if b < a else "eşit")
    print(f"  {ad:<26s} {a:13d} {b:12d} {kazanan:>14s}")
print(f"\nmodelde bildirilen kurulum: iş parçacığı {ki} adım, çoklu süreç {kc} adım")
```

```
aynı koşum, altı bildirim
  kurulum hariç, tik                   31
  kurulum dahil, tik                   37
  kurulum hariç, işlemci adımı         26
  kurulum hariç, girdi/çıktı adımı     54
  örtüşen adım                         49
  toplam adım                          80

kurulum sayılmadan 31 tik, sayılınca 37 tik; fark 6 tik (0.1935)

kurulum bildirimi             iş parçacığı  çoklu süreç        kazanan
  ikisinde de sayılmıyor                31           10    çoklu süreç
  ikisinde de sayılıyor                 37           35    çoklu süreç
  yalnız süreçte sayılıyor              31           35   iş parçacığı
  yalnız iş parçacığında                37           10    çoklu süreç

modelde bildirilen kurulum: iş parçacığı 6 adım, çoklu süreç 25 adım
```

## Bir Koşum, Altı Sayı

Üst tablonun altı satırı **tek bir koşumdan** okunuyor. Görevler bir kez üretildi, çizelge
bir kez işletildi; değişen tek şey sonuca hangi soruyla bakıldığı. Çıkan sayılar **26, 31,
37, 49, 54, 80**.

Altısı da doğru. "Bu iş 26 birim sürdü" diyen de, "80 birim sürdü" diyen de aynı koşumdan
söz ediyor. Aralarındaki oran üç katından fazla, ve bu farkın tamamı ölçümden değil
**bildirimden** geliyor.

Buradan dersin kuralı çıkıyor: **çıplak bir sayı bir ölçüm değildir.** Ölçüm, sayı ile
sayının neyi saydığını söyleyen bildirimin toplamıdır. Bildirim eksikse elde kalan şey
karşılaştırmaya sokulamaz — çünkü karşı tarafın hangi satırdan okuduğu bilinmez.

## Üçüncü İddia: 31'e Karşı 37

Orta satır kursun üçüncü iddiasını tek başına taşıyor. Aynı görev kümesi, aynı rejim, aynı
çizelgeleyici: kurulum sayılmadığında **31 tik**, sayıldığında **37 tik**. Fark **6 tik**,
oran **%19,35**.

Hiçbir şey değişmedi. Kod aynı, veri aynı, yuva sayısı aynı, işçi sayısı aynı. Değişen tek
şey ölçümün sınırının nereye çekildiği. Yine de iki sayı, aralarında beşte bire yakın fark
olan iki ayrı sayı.

Bu, bir başarım raporunda görülebilecek en sıradan farktır. Bir eniyilemenin %19'luk kazanç
verdiği söylense, ciddiye alınırdı. Oysa buradaki %19,35'in arkasında hiçbir eniyileme yok
— yalnızca iki farklı sayma sınırı var.

## Sıralamanın Dönmesi

Alt tablo aynı kusurun karşılaştırmaya nasıl sızdığını gösteriyor. İki rejim yan yana:
sekiz işçili tek yuva ile sekiz işçili dört yuva.

İlk iki satır dürüst bildirimlerdir. Kurulum iki tarafta da sayılmazsa **31**'e karşı
**10**; iki tarafta da sayılırsa **37**'ye karşı **35**. İkisinde de kazanan **çoklu
süreç**. Kurulumun sayılması aradaki farkı 21 tikten 2 tike indiriyor — bildirim sonucu
değiştirmiyor, ama **farkın büyüklüğünü** değiştiriyor.

Üçüncü satır dürüst değil, ve tabloda kazananın değiştiği tek satır o. Kurulum yalnız çoklu
süreçte sayıldığında **31**'e karşı **35** çıkıyor ve **iş parçacığı** kazanıyor. Gerçekte
kaybeden rejim, ölçümün sınırı bir tarafta genişletildiği için kazanmış görünüyor.

Böyle bir tablo hiçbir satırında yalan söylemez: 31 doğrudur, 35 doğrudur. Yanlış olan
ikisinin **yan yana konmasıdır**. İki sayı ancak aynı sınırla üretilmişse karşılaştırılır.

Dördüncü satır tersini deniyor ve sıralama dönmüyor: kurulum yalnız iş parçacığında
sayılsa bile çoklu süreç **10**'la kazanıyor. Yani bildirim kusuru her zaman sonucu
çevirmez — **çevirip çevirmediği ancak doğru bildirimle bilinir.** Kusuru fark etmenin tek
yolu, doğru ölçümü de yapmış olmaktır.

## Kursun Kendi Üzerine

Bu ders kurs boyunca uygulanan bir kararı gerekçelendirmek zorunda: neden hiçbir yerde süre
yazılmadı?

Yanıt üstteki tablonun aynısıdır, bir adım ötesinde. Bir sayının bildirimi eksikse
karşılaştırılamaz; bir sayı ayrıca **yeniden üretilemiyorsa** bildirim de onu kurtarmaz.
Süre, aynı makinede aynı kod için bile iki koşumda iki ayrı değer verir. O değerin hangi
sınırla ölçüldüğünü tam olarak bildirseniz bile, ikinci koşum sayıyı değiştirir.

Adım, tik, çağrı ve nesne bu kusuru taşımaz. Profil çıkarma dersinde aynı koşum üç kez
yinelendi ve çağrı sayısı **322, 322, 322** çıktı. Bellek dersinde altı biçim her koşumda
aynı nesne sayısını verdi. Örtüşen adım kurgudan hesaplanıyor ve kurgu tohumla sabit.

Bu bir üstünlük iddiası değil, bir kapsam kararıdır. Süre ölçümünün yeri vardır ve gerçek
bir sistemde sonunda o da ölçülür; ama **bir kavramı öğretmek için kullanılacak sayının
yeniden üretilebilir olması gerekir.** Bu kurs örtüşen adımı seçti çünkü örtüşme, süre
farkının **nedenidir**; süre ise sonucudur ve nedenden çok daha gürültülüdür.

## Özet

- Karşılaştırmalı ölçüm üç bildirim ister: sayılan **birim**, ölçülen **rejim** ve ölçümün
  **sınırı**. Üçüncüsü en sık atlanandır.
- Tek bir koşum altı ayrı bildirimle **26, 31, 37, 49, 54, 80** verir; altısı da doğrudur ve
  aralarındaki fark ölçümden değil bildirimden gelir.
- Kurulum sayılmadığında **31**, sayıldığında **37** tik çıkar: aynı iş, aynı rejim, **6
  tik** ve **%19,35** fark, sıfır değişiklik karşılığında.
- Kurulum yalnız bir rejimde sayıldığında sıralama dönüyor: **31**'e karşı **35** ile kaybeden
  rejim kazanmış görünüyor. Hiçbir satır yanlış değil; yanlış olan yan yana konmaları.
- Bildirim kusuru sonucu her zaman çevirmez, ama çevirip çevirmediği ancak doğru bildirimle
  bilinir; kusuru görmek için doğru ölçümü de yapmış olmak gerekir.
- Bu kurs süre yerine adım saydı çünkü bir öğretme sayısının yeniden üretilebilir olması
  gerekir; örtüşen adım farkın nedenidir, süre ise gürültülü sonucudur.

## Kurs Kapanışı

Kurs tek bir kurguyu on ders boyunca çevirdi: sekiz görev, görev başına on adım, toplam 80
adım. Hiçbir derste süre yazılmadı; sayılan şey adım, tik, örtüşen adım, çağrı ve nesne oldu.

| ders | ölçülen rejim | tik / örtüşen adım ya da çağrı |
|---|---|---|
| Genel Yorumlayıcı Kilidi | tek akış, tek yuva | 80 tik / 0 örtüşen adım |
| İş Parçacıkları | sekiz işçi, tek yuva | 31 / 49 (girdi/çıktı), 73 / 7 (işlemci) |
| Çoklu Süreç | sekiz işçi, dört ve sekiz yuva | 20 / 60 ve 10 / 70 (işlemci) |
| Eşzamansız Programlama | olay döngüsü, tek akış, üç teslim rejimi | 31 / 49, 36 / 44 ve 80 / 0 |
| Eşzamansız Kütüphane Uyumu | olay döngüsü, engelleyen çağrı ve havuza devir | 43 / 37, 80 / 0 ve devirde 44 ya da 90 tik |
| Yürütücü Havuzları | sekiz genişlik, iki arka uç, üç yük | iş parçacığı 31 / 49, 42 / 38, 73 / 7; süreç 10 / 70 |
| Profil Çıkarma | sekiz işçi, tek yuva, iki yük | 80 ilerlet çağrısı; sıcak yol 136 ve 322 çağrı |
| Bellek Kullanımı | sekiz işçi, tek yuva, altı biçim | 31 / 49; ayakta duran nesne 1–172 |
| Yerel Uzantılar | sekiz işçi, tek yuva, yoğunlaştırılmış sıcak yol | 25 / 19 (işlemci), 31 / 49 ve kazanç 0 (girdi/çıktı) |
| Ölçüm Disiplini | sekiz işçi, tek yuva | 31 tike karşı 37 tik |

Tablonun okunuşu tek cümlede toplanır: **80 adım hiç değişmedi, değişen yalnız o adımların
kaç tike dağıldığı oldu.** Rejim işi azaltmaz, örtüştürür; örtüşme de her adımda mümkün
değildir. Bu yüzden aynı düzenek bir yükte 49 tik kazandırırken öbüründe 7 kazandırır, ve
bu yüzden sıcak yolu alt seviyeye taşımak bir yükte 48 tik, öbüründe **0** verir.

Son ders bunun üzerine bir katman daha koydu: bu sayıların hiçbiri, neyi saydığı
söylenmeden bir başkasının sayısıyla yan yana konamaz. Sınırını yazmayan bir sayı, doğru
olsa bile karşılaştırılamaz — ve bu kural kursun kendi tablolarına da uygulanır; her satır
hangi rejimde, hangi yükte ve hangi birimle ölçüldüğünü kendi adında taşıyor.

Sonraki kurs, Python Projeleri: Paketleme ve Test, aynı disiplini işin başka iki yüzüne
uygular. Bir kütüphanenin hangi ortamda, hangi bağımlılıklarla ve hangi sürüm kuralıyla
kurulduğunu yazmak, bir ölçümün sınırını yazmakla aynı türden bir iştir; bir testin neyi
sınadığını ve kapsam sayısının neyi söylemediğini bilmek de öyle. **Ölçmek bir disiplindir;
paketlemek ve sınamak da öyle.**
