TD; DR:
Ne sorduğum konusunda bir karışıklık vardı, işte sorunun arkasındaki itici fikir:
Her zaman soruyu ne olduğu gibi düşünürdüm. Aslen iyi ifade etmemiş olabilirim. Fakat niyet her zaman " modüler, ayrık, gevşek birleştirilmiş, ayrıştırılmış, yeniden yapılandırılmış kod " olmuştur ve " tek parça tek bir yerde her şeyi tek bir yerde, tek bir dosyada, sıkı bir şekilde birleştirilmiş olarak " kodundan daha yavaş bir şekilde kendiliğinden yavaşlatır . Gerisi o zaman ya da şimdi ya da sonra rastlayacağım bunun detayları ve çeşitli tezahürleri. Bazı ölçeklerde kesin olarak daha yavaştır. Birleştirilmemiş disk gibi, parçaları her yerden almanız gerekir. Daha yavaş. Kesinlikle. Ama umursamalı mıyım?
Ve soru bununla ilgili değil ...
mikro optimizasyon, erken optimizasyon vb. hakkında değil. "Bunu veya bu kısmı ölüme göre optimize etmek" ile ilgili değil.
Öyleyse nedir?
Yaklaşık olduğu genel metodoloji ve zamanla ortaya çıkan kodu yazma hakkında teknikleri ve düşünme yolları:
- "Bu kodu sınıfa bağımlılık olarak sok"
- "sınıf başına bir dosya yaz"
- msgstr "görünümünüzü veritabanınızdan, denetleyicinizden, etki alanınızdan ayırın".
- spagetti homojen tek bir kod bloğu yazmayın, birlikte çalışan birçok modüler bileşen yazın
Bu, şu anda - bu on yıl içinde - çoğu çerçevede görülen ve kabul edilen, sözleşmelerde savunulan ve topluluk aracılığıyla kabul edilen kod tarzı ile ilgilidir. Düşüncede 'monolitik bloklardan' 'mikro servislere' doğru bir değişimdir. Ve bununla birlikte makine düzeyinde performans ve ek yük ve ayrıca bazı programcı düzey ek yükler için fiyat geliyor.
Orijinal soru şöyle:
Bilgisayar Bilimleri alanında, programlamaya gelince düşünmede kayda değer bir değişim olduğunu fark ettim. Tavsiyeye oldukça sık rastlanıyorum.
- daha küçük fonksiyon kodunu yazın (bu şekilde daha test edilebilir ve bakımı yapılabilir)
- refactor var olan kodu daha küçük ve daha küçük kod parçalarına dönüştürün, yöntem / fonksiyonlarınızın çoğu sadece birkaç satır uzunluğa ve amaçlarının ne olduğu açıktır (daha büyük bir monolitik bloğa kıyasla daha fazla fonksiyon yaratan)
- Sadece tek bir şey yapan fonksiyonlar yazınız - endişelerin ayrılması vs.
- daha fazla dosya oluşturun (dosya başına bir sınıf, ayrıştırma amacıyla daha fazla sınıf, MVC, etki alanı mimarisi, tasarım kalıpları, OO, vb. gibi daha fazla dosya sistemi çağrısı yaratan katman amaçları için)
Bu, 2500 satırlık yöntemlere, büyük sınıflara ve tanrı nesnelerine her şeyi yapan "eski" veya "eski" veya "spagetti" kodlama uygulamalarına kıyasla bir değişiklik.
Sorum şu:
çağrı makine koduna, 1s ve 0'lara, montaj talimatlarına, HDD plakasına geldiğinde, tamamen yeniden yapılandırılmış küçükten küçüğe fonksiyonlar ve yöntemler içeren mükemmel sınıf-ayrımlı OO kodumun da ortaya çıkmasından kaygılanmalı mıyım? Fazladan ek yük?
ayrıntılar
Sonunda OO kodunun ve yöntem çağrılarının ASM'de nasıl ele alındığını ve DB aramalarının ve derleyici çağrılarının bir HDD tablasındaki hareketli aktüatör koluna nasıl çevrildiğini yakından bilmesek de, bir fikrim var. Her ekstra işlev çağrısının, nesne çağrısının veya "#include" çağrısının (bazı dillerde) ek komutlar oluşturduğunu ve böylece kodun hacmini artırdığını ve gerçek "kullanışlı" kod eklemeden çeşitli "kod kablolaması" ek yükleri eklediğini düşünüyorum. . Ayrıca, gerçekten donanımda çalıştırılmadan önce ASM'de iyi optimizasyonların yapılabileceğini, ancak optimizasyonun yalnızca bu kadar da yapabileceğini hayal ediyorum.
Bu nedenle, benim sorum - ne kadar ek yük (boşlukta ve hızda) iyi ayrılmış kod (yüzlerce dosya, sınıf ve tasarım desenleri, vb. tek bir dosyada her şey ", bu ek yük nedeniyle mi?
Netlik için GÜNCELLEME:
Aynı kodu almanın ve bölmenin, yeniden düzenlemenin, daha fazla fonksiyona ve nesneye, yönteme ve sınıfa ayırmaya başlamanın, daha küçük kod parçaları arasında daha fazla parametre geçirmesine neden olacağını varsayıyorum . Çünkü kesin olarak, yeniden düzenleme kodunun iş parçacığını devam ettirmesi gerekir ve bu parametre geçirmeyi gerektirir. Daha fazla yöntem veya daha fazla sınıf veya daha fazla Fabrika Yöntemi tasarım deseni tasarlar, tek bir yekpare sınıf veya yöntemde olduğundan daha fazla bilgiyi geçmenin daha fazla yükü ile sonuçlanır .
Bir yerde (TBD'den alıntı), tüm kodun% 70'inin ASM'nin MOV komutundan oluştuğu söylendi - gerçek CPU işlemlerini yapmadan değil, uygun değişkenlerle yükleme CPU kayıtları yapıldı. Benim durumumda, çeşitli kod parçaları arasında bağlantı ve parametre iletimi sağlamak için CPU zamanını PUSH / POP komutları ile yüklersiniz. Kodunuzu ne kadar küçük yaparsanız, daha fazla ek "bağlantı" gereklidir. Bu bağlantının yazılımın yavaşlamasına ve yavaşlamasına yol açmasından endişe duyuyorum ve bununla ilgili endişelenmem gerekip gerekmediğini ve eğer varsa, ne kadar olsa, gelecek yüzyıl için yazılım geliştiren programcıların şu anki ve gelecekteki programcıları için merak ediyorum. , bu uygulamaları kullanarak oluşturulmuş yazılımlarla yaşamak ve bunları tüketmek zorunda kalacak.
GÜNCELLEME: Birden fazla dosya
Şimdi yavaş yavaş eski kodu değiştiriyor yeni kod yazıyorum. Özellikle, eski sınıflardan birinin (daha önce belirtildiği gibi) ~ 3000 satırlık bir dosya olduğunu not ettim. Şimdi bazı dosyaları bir araya getirmek için kullanıyorum, test dosyaları dahil ve PHP çerçevesi dahil değil, çeşitli dizinlerde bulunan 15-20 dosyadan oluşan bir set haline geliyor. Daha fazla dosya da geliyor. Disk G / Ç'ye geldiğinde, birden fazla dosya yüklemek, büyük bir dosyayı yüklemekten daha yavaştır. Tabii ki tüm dosyalar yüklenmiyor, gerektiğinde yükleniyor ve disk önbellekleme ve bellek önbellekleme seçenekleri mevcut ve yine de bunun bellekten loading multiple files
daha fazla işlem gerektirdiğine inanıyorum loading a single file
. Bunu endişeme ekliyorum.
GÜNCELLEME: Bağımlılık Her şeyi enjekte
Bir süre sonra buna geri döneceğim. Sanırım sorum yanlış anlaşıldı. Ya da belki bazı cevapları yanlış anlamayı seçtim. Bazı cevaplar öne sürüldüğü için mikro-optimizasyondan bahsetmiyorum, (en azından mikro optimizasyon hakkında konuştuğum şeyi aramak bir yanlış isimdir diye düşünüyorum) değil, bir bütün olarak "Refactor code" u sıkı bağlantıyı gevşetmek için , kodun her seviyesinde. Zend Con'dan kısa bir süre önce, bu kod tarzının konvansiyonun temel noktalarından ve merkezlerinden biri olduğu yerlerde geldim. Mantıktan görünümden ayır, modelden görünüm, veritabanından model ve yapabilirseniz, veritabanından verileri ayır. Bağımlılık-Enjekte Her şeyi, bazen sadece hiçbir şey yapmadan kablolama kodu (fonksiyonlar, sınıflar, boylerler) eklemek anlamına gelir, ancak çoğu durumda kod boyutunu iki katına çıkararak bir dikiş / kanca noktası görevi görür.
GÜNCELLEME 2: "Kodu daha fazla dosyaya ayırma" performansı (tüm bilgisayar düzeylerinde) önemli ölçüde etkiler
compartmentalize your code into multiple files
Günümüz bilgisayarını etkileme felsefesi (performans, disk kullanımı, bellek yönetimi, CPU işleme görevleri) nasıl etkiliyor?
hakkında konuşuyorum
Önce...
Varsayımsal olarak henüz oldukça gerçek o kadar uzak geçmişte, kolayca modelini ve görünümü ve denetleyici spagetti ya sahiptir yapan bir dosyanın bir mono-blok yazabilirsiniz değil-spagetti kodlu, ama bu ishal her şey zaten yüklendikten sonra. Geçmişte bazı kriterleri C kodunu kullanarak yapıyorum Tek bir 900Mb dosyayı belleğe yüklemek ve onu büyük parçalarda işlemek çok daha küçük dosyaları yüklemek ve onları daha küçük bir barış-yemeğinde işlemekten çok daha hızlı olduğunu öğrendim. sonunda aynı işi yapan topaklar.
.. Ve şimdi*
Bugün kendimi bir defter gösteren, .. .. bir öğe bir "sipariş" ise, sıralı HTML bloğunu gösteren .. gibi özelliklere sahip bir kod arıyorum. Bir satır öğesi kopyalanabiliyorsa, bir simge görüntüleyen HTML bloğunu ve arkasındaki HTML parametrelerini kopyalayarak yazdırmanızı sağlar. Öğe yukarı veya aşağı taşınabilirse, uygun HTML oklarını görüntüleyin. Vc Yapabilirsiniz, Zend Framework aracılığıyla oluşturmakpartial()
aramalar, esasen "parametrelerinizi alan ve onları da çağırdığı ayrı bir HTML dosyasına ekleyen bir işlev çağırın" anlamına gelir. Ne kadar ayrıntılı olmak istediğime bağlı olarak, defterin en küçük kısımları için ayrı HTML işlevleri oluşturabilirim. Biri yukarı ok, aşağı ok, diğeri "bu öğeyi kopyalayabilir miyim" vb. Web sayfasının küçük bir bölümünü görüntülemek için kolayca birkaç dosya oluşturabilirsiniz. Kodumu ve perde arkası Zend Framework kodunu alan sistem / yığın muhtemelen 20-30 farklı dosyaya yakın.
Ne?
Kodları daha küçük birçok ayrı dosyaya bölmek suretiyle oluşturulan makinenin aşınması ve yıpranması ile ilgileniyorum .
Örneğin, daha fazla dosya yüklemek, onları dosya sisteminin çeşitli yerlerinde ve çeşitli fiziksel HDD'lerde konumlandırmak anlamına gelir; bu, daha fazla HDD'nin daha fazla arama ve okuma süresi anlamına gelir.
CPU için muhtemelen daha fazla bağlam anahtarlama ve çeşitli kayıtları yükleme anlamına gelir.
Bu alt blokta (güncelleme # 2), tek bir dosyada yapılabilecek aynı işleri yapmak için birden fazla dosyayı kullanmanın sistem performansını nasıl etkilediğine daha fazla ilgi duyuyorum.
Zend Form API vs basit HTML kullanımı
Zend Form API’yı en son ve en büyük modern OO uygulamalarıyla kullandım, onaylı bir HTML formu oluşturup POST
etki alanı nesnelerine dönüştürme yaptım .
Bunu yapmak için bana 35 dosya aldı.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
Hepsi birkaç basit HTML + PHP + JS + CSS dosyasıyla, belki de toplam 4 hafif dosyayla değiştirilebilir.
Daha iyi mi? Değer mi? ... 35 dosya + çok sayıda Zend Zramework kütüphane dosyasını, çalışmasını sağlayan 4 basit dosyaya yüklediğinizi hayal edin.