如何解释Mono采样分析器结果?

时间:2017-08-09 10:35:56

标签: c# mono profiling

我正在分析基于x86的嵌入式目标系统在Mono / Linux上运行的C#应用​​程序的性能。我需要帮助来理解分析结果。

我想知道应用程序花费的时间,因此我根据http://www.mono-project.com/docs/debug+profile/profile/profiler/使用了采样分析器。

当我对应用程序进行概要分析时,我得到的结果会有不同的结果。 有时我几乎100%无管理命中,有时几乎100%管理。这两个案例都没有给我很多关于应用程序下落的信息(据我所知,就是这样)。

我使用Mono 4.2.1:

$ mono --version
Mono JIT compiler version 4.2.1 (Stable 4.2.1.60/804ddbc Tue May 10 14:32:13 CEST 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       normal
    Notifications: epoll
    Architecture:  x86
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen

案例1,许多非托管命中

$ mono --profile=log:sample=cycles/50000 myapp.exe

我收到了很多警告"时间倒退",但应用程序继续。通过增加周期时间(50000)可以稍微好一点,但不会太多。

然后分析,

$ mprof-report --reports=sample output.mlpd 

Statistical samples summary
    Sample type: cycles
    Unmanaged hits:    5134 (94.7%)
    Managed hits:       285 ( 5.3%)
    Unresolved hits:    106 ( 2.0%)
      Hits      % Method name
      3134  57.83 pthread_cond_wait
       683  12.60 clock_nanosleep
       341   6.29 sem_getvalue
       268   4.95 pthread_cond_timedwait
       233   4.30 __poll
       219   4.04 ioctl
       182   3.36 (wrapper native-to-managed) System.Drawing.GDIPlus/GdiPlusStreamHelper:StreamPutBytesImpl (intptr,int)
        27   0.50 __errno_location
        21   0.39 clock_gettime
        16   0.30 clock_gettime
        13   0.24 System.IO.Ports.SerialPortStream:get_bytes_in_buffer (int,int)
        13   0.24 pthread_setspecific
        11   0.20 __libc_fork
        10   0.18 modCom_Protocol.Ports.Streaming.StreamerBase:WorkerThreadReadPort ()
        10   0.18 __clock_gettime
         9   0.17 modCom_Protocol.Ports.Streaming.StreamerBase:get_WorkerThreadRunning ()
         9   0.17 (wrapper managed-to-native) object:__icall_wrapper_mono_marshal_set_last_error ()
         8   0.15 System.IO.Ports.SerialPortStream:get_BytesToRead ()
         7   0.13 System.Diagnostics.Stopwatch:GetTimestamp ()
         7   0.13 modCom_Protocol.Ports.Streaming.StreamerBase:WorkerJob ()
         6   0.11 get_bytes_in_buffer

案例2,没有非托管命中

在另一次运行中,当我以大致相同的方式与应用程序交互时,我得到以下内容:

root@periflux-64:~# mprof-report --verbose --reports=sample output.mlpd 

Statistical samples summary
    Sample type: cycles
    Unmanaged hits:       0 ( 0.0%)
    Managed hits:      5515 (100.0%)
    Unresolved hits:      0 ( 0.0%)
      Hits      % Method name
      5319  96.45 (wrapper native-to-managed) System.Drawing.GDIPlus/GdiPlusStreamHelper:StreamSizeImpl ()
       184   3.34 (wrapper native-to-managed) System.Drawing.GDIPlus/GdiPlusStreamHelper:StreamGetHeaderImpl (intptr,int)
         9   0.16 System.Diagnostics.Stopwatch:GetTimestamp ()
         2   0.04 modCom_Protocol.Tables.Crc16:ComputeChecksum (byte[])
         1   0.02 (wrapper stelemref) object:virt_stelemref_object (intptr,object)

显然,这两个案例的结果差别很大,但没有一个显示我应用程序自己的执行情况。

问题

  1. 我做错了什么,如何才能获得更好的结果?
  2. Unmanaged和Managed hits有什么区别?
  3. 如何解释示例1和2中的分析结果?
  4. 在案例2中,好像我的应用程序只是在做图形和 没有其他的。我知道事实并非如此。为什么我得到那个结果?

0 个答案:

没有答案