Concepts - Optimization Tips
En İyi Zamanı Bilmek
Optimizasyon performansı artırabilir, ancak kodun anlaşılmasını ve bakımını da zorlaştırabilir. Doğruluk ve okunabilirlik genellikle önce gelmelidir.
Optimize etmeden önce şunu sorun:
- Kod tamamlanmış ve düzgün çalışıyor mu?
- Bu kodun bir önemi var mı?
- Profilleme bunu bir engelle mi tanımladı?
- Geliştirme, okunabilirlik kaybını haklı çıkarıyor mu?
- Diğer geliştiricilerin daha sonra bu kodu değiştirmeleri gerekecek mi?
Bir kere çalıştırılan kodda birkaç mikrosaniye tasarruf etmek nadiren işe yarar. Tick, Think, HUDPaint, görüntüleme kancaları veya büyük bir döngü, saniyede birçok kez meydana geldiği için önemli olabilir.
Optimize Etmeden Önce Önlem Alın
Sadece görünüşüne dayanarak kodun yavaş olduğunu düşünmeyin.
SysTime LuaJIT derlemesi, mevcut sunucu yükü ve Lua ile motor arasındaki aramalar sonucu etkileyebileceği için bir benchmark'ı birden fazla kez çalıştırın.
Küçük referans değerleri yararlıdır, ancak iyileştirmeler nihayetinde kodun kullanıldığı gerçek sistemde ölçülmelidir.
En Önemli İpuçları
Yerel Değişkenleri Kullanın
Lua değişkenleri küreseldir. local Lokal değişkenler mevcut kapsam veya işlevle sınırlıdır. Lua VM'nin erişimi için daha ucuz olmakla birlikte eklentiler arasındaki tesadüfi çatışmaları önlüyorlar.
Yerel değerler function registers'da depolanır veya yükseltme değeri olarak yakalanırlar. Küresel fonksiyonlar normalde bir tablo araması kullanılarak işlevin ortamından alınır.
Bilgilerin dosyalar arasında gerçekten paylaşılması gerektiğinde tek bir küresel eklenti tablosunu kullanın.
Tekrarlanan İş ve Görevlerden Kaçının
Bir değer değişmezse, bir kez hesaplayın veya oluşturun ve tekrar kullanın.
Genellikle kaçırılan önbellek tablosu
- Renk(lar)
- Vektör(lar)
- Açı(lar)
- Malzeme(lar)
- Varlık(-ler)
- Oyuncu(lar)
- Silah.(lar)
- Pahalı aramaların sonuçları
- Sabit bir tanımlayıcı ile indekslenmiş veriler
Geçici tablolar oluşturmak gibi, Renks, Vektörs veya AçıSıkça uygulanan kodlarda, tahsis ve çöp toplama çalışmalarını artırır. Renk ve Malzemes görüntüleme kancalarının dışında önbelleğe alınmalıdır.
Sonuçları manuel olarak önbelleğe almayın. player. GetAll Garry'nin Modü sadece oyuncular üzerinde tekrarlamak için sağlar. player. Iterator, iç Lua tarafı önbelleği kullanır ve yeni bir döndürülen tablo oluşturmaktan kaçınır.
Değişken Nesneleri Tekrar Kullanın
Vektör aritmetiği operatörü genelde yeni bir vektör gönderir. Vector:Add, Vector:Mul, ve Vector:Set Ek geçici nesnelerden kaçınabilirsiniz.
Arama yerine arama tablolarını kullanın
Daha derinlemesine inceleniyor: Liste Biçimi Tabloları.
Bir değerin bilinen bir anahtarı olduğunda, bu anahtarın altında saklayın.
Bir tablonun arama süresi ortalama olarak yaklaşık sabit bir zamandır. Aray aramak, eşleşme bulunana kadar girişleri kontrol etmeyi gerektirir ve bu nedenle girdiler sayısıyla doğrusal büyür.
Sık Kullanılan İşlevleri Yerelleştirin
Tekrarlanan tablo ve küresel aramalar, sıkça function in olarak adlandırılan bir (a) kaydedilerek kaldırılabilir.
Bu, aynı sabit function is sıcak bir yolun içinde birçok kez çağrıldığında en yararlıdır. Bununla birlikte bir denge vardır; her function makes kodunun okunması zorlaşır ve anlamlı bir iyileştirme sağlamayabilir.
Kısıtlı Döngüleri Azaltın
Döngüler programlama için gereklidir.
Bununla birlikte, n büyüklüğündeki bir koleksiyon üzerindeki iki döngü yaklaşık olarak 2 işlem gerçekleştirir.
Örneğin:
- 3 oyuncunun her oyuncuya karşılaştırılması: 9 kıyaslama
- 20 oyuncunun her oyuncuya karşılaştırılması: 400 kıyaslama
- Her oyuncu ile karşılaştırıldığında 100 oyuncu: 10.000 kıyaslama
Köşeli döngüler her zaman yanlış değildir. Çiftli karşılaştırmalar bazı sistemlerde onları gerektirir. Birini kullanmadan önce, aynı işin şu yollarla yapılıp yapılmadığını kontrol edin:
- Bir arama tablosu
- Tek bir geçiş.
- Önce verileri filtrele.
- Uzaysal bölünme
- Sadece değiştirilmiş nesneleri işleme alıyor.
Örnek:
Ağ Kullanımı Azaltın
Sadece müşterilerin ihtiyaç duyduğu bilgileri ağlayın ve sadece gerektiğinde gönderin.
Tercihim:
- Değişiklikler her tik yerine meydana geldiğinde gönderilir
- Yayınlama yerine ilgili alıcılara gönderme
- Tüm yapılar yerine kompakt tanımlayıcılar göndermek
- Tam fonksiyonları kullanmak gibi net. WriteBool, net. WriteUInt, ya da net. WriteEntity
- Müşterilerin hesaplamak için yeterli bilgiye sahip oldukları değerleri elde etmelerine izin vermek
net. WriteTable Bilinen alanları tam türlerini kullanarak yazmak genellikle daha küçük ve doğrulanması kolaydır. net. WriteTable ve net. WriteUInt.
Performans tek ağ kaygısı değildir. Sunucu tarafında doğrulanmadan bir istemciden alınan değerlere asla güvenmeyin.
Okumayı düşünün. Net Kütüphane Kullanımı, Özellikle Geliştirme kısmı.
Mikro Optimizasyonlar
Mikro optimizasyonlar daha büyük sorunların ele alınmasından sonra gelmelidir.
En uygun durumları şunlardır:
- Sistem zaten doğru ve eksiksiz.
- Profilleme, kodu önemli olarak tanımlar.
- Kod çok sık çalıştırılıyor.
- Optimize edilmiş sürüm sürdürülebilir kalır.
Sıralı dizilere doğrudan uygulayın
Görevi: #tbl + 1 Çağırmaktan daha hızlı olabilir. table.insert yoğun bir diziye eklenirken.
Bu sadece eklemeye eşittir. Kullanmaya devam edin table.insert Belirli bir pozisyonda yerleştirildiğinde veya niyeti daha net olduğunda.
Tekrarlanan Matematiği Basitleştirin
Bazı matematiksel eşdeğer ifadeler daha az işlem gerektirir:
- Karşılaştırma ile çarpım bölünmenin yerini alabilir.
- x*x, katlanımı iki ile değiştirebilir.
- Faktörlendirme tekrarlanan çarpımları ortadan kaldırabilir.
Önemli İlgili Kaynaklar
- https://gitspartv.github.io/LuaJIT-Benchmarks/
- "Mikro-Pico Optimizasyonlar"a odaklanıyor.
- https://github.com/FPtje/FProfiler
- Kodunuzdaki engelleri bulmanıza yardımcı olacak bir profiler
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord