---
title: 'Başarım Beklentileri'
source: 'https://academia.sh/tr/kurslar/capraz-platform-yaklasimlari/basarim-beklentileri'
course: 'Çapraz Platform Yaklaşımları'
language: tr
updated: '2026-10-21T05:02:50+00:00'
license: 'CC BY-SA 4.0'
objectives:
    - 'Başarım için sıcak yolu yerel kodla yazmanın paylaşımı ikize çevirdiğini ölçer'
    - 'Köprü geçişini liste başına ve toplu çağrıyla iş birimi olarak sayar'
    - 'Paylaşımı veren şeyin hızlı yolun iki platformda ayrı yazılıp yazılmadığı olduğunu açıklar'
    - 'Aynı hesabı ortak kodda yazmanın paylaşımı ortağa çıkarırken köprü geçişini artırdığını ölçer'
---

# Başarım Beklentileri

Sık çalışan bir yolu ortak koddan çıkarıp yerel kodla yazmak başarım için yapılır. Ders, küçük resim çözmeyi her platformda ayrı yazılan ikiz olarak sınıflar ve köprü geçişlerini iş birimi olarak sayar.

Önceki ders ortak kodun platform yeteneğine tek başına ulaşamadığını ve bunun için ayrı bir yerel modül gerektiğini gösterdi. Yerel kodun bir nedeni daha vardır, ve bu kez ortak kod yeteneğe ulaşabilir ama bunu yeterince hızlı yapamaz. Kursun sorusu aynı kalır: **bu özelliğin kodu platformlar arasında nasıl paylaşılıyor?** Dört yanıtın tanımı açılış dersindeki gibidir ve burada yeniden yazılmaz.

Kuralı çekirdek verir ve her derste aynı dosyayla gelir.

```javascript
// sharing.mjs — bir ozelligin kodunun platformlar arasinda nasil paylasildigini siniflandirir
export const PLATFORMS = ["ios", "android"];

export class Sharing {
  constructor(label, impl, samples) {
    this.label = label;
    this.total = samples.length;
    this.missing = PLATFORMS.filter((p) => typeof impl[p] !== "function");
    const present = PLATFORMS.filter((p) => !this.missing.includes(p));
    this.code = new Set(present.map((p) => impl[p])).size;
    if (this.missing.length > 0) {
      this.differ = null;
      this.verdict = "tek";
      return;
    }
    this.differ = samples.filter((s) => {
      const outs = PLATFORMS.map((p) => JSON.stringify(impl[p](s, p)));
      return new Set(outs).size > 1;
    }).length;
    if (this.code > 1) this.verdict = "ikiz";
    else this.verdict = this.differ === 0 ? "ortak" : "dalli";
  }

  line() {
    const detail = this.differ === null
      ? `eksik=${this.missing.join(",")}`
      : `fark=${this.differ}/${this.total}`;
    console.log(`${this.label}: kod=${this.code} | ${detail} -> ${this.verdict}`);
  }
}

export function countSharing(items) {
  for (const name of ["ortak", "dalli", "ikiz", "tek"]) {
    console.log(`${name}: ${items.filter((s) => s.verdict === name).length}`);
  }
}
```

## Sıcak Yol ve Köprü Geçişi

Sıcak yol (hot path), uygulamanın sık sık çalışan ve kullanıcının beklediği an ile doğrudan ilgili kod yoludur. Bir listeyi kaydırırken her satır için çalışan işlem tipik bir sıcak yoldur: bir kare (frame) çizilirken bu işlem yeterince çabuk bitmezse kullanıcı takılma görür. Ekip böyle bir yolu yerel koda taşıyabilir, çünkü yerel kod platformun kendi çözücüsüne doğrudan erişir.

Ortak kod ile yerel kod arasındaki sınıra köprü (bridge) diyoruz. Ortak koddan yerel koda yapılan her çağrı bir köprü geçişidir (bridge crossing). Geçişin kendisinin de bir işi vardır: değerler sınırdan taşınır, çağrı sıraya girer, yanıt geri gelir. Bu işin gerçek büyüklüğü çerçeveye ve platforma göre değişir; ders bunu ölçmez ve bir sayı yazmaz. Başarım bu derste iş birimiyle ölçülür: bir ekranda kaç köprü geçişi yapıldığı.

Bu yüzden iki soru ayrı tutulmalıdır. Birincisi başarımdır: hızlı yol için kaç geçiş gerekiyor? İkincisi paylaşımdır: hızlı yol iki platformda ayrı mı yazılmış? Kursun ölçüsü ikincisidir. Birincisi paylaşımı etkileyen bir gerekçedir ama paylaşımı veren değildir.

Köprü geçişlerini saymak için küçük bir yardımcı dosya kullanacağız. `Sharing` çekirdeğine dokunmaz; yalnız ortak koddan çağrılan her işlevin kaç kez çağrıldığını tutar.

```javascript
// bridge.mjs — ortak koddan platforma yapilan her gecisi sayar
export function createBridge() {
  let crossings = 0;
  return {
    cross(fn, ...args) {
      crossings += 1;
      return fn(...args);
    },
    count() {
      return crossings;
    },
  };
}
```

**PG1.** Model, bu paylaşımın kuralını kurar; model çerçevenin kendisi değildir. Modelde bir köprü geçişi, `cross` çağrısının bir kez yapılmasıdır; sınırın gerçek maliyeti modellenmez. Gerçek bir uygulamada küçük resim çözme her platformda kendi çözücüsünü çağırır ve parçalar şuna benzer.

```swift
// Platform kodu: IosThumbnailDecoder
import ImageIO

func decodeThumbnail(data: Data, maxSize: Int) -> CGImage? {
    guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return nil }
    let options: [CFString: Any] = [
        kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceThumbnailMaxPixelSize: maxSize
    ]
    return CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary)
}
```

```kotlin
// Platform kodu: AndroidThumbnailDecoder
fun decodeThumbnail(data: ByteArray, maxSize: Int): Bitmap? {
    val bounds = BitmapFactory.Options().apply { inJustDecodeBounds = true }
    BitmapFactory.decodeByteArray(data, 0, data.size, bounds)
    val options = BitmapFactory.Options().apply {
        inSampleSize = maxOf(1, maxOf(bounds.outWidth, bounds.outHeight) / maxSize)
    }
    return BitmapFactory.decodeByteArray(data, 0, data.size, options)
}
```

İki parça aynı işi yapar ama platformun kendi görüntü çözücüsünü kullanır ve ortak satır içermez. Parçalar çıktı vermez; ölçülen modeldeki iki işlevdir.

## Liste Öğesi Başına Bir Geçiş

Altı öğeli bir liste olsun. Her öğe üç boyuttan birinde bir küçük resim ister. Küçük resim çözme her platformda ayrı yazılmış: biri iOS tarafının, öbürü Android tarafının işlevi. Ortak kod listeyi dolaşır ve her öğe için yerel işlevi ayrı ayrı çağırır.

```javascript
// main.mjs — kucuk resim cozme her platformda ayri, liste ogesi basina bir gecis
import { Sharing } from "./sharing.mjs";
import { createBridge } from "./bridge.mjs";

const sizes = ["kucuk", "orta", "buyuk"];
const list = ["kucuk", "kucuk", "orta", "kucuk", "buyuk", "kucuk"];

function iosDecodeThumbnail(size) {
  return `ios-cozuldu-${size}`;
}

function androidDecodeThumbnail(size) {
  return `android-cozuldu-${size}`;
}

const decodeThumbnail = { ios: iosDecodeThumbnail, android: androidDecodeThumbnail };
const bridge = createBridge();

for (const size of list) bridge.cross(decodeThumbnail.ios, size);

new Sharing("kucuk-resim-cozme", decodeThumbnail, sizes).line();
console.log(`kopru-gecisi: ${bridge.count()}`);
```

```text
kucuk-resim-cozme: kod=2 | fark=3/3 -> ikiz
kopru-gecisi: 6
```

Kod iki, ve üç boyutun üçünde iki platformun çıktısı ayrılıyor: ikiz. Altı öğe için altı köprü geçişi yapıldı. Sayım tek bir platformun yolunu izler, çünkü uygulama aynı anda yalnız bir platformda çalışır.

Bu sonuç iki şey söyler. Birincisi paylaşımdır: hızlı yol iki platformda ayrı yazıldığı için özellik ikizdir. İkincisi iş birimidir: liste uzadıkça geçiş sayısı onunla birlikte artar. İkisi bağımsızdır.

## Toplu Çağrı

Geçişleri azaltmanın bilinen yolu çağrıyı toplamaktır: ortak kod altı küçük resmi tek bir istekte yerel koda verir, yerel kod hepsini çözüp tek bir yanıtla döner. Yerel işlevler aynıdır, yalnız çağrı biçimi değişir.

```javascript
// main.mjs — ayni yerel islevler, listenin tamami tek gecista
import { Sharing } from "./sharing.mjs";
import { createBridge } from "./bridge.mjs";

const sizes = ["kucuk", "orta", "buyuk"];
const list = ["kucuk", "kucuk", "orta", "kucuk", "buyuk", "kucuk"];

function iosDecodeThumbnail(size) {
  return `ios-cozuldu-${size}`;
}

function androidDecodeThumbnail(size) {
  return `android-cozuldu-${size}`;
}

const decodeThumbnail = { ios: iosDecodeThumbnail, android: androidDecodeThumbnail };
const bridge = createBridge();

bridge.cross((batch) => batch.map(decodeThumbnail.ios), list);

new Sharing("kucuk-resim-cozme-toplu", decodeThumbnail, sizes).line();
console.log(`kopru-gecisi: ${bridge.count()}`);
```

```text
kucuk-resim-cozme-toplu: kod=2 | fark=3/3 -> ikiz
kopru-gecisi: 1
```

Paylaşım aynı kaldı: kod iki, üçte üç fark, ikiz. Geçiş altıdan bire indi. İki ölçüm aynı kuralı, aynı işlevlerle sınadı ve yalnız iş birimi değişti. Bu, derse ayrım cümlesini kurma olanağı verir.

Bu soru, M31/K06'da sorduğumuz soruya benzer ama aynı değildir. Orada bir iş birimi ölçülüyordu: bir ölçümün bütçesini kaç örnekte aştığı. Burada da bir iş birimi, köprü geçişi, sayılır. Ama paylaşımı sayı vermez; paylaşımı, hızlı yolun iki platformda ayrı yazılıp yazılmadığı verir. İş birimi bir gerekçedir ve bir bedeli gösterir, yanıtı vermez.

**PG2.** Model, yerel kodun başarım gerekçesini ölçmez. Yerel yolun ortak yoldan gerçekten hızlı olup olmadığı, bu derste ölçülmediği için söylenmez; yalnız yerel yolun köprüde kaç geçiş yaptığı sayılır. Bir ekibin hızlı yolu yerel kodla yazma kararı, ekibin kendi ölçümüne dayanmalıdır.

Kural bu derste de iki şeyi görmez. Büyüklüğü görmez: üç satırlık bir çözücü ile üç yüz satırlık bir çözücü aynı sınıfa girer. Bedeli de görmez: iki platformda ayrı yazılmış bir çözücünün iki kez sınanması, iki kez düzeltilmesi ve ikisinin birbirinden ayrılması kuralın dışında kalır. Kural yapıyı görür; bedeli düzyazı söyler.

## Sınırlayıcı Ölçüm

Aynı hesabı bu kez ortak kodda, tek bir işlevle yapalım. Küçük resim çözme ortak kodda yazılsın. Çözülen her küçük resim çizim için platforma geçsin: yani ortak kod altı resmi çözer, altısını da ekrana ayrı ayrı gönderir.

```javascript
// main.mjs — ayni hesap ortak kodda tek islevle
import { Sharing, countSharing } from "./sharing.mjs";
import { createBridge } from "./bridge.mjs";

const sizes = ["kucuk", "orta", "buyuk"];
const list = ["kucuk", "kucuk", "orta", "kucuk", "buyuk", "kucuk"];

function iosDecodeThumbnail(size) {
  return `ios-cozuldu-${size}`;
}

function androidDecodeThumbnail(size) {
  return `android-cozuldu-${size}`;
}

function decodeShared(size) {
  return `cozuldu-${size}`;
}

function drawOnScreen(picture) {
  return picture;
}

const platformBridge = createBridge();
platformBridge.cross((batch) => batch.map(iosDecodeThumbnail), list);
const platformRow = new Sharing(
  "kucuk-resim-cozme-yerel",
  { ios: iosDecodeThumbnail, android: androidDecodeThumbnail },
  sizes,
);

const sharedBridge = createBridge();
for (const size of list) sharedBridge.cross(drawOnScreen, decodeShared(size));
const sharedRow = new Sharing(
  "kucuk-resim-cozme-ortak",
  { ios: decodeShared, android: decodeShared },
  sizes,
);

platformRow.line();
console.log(`kopru-gecisi: ${platformBridge.count()}`);
sharedRow.line();
console.log(`kopru-gecisi: ${sharedBridge.count()}`);
countSharing([platformRow, sharedRow]);
```

```text
kucuk-resim-cozme-yerel: kod=2 | fark=3/3 -> ikiz
kopru-gecisi: 1
kucuk-resim-cozme-ortak: kod=1 | fark=0/3 -> ortak
kopru-gecisi: 6
ortak: 1
dalli: 0
ikiz: 1
tek: 0
```

Aynı hesap bu kez ortak çıktı: kod bir, fark sıfır. Paylaşım ikizden ortağa çıktı. Ama köprü geçişi birden altıya çıktı: ortak kod resmi kendisi çözdüğü için, çözülen her resim çizim için platforma ayrı gidiyor.

Kural burada yapıyı görmüştür ve bedeli görmemiştir. Paylaşımın artması, ekibin daha az şey yazdığını söyler; başarımın bozulduğunu ya da bozulmadığını söylemez. Altı geçişin gerçek bir ekranda neye mal olduğu, bu modelde ölçülmez.

**PG3.** Bu bloktaki geçiş sayıları, modelin kurduğu iki yolu karşılaştırır. Çözülmüş her resmin çizim için ayrı geçmesi bir varsayımdır; gerçek bir çerçeve çizim isteklerini birleştiriyor olabilir. Sayılar yalnız bu modeldeki yolları ayırır, bir çerçeveyi değerlendirmez.

## Özet

- Bu dersin paylaşımı: ikiz. Küçük resim çözme her platformda yerel kodla ayrı yazıldığı için kural iki kod saydı.
- Köprü geçişi iş birimi olarak sayıldı: liste öğesi başına çağrıda altı, toplu çağrıda bir; paylaşım ikiz kaldı.
- Paylaşımı geçiş sayısı değil, hızlı yolun iki platformda ayrı yazılıp yazılmadığı verir; iş birimi gerekçeyi ve bedeli gösterir.
- Aynı hesap ortak kodda tek işlevle yazılınca paylaşım ortağa çıktı, modeldeki köprü geçişi birden altıya çıktı.
- Kural yapıyı görür, bedeli görmez; yerel yolun gerçekten hızlı olup olmadığı bu derste ölçülmedi ve söylenmedi.

## Sonraki Adım

Bu konuda tasarım dili, yerel modül ve başarım, kodun platformlar arasında nasıl bölündüğünü gösterdi. Hepsi uygulamanın çalışma anıyla ilgiliydi. Uygulamanın kullanıcıya ulaşması ise ayrı bir sınırdan geçer. Sıradaki ders, `Mağaza ve Yayın Kısıtları`, uygulama mağazasının yayın kurallarını, mağaza incelemesini ve uygulama içi güncellemeyi çapraz platform kodu açısından ele alır.
