SECTREE::m_neighbor_list cache locality

Larry Watterson

Üye
Üye
Mesaj
52
Çözümler
1
Beğeni
175
Puan
699
Ticaret Puanı
0
Farklı bir forumda paylaşılan optimizasyon düzeltmesini incelerken gözüme çarpması üzerine;

"ForEachAround" bu hot path içinde çalışan bir func, bir bakayım dedim üstün zekalı YMIR geliştiricileri neighbor list'i iterate ediyor functor içinde.

C++:
Genişlet Daralt Kopyala
FCollectEntity collector;
#ifdef __clang__
    LPSECTREE_LIST::const_iterator it = m_neighbor_list.begin();
#else
    LPSECTREE_LIST::iterator it = m_neighbor_list.begin();
#endif
for ( ; it != m_neighbor_list.end(); ++it)
{
    LPSECTREE sectree = *it;
    sectree->for_each_entity(collector);
}
collector.ForEach(func);

"m_neighbor_list" bu bir std::list yani doubly linked list implementasyonu, ne yapıyor bu? "SECTREE_MAP::Build" fonksiyonunda yani harita yüklenirken içine en fazla 9 tane komşu (kendisi + 8 komşu) pushlanıyor ve sadece read-only iterate olarak kullanılmış, build'den sonra hiç sattei değişmiyor.

Şimdi akış şöyle: ForEachAround, UpdateSectree üzerinden hareket/spawn/teleport/state-değişimi gibi olaylarda tetikleniyor, her tickte değil ama bir hot path sayılabilir. N entity x en fazla 9 komşu desek baya bir pointer chasing + indirection maliyeti var. Zaten böyle bir senaryoda neden std::list tercih edersin ki? iterator invalidation ihtimali yok, reallocation derdin yok çünkü sadece tabiri caizse initialize aşamasında bir şeyler pushluyorsun.

-> komşu sayısı load time'da sabitleniyor(üst sınır 9 fonksiyona bakarsınız gözümden kaçtıysa daha fazla olabilir ama yok gibi)
-> doubly linked listin herhangi bir faydası kullanılmıyor (ortaya ekleme vs o(1), no memory reallocation vb.)

e o zaman neden std::list tercih edilmiş? bunun cevabı gerçekten Allah bilir, hiçbir mantıklı sebebi yok.

trick burdaki container seçimini düzeltip contiguous bir container (std::vector ya da sabit kapasiteli boost::container::static_vector, std::inplace_vector vb.) tercih edin. Tabii sonuçları ölçmeden performans kazancı olduğunu kimse iddia edemez mantıken toplam çağrı sayısı arttıkça falan faydası görülmeli, ölçün.

Elde edilecek faydalar:

No pointer chasing
ILP
bla bla bla. klasik cache locality faydaları.
 
Son düzenleme:
Konuyu şöyle inceliyorum

1786522630936.webp
 
Sizce ymir geliştiricileri "üstün zekalı" denerek ti ye alınacak tarzda geliştiriciler mi hocam.
Yıllardır duyarız kodda görünen yanlışlarda, hatalarda, mantıksızlıklarda ymir geliştiricilerine bi dokundurulur.
Sebebi nedir acaba 2000lerde yapılan ve görece yıllar boyunca hizmet edip para kazanmış bir oyunun geliştiricileri sizce kötü geliştiriciler mi?
 
Sizce ymir geliştiricileri "üstün zekalı" denerek ti ye alınacak tarzda geliştiriciler mi hocam.
Yıllardır duyarız kodda görünen yanlışlarda, hatalarda, mantıksızlıklarda ymir geliştiricilerine bi dokundurulur.
Sebebi nedir acaba 2000lerde yapılan ve görece yıllar boyunca hizmet edip para kazanmış bir oyunun geliştiricileri sizce kötü geliştiriciler mi?
Bilindiği üzere Metin2 C++ ve python olmak üzere çok geniş bir kod yapısına sahip. Buna ek olarak ymir'in bir ekip olduğunu düşünürsek, bir dosyaya 10 farklı el değmesi muhtemeldir. Bir dosyaya zaman içinde hem çok iyi hem de çok kötü bir yazılımcı müdahale etmiş olması yüksek ihtimal. İnsani faktörler de ayrı bir etki tabi.. Bu sebeple bu tür ithamlar genelde o tarz kişilere yapılıyor, tüm ekibe değil.

Basit bir constructor vakası:
muhtemelen hatuna yetişmek için acele eden bir geliştiricinin hızını alamayıp şöyle bir şey yapması gibi:
C++:
Genişlet Daralt Kopyala
CPythonBackground::CPythonBackground()
{
    m_dwRenderShadowTime=0;
    m_eViewDistanceNum=0; // ✓
    m_eViewDistanceNum=0; // ?
    m_eViewDistanceNum=0; // ???? burada ne yaptığının farkına varmış ve durmuş. ama yine de düzeltilmemiş :D
    ...
    ...
}
 
Sizce ymir geliştiricileri "üstün zekalı" denerek ti ye alınacak tarzda geliştiriciler mi hocam.
Yıllardır duyarız kodda görünen yanlışlarda, hatalarda, mantıksızlıklarda ymir geliştiricilerine bi dokundurulur.
Sebebi nedir acaba 2000lerde yapılan ve görece yıllar boyunca hizmet edip para kazanmış bir oyunun geliştiricileri sizce kötü geliştiriciler mi?
Evet, kötü geliştiriciler.

2000'ler bence güzel bir era, yaşım o günleri görmeye yetmedi ama çokça legacy codebase incelemişimdir, çok daha temiz projeler var emin olun. Metin2 özelinde yazılım mühendisliği açısından berbat bir yapısı var, tasarım yok, kod kalitesi yok, uyulmuş bi kural seti yok, anlayacağınız yok da yok.

Yazılım sektöründe ortalama düzeyin çok düşük olduğu bir gerçek etnik fark etmeksizin, çünkü kimse okumuyor. Yani oturup 2-3 kitap okumuş adam yazmaz bu kodları, istese de yazamaz. Kendimden biliyorum ben de üniversite böyleydim, bu iş okumadan, yazmadan, çizmeden olmaz.

Bazı yerlere bakıyorsun hani bunun kötü bir geliştirici olmakla bile alakası yok, gavur deyimiyle naive olmak gerekiyor. Bir başkasının oturup kodu incelemesi ölüm gibi bir şey, programcının ne yapmak istediğini dahi anlamıyorsun, yorum satırı yok bir şey yok, esneklik yok, niyet açık değil, anti pattern çok fazla var kodlar zaten berbat, bla bla bla onlarca madde sayabilirim size. Hepsinin mühendis olduğunu varsayarsak en kötü ihtimalle bi pragmatic programmer, computer systems, gang 4 design patterns falan okumuş olmaları gerekir, ama gördüğümüz üzere okumamış, okuyup bu haldelerse zaten vah hallerine. Adamlar CPU, RAM nasıl çalışır ondan bile bihaberler, çalışıyor mu çalışıyor mantığıyla hurra diye girişilmiş öğrenci projesine benziyor. Tabii o zamanlar böyle bir oyun ortaya çıkarmışlar canıgönülden tebrik ve takdir edilmesi gereken bir şey, 1 0'dan her zaman iyidir. Benim laf atabileceğim yer programcılıkları, düpedüz C++ ve C bilmeyen insanlar tarafından üretilmiş, normal şartlarda bu tarzda kod ancak pseudo development tarafında yapılır.

Yıllardır duyarız dediğiniz kısım için sorun eleştirenlerin %98'inin halen 25 senelik YMIR düzeyinde bile olamaması, o yüzden yorum yapmayacağım.
 
Bilindiği üzere Metin2 C++ ve python olmak üzere çok geniş bir kod yapısına sahip. Buna ek olarak ymir'in bir ekip olduğunu düşünürsek, bir dosyaya 10 farklı el değmesi muhtemeldir. Bir dosyaya zaman içinde hem çok iyi hem de çok kötü bir yazılımcı müdahale etmiş olması yüksek ihtimal. İnsani faktörler de ayrı bir etki tabi.. Bu sebeple bu tür ithamlar genelde o tarz kişilere yapılıyor, tüm ekibe değil.

Basit bir constructor vakası:
muhtemelen hatuna yetişmek için acele eden bir geliştiricinin hızını alamayıp şöyle bir şey yapması gibi:
C++:
Genişlet Daralt Kopyala
CPythonBackground::CPythonBackground()
{
    m_dwRenderShadowTime=0;
    m_eViewDistanceNum=0; // ✓
    m_eViewDistanceNum=0; // ?
    m_eViewDistanceNum=0; // ???? burada ne yaptığının farkına varmış ve durmuş. ama yine de düzeltilmemiş :D
    ...
    ...
}
1786542111438.webp


ortalama ymir dev
 
Geri
Üst