2011-03-20 15 views
55

Programlarımdan birinde ruby-profiler çalıştırdım. Her alanın ne anlama geldiğini anlamaya çalışıyorum. Sanırım her şey CPU zamanı (ve duvar saati değil), bu harika bir şey. "---" nin ne anlama geldiğini anlamak istiyorum. Orada bir çeşit yığın bilgisi var mı? A/b'nin anlamı nedir?Ruby-prof çıkışını anlama

Thread ID: 81980260 
Total Time: 0.28 

    %total %self  total  self  wait  child   calls Name 
-------------------------------------------------------------------------------- 
         0.28  0.00  0.00  0.28    5/6  FrameParser#receive_data 
100.00% 0.00%  0.28  0.00  0.00  0.28    6  FrameParser#read_frames 
         0.28  0.00  0.00  0.28    4/4  ChatServerClient#receive_frame 
         0.00  0.00  0.00  0.00    5/47  Fixnum#+ 
         0.00  0.00  0.00  0.00    1/2  DebugServer#receive_frame 
         0.00  0.00  0.00  0.00   10/29  String#[] 
         0.00  0.00  0.00  0.00   10/21  <Class::Range>#allocate 
         0.00  0.00  0.00  0.00   10/71  String#index 
-------------------------------------------------------------------------------- 
100.00% 0.00%  0.28  0.00  0.00  0.28    5  FrameParser#receive_data 
         0.28  0.00  0.00  0.28    5/6  FrameParser#read_frames 
         0.00  0.00  0.00  0.00    5/16  ActiveSupport::CoreExtensions::String::OutputSafety#add_with_safety 
-------------------------------------------------------------------------------- 
         0.28  0.00  0.00  0.28    4/4  FrameParser#read_frames 
100.00% 0.00%  0.28  0.00  0.00  0.28    4  ChatServerClient#receive_frame 
         0.28  0.00  0.00  0.28    4/6  <Class::Lal>#safe_call 
-------------------------------------------------------------------------------- 
         0.00  0.00  0.00  0.00    1/6  <Class::Lal>#safe_call 
         0.00  0.00  0.00  0.00    1/6  DebugServer#receive_frame 
         0.28  0.00  0.00  0.28    4/6  ChatServerClient#receive_frame 
100.00% 0.00%  0.28  0.00  0.00  0.28    6  <Class::Lal>#safe_call 
         0.21  0.00  0.00  0.21    2/4  ChatUserFunction#register 
         0.06  0.00  0.00  0.06    2/2  ChatUserFunction#packet 
         0.01  0.00  0.00  0.01   4/130  Class#new 
         0.00  0.00  0.00  0.00    1/1  DebugServer#profile_stop 
         0.00  0.00  0.00  0.00    1/33  String#== 
         0.00  0.00  0.00  0.00    1/6  <Class::Lal>#safe_call 
         0.00  0.00  0.00  0.00    5/5  JSON#parse 
         0.00  0.00  0.00  0.00    5/8  <Class::Log>#log 
         0.00  0.00  0.00  0.00    5/5  String#strip! 
-------------------------------------------------------------------------------- 
+2

Hata ayıklayıcı altında çalıştırırsanız, el ile kesme ve çağrı yığınının 4 kez görüntülenmesi, bu örneklerin ortalama 3'ünün aşağıdaki gibi olacağını belirtmek isterim: 'read_frames -> receive_frame -> safe_call -> register -> ... 'bu yüzden darboğazınız dikkatiniz için size bağırıyor olacak. Bu [bu yöntem] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024). Zamanın kalan% 25'i çoğunlukla ... -> paket -> ... 'dir. Diğer her şey temel olarak ilgisizdir. –

+0

@Mike, Grafiğin bu sonucu nasıl yorumlayacağınızı anlatırsanız, bu sorunun nasıl elde edildiğini (bu çıkışı nasıl yorumlayacağımız) bu olduğunu düşündüğümden, yardımcı olabilirsiniz. Benim için yararlı olur! –

+1

@Charles: "Toplam" sütununa bakıyorum, bu da yığın üzerinde harcanan zaman miktarı. İlk grup çizgisi "read_frames" hakkında. Tüm zaman, "get_frame" i çağırmak için harcanır. Üçüncü satırlar, tüm zamanını 'safe_call' içinde harcayan "get_frame" ile ilgilidir. Dördüncü grup 'safe_call'' zamanının çoğunu' register''da, sonra 'packet''te ve' new''de biraz harcadığını söylüyor. (İkinci grup, "get_data" nın her zaman en üstte olduğunu söylüyor.) –

cevap

61

Ruby-prof çıkışının her bölümü, belirli bir işlevin incelemesine ayrılmıştır. örneğin, çıktınızın ilk bölümüne bakın. FrameParser üzerinde read_frames yöntem odak noktası ve temelde şunu söylemektedir; FrameParser # read_frames

  • FrameParser # read_frames içinde harcandı profilli edildi icra zaman

    • 100% 6 kez çağrıldı.
    • read_frames öğelerine yapılan 6 çağrıdan 5'i FrameParser # alma_tadı'ndan geldi ve bu, yürütme süresinin% 100'ünü oluşturdu (bu, read_frames satırının üstündeki satırdır).
    • read_frames (ancak bu ilk bölümün içinde) yönteminin altındaki çizgiler, FrameParser # read_frames çağrılarının (bu kodunuzun kodunuz gibi göründüğünden haberdar olmanız gerekir) yöntemlerinin tümüdür, bu yöntemlerden kaçının read_frames toplam sayısıdır (a/b çağrıları sütunu) sorumludur ve bu çağrıların ne kadar sürdüğü. En çok idam zamanlarını aldıklarından emirler. Durumunuzda, bu ChatServer sınıfında rece_frame yöntemidir.
    • Daha sonra, rece_frames (2 aşağı ve alma_frame üzerinde '% 100' çizgisiyle ortalanmış) üzerine odaklanan bölüme bakabilirsiniz ve performansın nasıl bozulduğunu görebilirsiniz. Her bölüm aynı şekilde ayarlanır ve genellikle en fazla zaman alan sonraki işlev çağrısı, sonraki bölümün odak noktasıdır. ruby-prof bunu tam çağrı yığını boyunca yapmaya devam edecektir. Çözmek istediğiniz darboğazı bulana kadar istediğiniz kadar ilerleyebilirsiniz.
  • +4

    Daha fazla ayrıntı için bu örneği ruby-prof github repo’dan gelen açıklamalar ile inceleyebilirsiniz: https://github.com/rdp/ruby-prof/blob /master/examples/graph.txt – Florin

    +16

    Repo taşındı ve bu bağlantı şu anda https://github.com/ruby-prof/ruby-prof/blob/master/examples/graph.txt adresinde kullanılabilir. –

    İlgili konular