我正在分析基于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
$ 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
在另一次运行中,当我以大致相同的方式与应用程序交互时,我得到以下内容:
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)
显然,这两个案例的结果差别很大,但没有一个显示我应用程序自己的执行情况。