2010-07-06 19 views
5

Aşağıdaki koda sahibim (buradaki ilk örneği büyük ölçüde takip eder: http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/examples.html)). Bazı nedenlerden dolayı, çoklu indekse yalnızca 10000 giriş yapılarak, programı çalıştırmak birkaç dakika alır. Yanlış bir şey mi yapıyorum yoksa bu beklenen mi? (Çoklu endeks kaplarda dayalı benim en iyi bilgiye olan) boost::bi_map ile Kendi deneyimYavaş ekleme performansı ile çoklu indeksi artırın

struct A 
{ 
    int id; 
    int name; 
    int age; 
    A(int id_,int name_,int age_):id(id_),name(name_),age(age_){} 
}; 


/* tags for accessing the corresponding indices*/ 
struct id{}; 
struct name{}; 
struct age{}; 

typedef multi_index_container< 
    A, 
    indexed_by< 
    ordered_unique< 
     tag<id>, BOOST_MULTI_INDEX_MEMBER(A,int,id)>, 
    ordered_non_unique< 
     tag<name>,BOOST_MULTI_INDEX_MEMBER(A,int,name)>, 
    ordered_non_unique< 
     tag<age>, BOOST_MULTI_INDEX_MEMBER(A,int,age)> > 
> A_set; 



int main() 
{ 
    A_set es; 

    for (int a = 0; a != 10000; a++) { 
    es.insert(A(a,a+1,a+2)); 
    } 
    return 0; 
} 
+1

NDEBUG makrosunu ayarlıyor musunuz? Bunu ayarlarsam, kod hızlıca yanıp söner. – pmr

cevap

11

Hata ayıklama modunda derleme şansınız var mı?

#ifndef NDEBUG 
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING 
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE 
#endif 
: Eğer hata ayıklama modunda topluyoruz ve neredeyse ön işlemci şeyler de dahil olmak üzere, mektuba örneğini takip etti ve hala bu bölümü olsaydı O Visual Studio 2008'de varsayılan sürüm yapılandırmayla yakın anında bitirir

Ardından, bu tanımları kaldırmak/devre dışı bırakmak da yürütme süresini önemli ölçüde hızlandıracaktır. (Makinemde en az 180x, bitirmesine izin vermedi.) Bu şeyleri hata ayıklama yapısında devre dışı bırakmanın veya kaldırmanın sonuçları nedir bilmiyorum.

+0

Teşekkür ederim, oraya bakmanın farkına varamadım. Muhtemelen kodda bunu eklemiş olmalıyım. – tsiki

+0

Teşekkürler! Ben aynı şeyi yaptım ve bunları örnekte yapıştırdım ... – nhed

+0

Hata ayıklama için "BOOST_MULTI_INDEX_ENABLE_SAFE_MODE" öğesinin önemle tavsiye edildiğini unutmayın. Gördüğünüz yavaşlamaya neden olmaz ve kodunuzda ince hatalar bulur. BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING' burada suçlu. Arıza kodunda * hatalar olup olmadığını kontrol eder * ve destek kodu şüpheli olmadıkça ayarlamamanız gerekir. – Chronial

1

, ben bu çoklu endeks konteynerler maalesef nispeten yavaş olduğunu söylemek gerekir. Ancak bu, performans eklemek için değil. Bu yüzden senin durumunda neden bu kadar yavaş olduğunu anlamıyorum.

boost::bi_map'u iki boost::unordered_map s ile karşılaştırarak küçük bir karşılaştırma yaptım. Her iki yaklaşım için 100'000 benzersiz değerin eklenmesi yaklaşık 1 saniyedir. Ancak, 50000000 değerinin sorgulanması, unordered_map için 10 saniyedir ve sıralı harita için 26 saniyedir (tamsayı tuşlarını kullanır). (En iyi şirket içi veri yapımız, aramaları yaklaşık 1 saniye içinde gerçekleştirir).

4

Birkaç dakika çok yavaş görünüyor - Modern bir CPU için en çok saniyeler beklerim. Yükseltme, bir hata ayıklama oluşturma işleminde optimize edilmiş bir yayın oluşturma işleminden önemli ölçüde daha yavaş çalışan birçok küçük işlevi kullanma eğilimindedir.

Ayrıca BOOST_MULTI_INDEX_ENABLE_SAFE_MODE ve BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING ayarlanmamış emin olun. Bu ikisi de ek çalışma zamanı denetimi gerçekleştirir.

İlgili konular