nesneleri bildirme performansı

Jan 03 2021

Bir tür üniversite fethinde kod yazıyordum ve aşağıdaki gibi bir döngüde bir harita ilan ettiğimde bir şey fark ettim:

for (int i = 0; i < n; i++)
{
    map<int, bool> hashMap;
    //...
}

şundan daha uzun sürer:

map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
    hashMap.clear();
    //...
}

bu yüzden bir döngüde bir nesneyi ilan etmenin, onu yeniden başlatmaktan neden daha kötü performansa sahip olduğunu merak ediyordum?

Yanıtlar

2 dxiv Jan 04 2021 at 10:59

Kodun ilk sürümünde kurucu ve yıkıcı zamanlar hashMapolarak adlandırılırken n, ikinci sürümde sadece bir kez çağrılır.

Doğal soru, yeni bir mapnesneyi yıkmanın ve inşa etmenin, bir ve aynı nesneyi temizlemeye ve yeniden kullanmaya kıyasla neden belirgin şekilde farklı olacağıdır. Bu, yalnızca mapkullanılan uygulamanın gerçek kodu incelenerek kesin olarak yanıtlanabilir , bu nedenle aşağıdaki sadece makul bir tahmindir.

std::mapgenellikle kırmızı-siyah ağaçlar kullanılarak gerçekleştirilir ve kırmızı-siyah ağaç uygulamalarında NIL-yaprakları için bir nöbetçi düğüm kullanmak yaygındır, örneğin kırmızı siyah ağaçta bir nöbetçi düğümün faydasına bakın ? . Bu nöbetçi, bir ağaç her inşa edildiğinde tahsis edilmeli, ardından imha edildikten sonra serbest bırakılmalıdır. Aksine, clear'a' mapkullanmak ağacı boşaltır ancak ilişkili dahili nesneleri yeniden kullanır.

Böyle bir uygulamanın gerçek hayattan bir örneği için, Microsoft'un _Treekurucusu uygun şekilde adlandırılmış _Alloc_sentinel_and_proxy();. Bunların yana maptüreyen _Tree, bu her zaman çağrılan mapnesne oluşturulur.