Ders 10 / 10
Ö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.
İçindekiler
Ö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
"""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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.