Sona kadar yerel, ta ki metne ihtiyaç duyulana kadar
(justsitandgrin.im)- macOS’ta yalnızca SwiftUI ile Markdown sohbet arayüzü oluşturulduğunda temel performans belli bir seviyeye ulaşıyor, ancak belgenin tamamını seçmeyi desteklemek zorlaşıyor
NSTextViewve TextKit 2’ye geçildiğinde SwiftUI tarafındaki test ve performans çalışmalarının çoğu kaybediliyor ve akış halinde gelen girdide CPU sıçramaları oluşuyorNSCollectionViewile yeniden uygulama yapmak hücre titremesine yol açıyor; saf TextKit 2 de performans olarak fena olmasa da streaming ile entegrasyonu zayıf kalıyor- WebKit, Markdown işleme, performans, tipografi ve kontrol seviyesi açısından genel olarak daha iyi uyum sağlıyor; Electron’da da metin işlemleri varsayılan olarak çalışıyor
- Uzun sohbetler ve zengin metinde SwiftUI ile Apple’ın yerel SDK’ları sınıra dönüşürken, web tabanlı yaklaşım metin ve render modeli açısından avantajlı hale geliyor
Yerel macOS Markdown sohbet arayüzünün sınırları
- Yalnızca SwiftUI ile Markdown destekleyen basit bir sohbet arayüzü oluşturulduğunda temel performans belirli bir düzeyde mümkün olsa da, SwiftUI primitive’leriyle kurulan Markdown belgesinin tamamını seçmek mümkün olmuyor
NSTextView’a geçildiğinde TextKit 2 desteği kazanılıyor, ancak SwiftUI’da yapılmış test ve performans çalışmalarının büyük kısmı kaybediliyor ve SwiftUI ile de iyi uyuşmuyor- Model yanıtları
NSTextViewiçine akışlı biçimde verildiğinde CPU sıçramaları yaşanıyor NSCollectionViewile yeniden uygulansa bile hücreler sürekli titriyor ve bu, tasarım gereği kaçınılması zor bir davranış olarak kalıyor- Saf TextKit 2 prototipi performans açısından kabul edilebilir olsa da streaming hâlâ zayıf ve modern bileşenlerle de iyi uyum sağlamıyor
- SwiftUI tamamen kaldırılıp yalnızca AppKit kullanılsa bile büyüyen metin parçalarını elle yönetmek gerekiyor ve ancak pek çok şey bozulmuş durumdayken metin seçimi mümkün hale geliyor
- Temel macOS davranışına benzer bir seviyeye ulaşmak için kullanıcıların doğal olarak beklediği bağlam menüsü, sözlük arama, seçim, erişilebilirlik ve metin etkileşimi gibi işlevleri yeniden eşleştirmek gerekiyor
WebKit ve Electron’un daha iyi uyduğu noktalar
- Markdown, WebKit ile işlendiğinde dikkat edilmesi gereken bazı noktalar olsa da genel olarak iyi çalışıyor; performans ve tipografi güçlü, kontrol seviyesi de yeterli
- Basit bir Electron projesi oluşturulduğunda metin işlemleri, Markdown render etme ve iyi tipografi varsayılan olarak çalışıyor; ayrıca saf TextKit 2 uygulamasında elde edilmesi daha zor olan performans da sağlanabiliyor
- Electron’da da macOS entegrasyonu sunuluyor; birkaç satır kodla gösterişli Git diff’leri render edilebiliyor ve diffs.com bunun örneklerinden biri
- SwiftUI, AppKit, TextKit ve WebKit’in tümü değerlendirilse bile “Markdown destekleyen ve tüm mesajın seçilebildiği bir sohbet” gibi basit bir gereksinimi gerçekten karşılamak zor görünüyor
- Sohbet, uzun biçimli zengin metin ve esnek tipografinin önemli olduğu yeni uygulamaların neden web tabanlı yöne gittiği daha net hale geliyor
- SwiftUI, kaydırmanın çok yoğun olmadığı basit ekranlar için uygun ve Swift de performansın kritik olduğu bölümlerde hâlâ yararlı
- Electron veya React Native, yerel birlikte çalışabilirlik sayesinde ciddi performans sunarken daha iyi bir metin ve render modeli koruyabiliyor
- Uzun biçimli sohbetler için zengin metin render etmede SwiftUI ve Apple’ın yerel SDK’ları avantaj değil, kısıt haline geliyor
- İlgili tartışmalar: Hacker News, Lobsters
2 yorum
Hacker News görüşleri
Kısa süre önce TextKit 2 kullanan bir iOS metin düzenleyicisi yayınladım ve 5.000 satırlık dosyalarda bile performans çok iyi
Testi Project Gutenberg’den Moby Dick ile yaptım; uygulamayı 2025 Ağustos ile 2026 Nisan arasında geliştirdim ve geliştirme hâlâ sürüyor
Her tuş vuruşunda yeniden stillendirme 8 ms içinde tamamlanıyor; debounce ya da gecikmeli render olmadan hızlı 20 giriş bile, her girişten sonra tüm yeniden stillendirme dahil, 150 ms içinde işleniyor
Etiketler ve boolean arama 20 ms içinde bitiyor; yalnızca görünür alanı render etmek, tüm belgeyi stillendirmekten 25 kat daha hızlı ve 120Hz ekran yenilemeyi de destekliyor
Uygulamanın dosya boyutu 1.0 sürümünde 722 KB’tı; daha fazla özellik içeren 1.1 de yaklaşık 950 KB görünüyor
Bu iOS’ta mümkünse macOS’ta yaklaşık 10 kat daha kolay olması gerekir
https://www.gingerbeardman.com/apps/papertrail/
“İmkânsız” demek istemiyorum; sadece insanların neden böyle şeylerde web teknolojilerini native yerine seçtiğini anlıyorum. İnsan ürün yapmak istiyor, sistemin sınırlarıyla dövüşmek değil
Bir metin görüntüleyicisinin en azından bunun bir iki büyüklük mertebesi üstündeki dosyaları ele alabilmesi gerekir. Yüz binlerce satırlık JSON dosyaları yaygın, CSV ve log dosyaları ise daha da uzun
Eskiden webview yerine native API kullanmanın nedeni performanstı, ama artık her zaman öyle görünmüyor
Tarayıcı render motorları oldukça olgunlaştı, GPU hızlandırma yoğun biçimde kullanılıyor ve 10 yılı aşkın süredir şişkin web uygulamalarıyla stres testinden geçti
Buna karşılık SwiftUI pek de hızlı hissettirmiyor. Apple’ın yakın zamanda baştan yaptığı Sistem Ayarları bile arayüzü checkbox satırları etrafında sadeleştirmişken, bölümler arası geçişler bazen us-east-1’den web sayfası yüklüyormuş gibi daha takılarak oluyor
Qt C++ ve QML ile native uygulamalar yaptım ve benzer web uygulamalarından çok daha hızlı olup çok daha az RAM kullandıklarını gösterdim
O yüzden genel olarak web uygulamaları, iyi tasarlanmış native uygulamalardan daha yavaş ve daha kaynak tüketen yapılar
[1] https://notes.alinpanaitiu.com/SwiftUI%20is%20convenient,%20...
[2] https://x.com/daniel_nguyenx/status/1734495508746702936
[3] https://rubymamistvalove.com/block-editor#8-performance
Eskiden web geliştiricisiydim ama son 6-12 aydır native çapraz platform uygulamalar yapmaya başladım; basit işlerde bile performans farkı oldukça büyük
Binlerce insan-yıllık optimizasyonu ve gerçek dünyada yüz milyonlarca insan-yıllık doğrulamayı çöpe atıp, daha kötü bir metin render motorunu yeniden yazalım diye düşünmek garip
macOS’ta WebKit native bir OS framework’ü. Markdown render etmek için WebKit kullanmak tamamen makul görünüyor
Elbette her şeyi WebKit ile render etmek, her şeyi PDFKit ile render etmek kadar anlamsız olurdu. Ama bir Markdown görünümü için WebKit mantıklı bir tercih; bu da hemen gidip Chromium tabanlı bir web uygulamasına geçmek gerektiği anlamına gelmiyor
Ayrıca OS X uzun süre UI’yi DisplayPDF/Quartz ile render ediyordu
WebKit başka platformlarda da var diye hile mi sayılıyor? O zaman Java da kullanılabilir
Metni HTML/CSS/JS render edicisiyle çizmek “tamamen uygun”sa, uygun olmayan alan ne? Neden her şeyi onunla render etmiyoruz?
“Metin render etmek uygun ama her şeyi render etmek saçma” sonucuna giden mantığı anlamıyorum
WebKit’in macOS’ta native bir OS framework’ü olduğuna katılıyorum; o anlamda bu da “native”
Ama bu aynı zamanda daha büyük noktayı da destekliyor: zengin metin, Markdown, seçim, tipografi ve uzun biçimli formatlı içeriği düzgün ele almak için web teknolojileri hızla tek pratik seçenek hâline geliyor
Markdown görünümü için WebKit kullanmak yanlış değil; hatta muhtemelen en mantıklı seçim. Sorun, buradaki “native” çözümün fiilen bir web render çözümü olması
Her
WKWebView, kendi performans ve bellek ek yüküyle gelen bir WebKit motoru taşır; bu yüzden etrafa serpiştirilip bedava native macOS bileşeni gibi görülemezSwiftUI / AppKit / TextKit’in bu tür arayüzlerde “git WebKit kullan”dan daha temiz, modern ve birleştirilebilir bir yol sunmaması can sıkıcı
“Markdown içeren bir sohbette tüm mesajın seçilebilmesi” gibi temel bir şeyin yapılamaması mantıksız geliyor
SwiftUI’da olgun Markdown render ediciler kullanılabiliyor. https://github.com/gonzalezreal/swift-markdown-ui ve onun yeni nesil alternatifi https://github.com/gonzalezreal/textual buna örnek
Bizzat kullandım ve sorun yaşamadım. Swift ya da SwiftUI seven biri değilim, hatta Objective-C tercih eden biraz aptal biriyim; yine de bunu LLM yardımı olmadan yaptım
Statik, tamamlanmış Markdown kaydırması yeni odak probe’unu geçemedi; p95 18.86 ms ile 16.7 ms bütçesini aştı ve maksimum 232.49 ms gördü
Uzun canlı Markdown/kod güncelleme yolu da başarısız oldu; p95 59.33 ms’ye karşı 16.7 ms, maksimum 75.94 ms. Bu, güncelleme sırasında büyük zengin metin yüzeylerini ele alan ayrı ama ilişkili bir stres senaryosu
Uzun geçmiş genişletme teknik olarak geçiyor ama akıcı kareler sayılmaz: 120 turda p95 21.35 ms, 500 turda 23.11 ms, 1000 turda 36.77 ms
Kötü değil ama benim çözümümden biraz daha yavaş ve görünen performans farkı büyük ölçüde Textual implementasyonundan çok SwiftUI ile ilgili
Geçmişte uygulamamda swift-markdown-ui kullandım ama performansı wkwebview’in yanına bile yaklaşamadı. Büyük tablolar, kod blokları ve iç içe alıntılar gibi zorlu öğeler içeren büyük belgeleri stream edince beachball bile görebiliyordum; wkwebview kullanırken bunlar hiç olmadı
Sonra tarayıcıların ve onların temel teknolojilerinin arayüze yeni bir paradigma getirdiğini, native UI framework’lerinin de buna yetişemediğini fark ettim
Web tabanlı uygulamalara kıyasla native uygulamaları tercih eden biri olarak bile böyle hissediyorum
Ya kodu gösterin ya da çıkın. Şu anda bile Markdown render etme ve stream edilen metni düzgün işleme konusunda çok sayıda native Mac/iOS uygulaması var
Burada tam olarak neyin mazeret gösterildiğini merak ediyorum
Çoğu uygulama, art arda gelen blokların her biri içinde seçim desteği verip tüm mesaj için ayrıca kopyalama düğmesi koyma yönünde karar kıldı
İşin ilginç yanı, Apple’ın da geçmişte bunu yapmış olması
Eski macOS / AppKit, native NSTextField içindeki zengin metni render etmek için WebKit kullanıyordu. Metin zor bir problem
Ayrıca native WebView çok hızlı ve hafif; onu metin yerleşim motoru olarak kullanmak da garip değil. Bir tablodaki her satır için ayrı bir WebView kullansanız bile performans harika olabilir
Mac için iMessage da WebView kullanıyordu, Adium da öyleydi. Zengin/işaretleme tabanlı metin render ediyorsanız HTML tamamen doğru araç
Mac hiçbir zaman NSTextField render etmek için WebKit kullanmadı. iOS ilk yapıldığında, UIKit kontrolleri de dahil olmak üzere genel olarak metin render edici olarak WebKit kullanıyordu ve buna “sweet solution” deniyordu
Ama bunun fazla ağır ve zahmetli olduğu ortaya çıkınca yerini Core Text/AppKit tarzı metin render yaklaşımı aldı
Karmaşık native metin render etmenin zor olduğunu keşfediyor, sonra düşük seviyeli yöntemle metin render edip native etkileşimleri yeniden uygulamak zorunda kaldığından şikâyet ediyor
WebKit’i deneyince çok iyi çalışıyor, ama sonra onu bırakıp yine native etkileşimleri yeniden kurmak zorunda olduğu bir duruma dönüyor
Ben olsam WebKit’in iyi çalıştığı noktada dururdum
2015’te junior mühendisken, bir iOS uygulamasında paragraf içindeki tıklanabilir bağlantıları render etmem istenmişti diye hatırlıyorum
Swift’in yeni çıktığı dönemdi; tamamen ObjC/UIKit yığını kullanılıyordu ve tam bir kâbustu. Zor bela çalıştırabilmiştim
2016 civarı sonrasında iOS’a neredeyse hiç dokunmadım; yeni SwiftUI’da bunun artık doğal olarak yerleşik geldiğini varsaymıştım ama öyle değilse bu oldukça çılgınca
https://developer.apple.com/documentation/swiftui/link
Bundan daha kolay nasıl yapılabilir bilmiyorum
“Basit ekranların dışına çıkınca native’in hâlâ bu kadar olgunlaşmamış olması” aslında beklenen bir şey
İnsanlar yeterli emeği vermezse onun olgunlaşmasını bekleyemezsiniz
Daha fazla çaba web teknolojilerine aktığı için insanlar da oraya kilitleniyor. Native’e bakıp “yeterince gelişmemiş” diyorlar, sonra gidip daha fazla web geliştirme yapıyorlar; döngü böyle sürüyor
Tarayıcıda zaten “çalışıyor” diye native’i iyileştirmeye ciddi emek harcamak isteyen neredeyse kimse kalmadı
Web tarafının daha olgun olmasının nedenlerinden biri de büyük ticari OS üreticilerinin zamanın gerisinde kalmayı seçmiş olması. Windows UI toolkit’leri gerçekten berbat
Ben de AI sohbet uygulamamda neredeyse aynı deneyimi yaşadım. Hiçbir şey doğru düzgün çalışmıyor
Markdown render etme yavaş ve takılıyor, stream etme yavaş ve takılıyor, her şey UI’yi donduruyor
GitHub’daki popüler UIKit ve SwiftUI metin editörü bileşenlerinden en az 5 tanesini denedim; hepsi bir şekilde bozuktu ya da bug’lıydı ve yavaştı. İnanılmaz
Bu zor bir problem. Qt C++ ve QML ile sıfırdan bir blok editörü yaparken bunu nasıl çözdüğümü uzun uzun yazdım
Kesintili bloklar arasında seçim, imlecin altındaki kaynak Markdown’ı gösterme ve farklı delegate boyutları gibi benzer sorunlar yaşadım
O süreçte öğrendiklerime dayanarak stream eden Markdown ayrıştırıcısına sahip native bir LLM istemcisi geliştiriyorum
[1] https://rubymamistvalove.com/block-editor
[2] https://www.get-vox.com
Lobste.rs yorumları
Electron aslında WebView'i saran bir wrapper; ancak tüm Chromium motorunu da beraberinde getirdiği için, kullanım kolaylığının bedeli olarak uygulama boyutu fazla şişiyor
2001~2002'de iChat'in ikonik konuşma balonu metin yerleşimini NSTextView ve türlü hilelerle hayata geçirmiştim; AppKit metin tasarımcısı Hideki Itamura'nın yardımıyla bile epey uğraştırmıştı. Şimdi ise HTML+CSS ile oldukça basit hale geldi
Tauri kullanan bir uygulamada yer almıştım; bunu Electron'da Chromium kullanacak şekilde değiştirince çok daha iyi çalıştı. Özellikle win7'den win11'e kadar çok geniş bir aralığı hedeflemesi de önemliydi
Tauri tarafı sistem webview'ini kullanmasıyla cazip görünüyor, ama Windows'ta Chrome ya da Edge, macOS'ta Safari, diğer ortamlarda ise biraz şansa kalıyor. Sonuçta öngörülebilirlik ve olgunluk kazandı; nedeni tam bilinmese de performans da daha iyiydi
Sonuçta amaç
htopgrafiğini tatmin etmekten çok daha iyi yazılım istemekBlog yazısının özü “herkes Electron seçmeli” değil; kaynak ve parası olan şirketlerin neden hâlâ Electron ya da web teknolojilerini seçtiğini artık anladığı. En azından bana göre, doğru yerlerde taviz vererek iyi bir kullanıcı deneyimi sunuyor
Apple'ın TextKit 2'sini ya da diğer native metin framework'lerini savunan çok kişi var, ama yalnızca Apple SDK'larıyla yapılmış popüler ve yüksek performanslı bir metin editörü neredeyse yok. Xcode bunu oldukça iyi yapıyor ve muhtemelen gerçek dünyadaki tek örneğe en yakın olanı. Zed, Sublime Text, Visual Studio Code ve JetBrains IDE'lerinin hepsi bir nedenle kendi metin render etme çözümlerini kullanıyor
Bu yüzden en kötü yöntemle inşa edilse bile kendi ortamlarında sorun yokmuş gibi görünebilir
Buna karşılık çok daha düşük özellikli cihazlar kullanan geri kalan herkes şişkin ve yavaş yazılımları taşımaya devam ediyor
Yalnız yazar burada oraya kadar keşfe çıkmamış gibi görünüyor
Dışarıdan bakınca Flutter, “Chromium'dan renderer olarak sadece Skia'yı bırakıp GUI uygulamalarında kullansak ne olur?” sorusuna verilmiş bir yanıt gibi görünüyor. Electron'dan daha hafif ama benzer yeteneklere sahip bir cross-platform araç olması gerekir gibi
contentEditableDIV kullanan bir HTML belgesiyle etkileşime girdiği veWKWebView'in bir alt sınıfını kullandığı yazıyorİronik olan şu ki Apple'ın native metin motoru, HTML DOM ağacından çok daha iyi bir veri modeli kullanıyor; yani string'ler ve run-length encoded stil öznitelikleri
DOM içinde metin düzenlemek neredeyse bir kâbus, çünkü seçim alanı çoğu zaman birden çok katmandaki birden fazla öğenin üzerinden geçiyor ve bu yüzden aşırı karmaşık şekilde bölüp birleştirmek gerekiyor. Eskiden
contenteditabledesteği eklenmiş bir Safari build'ine ilk dokunduğumda tonla bug raporu göndermiştim; bugün bile pek çok web rich text editörü liste öğelerini kesip yapıştırırken bozuluyorSonuçta sanki 90'lar~2000'lerdeki CISC ile RISC meselesine benzer bir durum yaşandı. “Daha aşağı” görülen yapı daha fazla kaynak aldığı için sonunda daha üstün bir uygulama ortaya çıkarmış oldu