2012-01-03 20 views
5

Programımda bir profiler (çok uykulu) çalıştırdım ve sıfırlama işlevimde yüksek bir yüzde gösteriyorum (sıfırlama işlevi çerçeve başına çalışır). programları şuna benzer:vektör :: clear() maliyeti çok fazla zaman mı?

Init Bölümü:

std::vector<std::vector<int>> VecOfVecOfPath; 
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640); 

VecOfVecOfPath diğer işlevleri tarafından bulunan yolun dizisidir. VecOfVecOfPath [i], çerçeve başına yürütme sırasında doldurulacaktır. E.g. Diğer işlevler tarafından push_back -ed ve çerçeve başına kullanmadan önce sıfırlanır.

sıfırlama işlevi:

void Reset() 
{ 
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear(); 
} 

Yani sıfırlama çok basittir, ancak profilcisine içinde oldukça yüksek bir sıralama var.

Bu yaygın mıdır? Vektör :: clear() dahili tip vektörler için bile böyle genel giderler var mı?

Teşekkürler!


Programı serbest bırakma modunda oluşturmayı denedim ve maliyeti neredeyse sıfıra düşürdüm. % 12 - 13% - 0.03 ~ 0.04%.

Daha sonra kaynak koduna gittim ve hata ayıklama modunda ek işlemleri gerçekleştiren ITERATOR_DEBUG_LEVEL gibi tanımlamalar var.

Bu yüzden @ noggin182'nin önerildiği gibi, Hata Ayıklama ve Serbest Bırakma modunda işler farklıdır.

Alıntı: "Meke Eğer yayın oluşturma profilleme ve performansını artırmak için ayarlanmış tanımlayan koşullu herhangi önişlemci olup olmadığını görmek için arama emin - 15:32 noggin182 3 Ocak." Bu ne olduğuna bağlı

+0

Gereksiz yere temiz aradığınızı düşündünüz mü? –

+0

@parapurarajkumar - benim için de ilk ortaya çıkan şey. Sanırım, 'VecOfVec' kullanımı ile ilgili daha fazla bilgiye ihtiyacımız var - belki Vec'ler açıklığı önlemek için geri dönüştürülebilir. –

+4

vektörünün vektörü nedir? –

cevap

1

Vektörünüzde, iç içe geçmiş vektörler sınıflar içeriyorsa, iç içe geçmiş vektörlerde her bir örnek için d'tor'u çağırıyor olacaksınız. Aynı zamanda hafızayı kaldıracağından eminim.

Oyun yazıyormuş gibi geliyor mu? Eğer öyleyse, oyun yazma konusunda okudum birkaç kitap (PDF'ler) vektörün genel kullanım için iyi olduğunu, ancak oyun için kullanmamanın daha iyi olacağını düşünün. Sadece yerel dizileri kullanın ve belleği kendiniz yönetin veya kendi konteyner sınıfınızı yuvarlayın.

Vektörünüzün 640 üst sınırı mı? Belki de böyle bir şey kullanmanın daha iyi olur mu?

sometype Values[20][640]; 
int size[20]; 

Sonra sıfırlama çağrısı sadece Hala bile bu gibi herhangi bir stl işlevlerini kullanmak mümkün olacak

for(int i=0; i<20; i++) size[0] = 0; 

olabilir: Ben olabildiğince yaklaşık olarak pek yardımcı olduğunu

std::sort(Values[i], Values[i] + size[i]); 

Daha fazla bilgi olmadan sağlayın

+0

, int türündendir, bu yüzden temizlemede fazla zaman almayacağını düşündüm. Ve eğer doğru bir şekilde rezerv() için varsa, yerel dizilerin vektörlerle aynı olduğunu mu düşündüm? Sonra vektörler yeniden tahsisi yapmayacak, bu yüzden hızlı. –

+0

tamam, eğer int vektör ise o zaman bu yavaş olmamalıydı. Hangi derleyiciyi kullanıyorsunuz? Tüm vektör uygulamalarına bakmadım ama MSVC, Borland ve GCC arasında ne kadar farklı olduklarına şaşırdım. Bunların hepsi, belirli akıl yürütme ve hata ayıklama kontrollerini etkinleştirmek için anahtarlara sahiptir ve aralık denetimi ve maskeleme gibi görevleri gerçekleştirir, sadece yineleyicileri yalnızca kastettikleri kapsayıcıda kullanırsınız. Sürüm oluşturmada profil oluşturduğunuzdan emin olun ve performansı artırmak için ayarladığınız önişlemci koşullu tanımlarının olup olmadığını kontrol edin. – noggin182

+0

VS2010 profesyonelini kullanıyorum. Bu sabah daha sonra sürüm oluşturmayı deneyeceğim ve rapor sonucu teşekkürler! –

İlgili konular