nesneleri bildirme performansı
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
Kodun ilk sürümünde kurucu ve yıkıcı zamanlar hashMap
olarak adlandırılırken n
, ikinci sürümde sadece bir kez çağrılır.
Doğal soru, yeni bir map
nesneyi 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 map
kullanı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' map
kullanmak 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 map
türeyen _Tree
, bu her zaman çağrılan map
nesne oluşturulur.