2016-03-28 47 views
0

Çok zaman harcayan bir uygulama üzerinde çalışıyorum ve biraz hızlandırmak istiyorum. Ctime kütüphanesinin clock() fonksiyonunu kullanarak tek parçaların çalışma zamanını analiz ettim ve bana göre tamamen net olmayan bir şey buldum.C++ hızlandırma yöntem çağrısı

Bir yöntemin dışında ve içinde zaman baskısı alıyorum, buna Yöntem1 olarak adlandıralım. Method1 içindeki baskı, tüm gövdesini içerir, sadece bir floatın geri dönüşü tabii ki dışarıda bırakılır. Şey, şey şu ki, dışarıdaki baskı, Yöntem1'deki baskı süresinin iki katı ila üç katı arasındadır. Dışarıdaki baskının daha fazla zaman göstermesi gerektiği açık, ama fark benim için oldukça büyük gözüküyor.

Yöntemim şu şekilde görünüyor: Verilerin kopyalanmasını önlemek için referanslar ve işaretçileri parametre olarak kullanıyorum. Veri vektörünün örneklere 330.000 işaretçi içerdiğini unutmayın.

float ClassA::Method1(vector<DataClass*>& data, TreeClass* node) 
{ 
    //start time measurement 
    vector<Mat> offset_vec_1 = vector<Mat>(); 
    vector<Mat> offset_vec_2 = vector<Mat>(); 
    for (int i = 0; i < data.size(); i++) 
    { 
     DataClass* cur_data = data.at(i); 
     Mat offset1 = Mat(); 
     Mat offset2 = Mat(); 

     getChildParentOffsets(cur_data, node, offset1, offset2); 

     offset_vec_1.push_back(offset1); 
     offset_vec_2.push_back(offset2); 
    } 

    float ret = CalculateCovarReturnTrace(offset_vec_1) + CalculateCovarReturnTrace(offset_vec_2); 
    //end time measurement 
    return ret; 
} 

Arama hızını artırmak için herhangi bir "bariz" yol var mı? Metodu okunabilirlik nedenlerinden dolayı kullanmayı tercih ederim, böylece hız kazanmak için herhangi bir şeyi değiştirebilir miyim?

Herhangi bir öneriniz için teşekkür ederiz!

OP başkaları tarafından yapılan yorumların herhangi bir hak iddia etmek çalışıyorum olmadan
+5

İşlevi satır içine almanın bir yolunu bulamazsanız, arama hızını artırmak için fazla bir potansiyel yoktur. –

+0

Açık bir yol, derleyicinin optimizasyon bayraklarını ayarlıyor olabilir. Ancak, yöntemin ne yaptığını ayrıntılı olarak açıklamalısınız, yöntem imzası bize herhangi bir hit vermez. –

+1

Zaman ayırıcı yıkıcı aramalar olabilir ...İşlevde çok sayıda karmaşık yapı varsa, temizleme için çok fazla olabilir – vu1p3n0x

cevap

2

Güncellenmiş kodunuza bağlı olarak, bitiş zaman ölçümü ile işlev çağrısından sonraki ölçüm arasındaki tek kod, işlevdeki oluşturulmuş nesneler için yıkıcılardır. Bu, 330.000 Mat s'nin iki vektörüdür. Bu Mat s her biri tarafından kullanılan kaynaklara bağlı olarak biraz zaman alacaktır.

+0

Böyle bir şeyle ortaya çıkabilecek genel bir sorun, yığın içinde yatma bekleyen bu dinamik nesnelerin binlerce kopyasını çok çabuk bulabilmeniz, çöp toplama işlemini beklemeniz ... ve sadece çöp koleksiyonunun artık oldukça pahalı olması değil. geldiğinde, ama genel yığın alanı büyük. (Ergo, çok sayıda sayfa hatası oluşma olasılığını ciddi derecede artırır.) Bu Mat nesnesi üzerinde bir "silme" işlemi, kaldırılan öğeleri geri dönüşüm için bir çeşit serbest listeye koyarsa, bu yardımcı olabilir. Ama eğer basitçe "özgür()" her şeyse, olmaz. VM sayfalama saat-zamanı öldürür. –

+0

Matlar oldukça küçük, sadece 3 yüzen içerir. Bu nedenle, 8 MB'den daha az gerekir. – Icarus

+0

Hmmm, sadece OpenCV 'Mat's veya başka bir yapı bu meraklı mısınız? Gerçekten sorduğum şey, @MikeRobinson'un söylediklerine benzer.Çünkü eğer bireysel tahsisatlar varsa, bu biraz zaman alacaktır, ancak eğer olmasalar ve bu nedenle std :: vector' yoluyla sürekli bir tahsisin parçası olsaydı, o zaman bunun hızlı olmasını beklerdim – vu1p3n0x

2

...

(1) kısa cevap hareket halinde olabilir, "hayır." Bu işlev oldukça net görünüyor ve 30.000 kez çok çalışıyor. Sonra, "tüm bu veriler" üzerinde bir hesaplama yapıyor.

(2) "offset1" ve "offset2" matrislerini her yineleme için tamamen yenilerini oluşturmak yerine yeniden kullanmayı düşünün. Tabii ki, bunun gerçekten daha hızlı olup olmayacağı görülecektir. (Ve her durumda, o tutarındaki, aşağıya bakınız "kod diddling.")

(3) Bu nedenle, Programlama Stil elemanları borç: "değil 'naganigi' kod yapmak Do daha hızlı: daha iyi bir algoritma bulun. " Ve bu durumda, sadece biri olmayabilir. Çalışma zamanı konusuna "silikon atmak" ile hitap etmelisiniz ve ilk yapmanın bu bilgisayara olabildiğince fazla RAM eklemesini tavsiye ederim. "Çok fazla veri ile ilgilenen" bir işlem, her biri çözülmesi gereken * mil- * saniye sırasını gerektiren sanal bellek sayfa hatalarına çok açıktır. Ben şahsen bu kod ile yanlış bir şey kategorik görmüyorum (Onlar gerçek hızlı ikinci eklenti yukarı hundredths.)

, ne kategorik daha hızlı çalışmasını sebebi olacaktı her şey. ("diddling") kodunu, şu anda sahip olduğunuz çok net ifadesinden yeniden yazmayı savunu da istemem.

+0

I upvoted. Ama aslında soruyu cevaplamadığınızı belirtmek isterim. Yöntemi nasıl optimize edeceğiniz konusunda önerilerde bulundunuz, ancak iç ölçümün neden dışsal ölçümden çok daha küçük bir değere sahip olduğuna dair bir açıklama sunmadınız. (Muhtemelen Matrix ayrılmaları nedeniyle, vu1p3n0x not edildi.) – JSQuareD

+0

Gerçekten de bu soruya değindim, çünkü sunabileceğim herhangi bir fikir sadece eğitimli bir tahminden ibaret olurdu ... sizinkilere çok benzeyen bir tahmin. –

+0

Teşekkür ederim. Önerinizi (2) 'de deneyeceğim. (3) Haklısınız. Ancak, eminim ki, RAM bitmiyor (bunu daha önce optimize ettim). – Icarus