Büyük ve karmaşık bir yazılım ürününü yavaşlatan nedir? [kapalı]


16

Büyük önemsiz bir nedenden dolayı, Delphi 7'yi bu kadar uzun bir süre içinde bir kez daha kurdum. Söylemeliyim ki, tamamen uçuruldum - bir süredir değilim. Bazı şeyleri bu şekilde hatırlamıyorum. Kurulum yaklaşık 30 saniye sürdü. Başlatması 2 saniye sürdü ve hemen kullanılabilirdi. Başladıktan sonra saniye "Çalıştır" düğmesine basabilirim ve bir saniyeden daha kısa bir süre sonra boş program zaten görünür ve çalışıyor. Çok daha hızlı bilgisayarlar için Yaşasın!

Ama böyle uçurmamın nedeni, genellikle Visual Studio 2010'u kullanmam, çünkü bu kadar çabuk hissetmiyorum. Kabul, Delphi 7 Visual Studio 2010 çok daha küçük bir sistemdir, ama var bir görünüm orada gerçekten gerekli şeyleri sahip: bir kontrol paleti, form tasarımcısı, kod tamamlama bir kod editörü. Dilin daha basit olabileceğini ve kod tamamlamanın çok daha az güçlü olabileceğini ve IDE'nin neredeyse genişletilebilir ve özellik bakımından zengin olmayabileceğini fark ettim, ama yine de: Nasıl (yani hangi mekanizma yoluyla) sahip olduğunu anlamıyorum (henüz tetiklememiş olabilirim) birçok ekstra özellik, Visual Studio gibi bir sistemin her zaman karşılaştırmalı olarak halsiz hissetmesine neden olur.

Sistemlerle çalışırken deneyimli insanlara Visual Studio ölçeğini sormak istiyorum: onları yavaşlatan nedir? Kod tabanını insan anlama yetenekleri içinde tutmak için gereken soyutlama katmanları üzerindeki katmanlar mıdır? Üzerinde çalışılması gereken kod miktarı çok mu? Bu, saat döngüleri / bellek kullanım departmanındaki (akıl almaz derecede büyük) masrafta programcı zamandan tasarruf yaklaşımlarına modern eğilim midir?


7
Basit: Kütle arttıkça, ataleti aşmak için daha fazla güç gerekir.
Shog9

Birisi bana bir keresinde yöneticileri söyledi ama ben buna hiç inanmıyorum.
Michael Grassman

1
Bu hala Delphi programlama için öncelikle D7 kullanmak nedeninin büyük bir parçasıdır.
GrandmasterB

En hızlı kod, asla yürütülmeyen koddur.
Henry

4
@romkyns: Modern çağda çok fazla yazılım buldum, genellikle inanılmaz derecede şişmiş, gereksiz yere büyük ve hantal. Yazılımların birçoğu, yirmi yıl önce bile on kez çözülen aynı sorunları, güç ve alanın bir kısmıyla çözüyor. Neden daha önce olmasa bile hala eskisi kadar kötü kalıyor? Verimsizlik ve şişkinlik.
Orbling

Yanıtlar:


20

Mimari Uzay Bilimleri

Visual Studio 2010, Windows Presentation Foundation üzerine kurulmuştur. WPF için Button sınıfına bakın. Temel sınıfın 9. çocuğu. Yaklaşık 5 sayfa özellik, yöntem ve olay içerir. Perde arkasında, güzel bir şekilde yuvarlatılmış köşelerini ve bir fare imleci üzerinde hareket ettiğinde ince animasyon geçişlerini tanımlayan beş sayfa stil tanımı daha var. Bu, temelde bazı metinleri veya resimleri görüntüleyen ve bir fare düğmesinin aşağı indiğini algıladığında bir tıklama olayı üreten bir şey içindir.

Visual Studio gibi bir programı herhangi bir rastgele noktada durdurun. Yığın izine bak. Çağıran yığın içine 20 seviyeleri derin ve oraya beş DLL yüklenmiş olması çok iyi.

Şimdi, bu iki şeyi Delphi ile karşılaştırın. Eminim bir Delphi Düğmesi sadece 20 özellik, yöntem ve olaya sahiptir. Ben Delphi IDE sadece 5-7 seviyeleri derin bir yığın iz vardır bahis. Çünkü bilgisayarlar daha yavaş olduğunda, IDE'nin başlatılması 40 dakika sürmeden Visual Studio 2010'un yükünü kaldıramazsınız :-)

Biri diğerinden daha iyi mi? Bir Delphi programını yüklendiğinde genellikle söyleyebilirim çünkü düz görünüyor, renkler sessiz (belki 8 bit?) Ve ince gölgeleme veya animasyon yok. Bugünlerde kendimi 'ucuz' hissediyorum. Ucuz ama hızlı.

Daha iyi miyiz? Bu filozoflar için bir soru, kodlayıcılar için değil.


4
Bir delphi programı düz görünmüyor. Aksine, bir programcı bir programı düz görünecek şekilde programlar . Delphi ile güzel görünümlü, modern, tam renkli arayüzleri tıpkı C # veya C ++ 'da yapabildiğiniz gibi yapabilirsiniz.
GrandmasterB

2
Bu anlayışlı bir cevaptır; ama tam olduğundan emin değilim. Visual Studio 2008 (2010'un selefi) içinde WPF yok ve hala dünyalar Delphi 7'den daha yavaş. Çağrı yığını derinliği ve yüklenen DLL sayısı hakkında aynı şeyi söyleyebilir misiniz?
Timwi

3
@Timwi Evet, kesinlikle isterim. Demek istediğim, WPF'nin kötülükleri hakkında daha az (aslında WPF'yi seviyorum) ve seçim verildiğinde yazılım soyutlama katmanlarına nasıl katman ekleme eğilimi hakkında daha fazla şeydi. Belki de Visual Studio 2008'in fazla yükü yoktu, ama belirttiğiniz gibi yeterince vardı :-)
Jay Beavers

@BrandmasterB, daha az varsayım ve daha basit kütüphanelerle birlikte geldiğinden Delphi'yi çarpmıyorum. WPF, GPU donanım hızlandırmasının programların daha derin renkler, sık animasyonlar, alfa harmanlama, gölgeler vb. Kullanmasına izin vereceği varsayılmıştır. Delphi, bu varsayımların yapılamadığı bir zamanda tasarlanmıştır. Tüm bunları Delphi'de yeniden uygulayabilir misiniz? Elbette, ancak bir WPF düğmesinin davranışını elde etmek için çok fazla kodlama yapmanız gerekir. Artı tarafta, bir Delphi düğmesi CPU, bellek ve GPU gereksinimleriyle birlikte gelmiyor, WPF düğmesinin de @ OP'nin sorusu vardı.
Jay Beavers

10
Düz ve düz kullanıcı arayüzü konusundaki argümanınız Windows 10'un yeni 'Modern' kullanıcı arayüzü tarafından tamamen geçersiz kılınmıştır. Şimdi, 30 yıl önce yaptığımız gibi düz, kare, düz düğmeler oluşturmak için tüm bu yüklere sahibiz.
16:58

11

Sistemlerle çalışırken deneyimli insanlara Visual Studio ölçeğini sormak istiyorum: onları yavaşlatan nedir? Kod tabanını insan anlama yetenekleri içinde tutmak için gereken soyutlama katmanları üzerindeki katmanlar mıdır? Üzerinde çalışılması gereken kod miktarı çok mu? Bu, saat döngüleri / bellek kullanım departmanındaki (akıl almaz derecede büyük) masrafta programcı zamandan tasarruf yaklaşımlarına modern eğilim midir?

Ben bir dizi tahmin sanırım ama ben oldukça büyük bir kod tabanı üzerinde çalıştım (Visual Studio kadar büyük olup olmadığından emin değilim - milyonlarca kod satırında en büyük faktör olarak düşündüğümü sunmak istiyorum kategorisi ve yaklaşık bin eklenti) ve yaklaşık 10 yıl boyunca ve gözlem fenomenleri ortaya çıkar.

Ayrıca, API'lara veya dil özelliklerine veya bunun gibi bir şeye girmediği için biraz daha az tartışmalıdır. Bunlar "harcamalar" dan ziyade bir tartışma doğurabilecek "maliyetler" ile ilgilidir ve ben "harcamalar" üzerine odaklanmak istiyorum.

Gevşek Koordinasyon ve Miras

Gözlemlediğim şey, gevşek koordinasyon ve uzun bir mirasın çok miktarda birikmiş atığa yol açma eğiliminde olduğudur.

Örneğin, bu kod tabanında, birçoğu gereksiz olan yaklaşık yüz ivme yapısı buldum.

Bir fizik motorunu hızlandırmak için bir KD ağacımız olurdu, diğeri genellikle eskisine paralel olarak çalışan yeni bir fizik motoru için, çeşitli örgü algoritmaları için düzinelerce oktre uygulamamız olurdu, render için başka bir KD ağacı Bunların hepsi, aramaları hızlandırmak için kullanılan büyük, hantal ağaç yapılarıdır. Her biri çok ortalama boyutlu bir giriş için yüzlerce megabayttan gigabayt belleğe kadar sürebilir. Her zaman somutlaştırılmadılar ve her zaman kullanılmadılar, ancak herhangi bir zamanda, 4 veya 5'i aynı anda bellekte olabilir.

Şimdi bunların hepsi, aramaları hızlandırmak için aynı verileri saklıyordu. Tüm alanlarını aynı anda 20 farklı yedek harita / sözlük / B + ağacında saklayan, aynı anahtarlarla aynı şekilde düzenlenmiş ve her zaman araştıran analog eski veritabanı gibi düşünebilirsiniz. Şimdi hafızayı ve işlemeyi 20 kat alıyoruz.

Buna ek olarak, fazlalık nedeniyle, bunlardan herhangi birini bununla birlikte gelen bakım fiyat etiketi ile optimize etmek için çok az zaman var ve yapsak bile, ideal olarak yapacağı etkinin sadece% 5'i olurdu.

Bu fenomene ne sebep olur? Gevşek koordinasyon, gördüğüm bir numaralı nedendi. Birçok ekip üyesi genellikle ekosistemlerinde çalışır, üçüncü taraf veri yapıları geliştirir veya kullanır, ancak diğer ekip üyelerinin kullandıkları aynı yapıları kullanmasa bile, aynı endişelerin tamamen açık kopyaları olsa bile.

Bu fenomenlerin devam etmesine ne sebep olur? Eski ve uyumluluk, gördüğüm bir numaralı nedendi. Bu veri yapılarını uygulama maliyetini zaten ödediğimizden ve büyük miktarda kod bu çözümlere bağlı olduğundan, bunları daha az veri yapısına birleştirmeye çalışmak genellikle çok riskliydi. Bu veri yapılarının birçoğu kavramsal olarak çok fazla yedek olmasına rağmen, arayüz tasarımlarında her zaman aynı olanlara yakın değildi. Bu yüzden onları değiştirmek sadece hafıza ve işlem süresi kullanmalarına izin vermek yerine büyük, riskli bir değişiklik olurdu.

Bellek Verimliliği

Genellikle bellek kullanımı ve hızı, en azından yığın düzeyinde ilişkilendirilme eğilimindedir. Yavaş yazılımları genellikle belleği nasıl doldurarak tespit edebilirsiniz. Daha fazla belleğin yavaşlamaya yol açtığı her zaman doğru değildir , çünkü önemli olan "sıcak" bellek (her zaman hangi belleğe erişilir - eğer bir program tekne yükü belleği kullanıyorsa, ancak yalnızca 1 megabaytının tamamı kullanılıyorsa zaman, o kadar hızlı bir şekilde değil).

Böylece, bellek kullanımını temel alarak potansiyel domuzları çoğu zaman tespit edebilirsiniz. Bir uygulama başlangıçta yüzlerce megabayt bellek alırsa, muhtemelen çok verimli olmayacaktır. Bugünlerde gigabayt DRAM olduğunda onlarca megabayt küçük görünebilir, ancak en büyük ve en yavaş CPU önbellekleri hala ölçülü megabayt aralığındadır ve en hızlısı hala kilobayt aralığındadır. Sonuç olarak, sadece başlatmak ve hiçbir şey yapmak için 20 megabayt kullanan bir program, özellikle de bu belleğin 20 megabaytının tümüne tekrar tekrar erişilecekse, donanım CPU önbellek açısından oldukça "çok" bellek kullanıyor ve program çalışırken sık sık.

Çözüm

Bana göre çözüm, ürünleri oluşturmak için daha koordineli, daha küçük ekipler aramak, "harcamalarını" takip edebilecek ve aynı ürünleri tekrar tekrar "satın almaktan" kaçınabilecek olanlar.

Maliyet

Daha tartışmalı "maliyet" tarafına daldım, gözlemlediğim bir "harcama" fenomeni ile sadece ufacık bir bit. Bir dil, bir nesne için kaçınılmaz bir fiyat etiketi ile gelirse (çalışma zamanı yansıması sağlayan ve bir dizi nesne için bitişik ayırmayı zorlayamayan gibi), bu fiyat etiketi yalnızca çok ayrıntılı bir öğe bağlamında pahalıdır. tek Pixelveya Boolean.

Yine de, ağır bir yükü işleyen programlar için çok fazla kaynak kodu görüyorum (ör: yüz binlerce ila milyonlarca Pixelveya Booleanörnekle uğraşmak ) bu maliyeti ayrıntılı bir düzeyde ödeyerek.

Nesne yönelimli programlama bunu daha da kötüleştirebilir. Yine de bu, "nesnelerin" kendi başına, hatta hatalı bir şekilde OOP'un maliyeti değildir, basitçe bu maliyetlerin, milyonlarca insan tarafından somutlaştırılacak olan ufacık bir öğenin ayrıntılı bir düzeyinde ödenmesi.

Bu, gözlemlediğim diğer "maliyet" ve "harcama" olayları. Maliyet pennies, ancak toplu alım için bir üretici ile pazarlık yapmak yerine bireysel olarak bir milyon kutu soda satın alırsak pennies toplanır.

Burada bana çözüm "toplu" satın alma. Nesneler, bu maliyetin bir soda kutusunun ana eşdeğeri için milyonlarca kez tek tek ödenmemesi şartıyla, her birine bir miktar fiyat etiketi olan dillerde bile mükemmel para cezası.

Erken Optimizasyon

Knuth'un burada kullandığı ifadeyi hiç sevmedim, çünkü "erken optimizasyon" nadiren gerçek dünya üretim programlarını daha hızlı hale getirir. Bazıları, Knuth'un "yazılım üzerindeki gerçek etkisini bilmek için uygun bilgi / deneyim olmadan optimize etmek" anlamına geldiğinde "erken optimizasyon" olarak yorumlamaktadır. Herhangi bir şey varsa, gerçek erken optimizasyonun pratik etkisi genellikle yazılımı yavaşlatacaktır , çünkü sürdürülebilirlikteki bozulma gerçekten önemli olan kritik yolları optimize etmek için çok az zaman olduğu anlamına gelir .

Bu, gözlemlediğim son fenomen, geliştiricilerin bir daha asla satın alınamayacakları veya daha da kötüsü bir tek soda konservesi satın almak için peni kurtarmak için ulaşan, pennies (veya daha da kötüsü, hayali pennies) derleyicilerini veya donanım mimarisini anlayamamaları) başka bir yere milyarlarca dolar harcanırken.

Zaman sonludur, bu nedenle mutlak bağlamsal bilgiye sahip olmadan mutlakları optimize etmeye çalışmak genellikle bize gerçekten önemli olan yerleri optimize etme fırsatından mahrum kalır ve bu nedenle pratik etki açısından, "erken optimizasyon yazılımı çok daha yavaş hale getirir. "

Sorun, yukarıda nesneler hakkında yazdıklarımı alıp, nesne yönelimli programlamayı veya bu tür çılgınca bir şeyi yasaklayan bir kodlama standardı oluşturmaya çalışan geliştirici türleri olması. Etkili optimizasyon etkili önceliklendirmedir ve bir bakım problemleri denizinde boğuluysak kesinlikle değersizdir.


2
Diğer bir deyişle, teknik borç. Asla ödenmeyen teknik borç.
Robert Harvey

1
Robert haklı. Bir adamdan bir hata, --forceyöneticiler tarafından yıllarca iyi yazılım mühendisliği uygulamalarını, TDD, birim testi ve herhangi bir insan ve akılcı programlama prensibini havaya uçuran "yarına kadar uygulamazsanız kovulacaksınız" diye bağırıyor. , artı iki kez daha yoruldunuz .. hiçbir sebepten ötürü işten çıkarıldığı ve kod tabanını bozduğu için şirketi çıldırmış olan adam ... hiç güncellemediğiniz durdurulan kütüphaneler ... ve işte burada: lezzetli spagetti kod tabanı ve şişirilmiş yazılım. Afiyet olsun
user3834459

2
İlginçtir, özellikle aşırı ayrıntı düzeyinin nasıl kötüye kullanıldığını görün. Geçmişte benzer bir şey yaparken kendimi yakaladım ve sonuç olarak düşük performans aldım. Bu, birkaç gün önceki koleksiyonları ve toplu algoritmaları aşırı ayrıntı düzeyine göre kullanma konusundaki cevabınıza oldukça benzer . Cevabın derinliği için daha fazla takdir edilmediğine inanamıyorum. Yıllar boyunca yaptığım tasarımların birkaçını yeniden düşünmemi sağlıyor. Acaba bu teknikler neden daha yaygın olarak tanıtılmıyor?
Mike

2
@Mike, veri odaklı bir zihniyetin daha fazla tanıtımını yapmaya geldiğimde biraz bozuk bir rekorum. Donanımın her santimini kullanmaya çalıştıkları oyun endüstrisinde popülerdir. Bununla birlikte, kuşkusuz esnekliği azaltmaktadır. Soyut bir piksel sınıfınız varsa, iki veya daha fazla farklı piksel formatını karıştıran tek bir görüntüye sahip olmak gibi çılgın şeyler yapabilirsiniz! Yine de kritik yollarla uğraşırken, muhtemelen hiçbir görüntü bu esneklik seviyesinden faydalanamaz ve performans, görüntü ve piksel içeren herhangi bir şeyle gerçek bir endişe haline gelmeye başlar.

1
Kötü eski günlerde grafik API'lerini atlamak ve kodumun kritik bir parçası için bellekteki piksellere doğrudan erişmek için bazı kodlar uyguladım. Soyutlama ve doğrudan erişimin birçok katmanı arasındaki fark, o günlerde bir bilgisayarda önemli olan 100x gibi bir şeydi. Artık bilgisayarlarınız, gerekiyorsa, herhangi bir miktarda soyutlamayı atlatabileceğiniz kadar hızlı.
Michael Shopsin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.