VCÓïÑÔ

±¾ÀàÔĶÁTOP10

¡¤VC++ÏÂʹÓÃADO±àдÊý¾Ý¿â³ÌÐò
¡¤VC++ ѧϰ±Ê¼Ç(¶þ)
¡¤WindowsÏûÏ¢´óÈ«
¡¤Ã¿¸ö¿ª·¢ÈËÔ±ÏÖÔÚÓ¦¸ÃÏÂÔØµÄÊ®Öֱر¸¹¤¾ß
¡¤ÔÚ2000ºÍxpÏ£¬Òþ²Ø½ø³Ì£¬VC6.0²âÊÔͨ¹ý!!!
¡¤ÓÃVisual C++´òÔìIEä¯ÀÀÆ÷(1)
¡¤Netmsg ¾ÖÓòÍøÁÄÌì³ÌÐò
¡¤½ÌÄãÓÃVC6×öQQ¶Ô¶ÔÅöÍâ¹Ò³ÌÐò
¡¤VC++ѧϰ±Ê¼Ç(ËÄ)
¡¤VC++Öо­³£Ê¹Óõĺ¯Êý£¡~~

¡ú ·ÖÀർº½
VCÓïÑÔDelphi
VBÓïÑÔASP
PerlJava
ScriptÊý¾Ý¿â
ÆäËûÓïÑÔÓÎÏ·¿ª·¢
Îļþ¸ñÊ½ÍøÕ¾ÖÆ×÷
Èí¼þ¹¤³Ì.NET¿ª·¢
·­ÒëMatt Pietrek µÄ Under the Hood רÀ¸ÎÄÕ The .NET Profiling API and the DNProfiler Tool

×÷ÕߣºÎ´Öª À´Ô´£ºÔ¹âÈí¼þÕ¾ ¼ÓÈëʱ¼ä£º2005-2-28¡¡Ô¹âÈí¼þÕ¾

The .NET Profiling API and the DNProfiler Tool

http://msdn.microsoft.com/msdnmag/issues/01/12/hood/default.aspx

΢ÈíµÄ.NET Common Language Runtime(CLR)ÄÚ²¿ÌṩÁ˺ܶà»úÖÆÀ´´´½¨¸üÈÝÒ×ʹÓᢸüÃæÏò¶ÔÏóµÄƽ̨¡£°üÀ¨À¬»ø»ØÊÕ¡¢±ê×¼µÄ¿çÓïÑÔÒì³£´¦Àí¡¢¹ã·ºµÄÀà¿â¡¢ÔªÊý¾Ý¡¢ºÍÒÑ´ænative´úÂëµÄ»¥²Ù×÷ÐÔ¡¢Ô¶³Ì´¦Àí¡£Ò²°üÀ¨¿çcpuÖ¸Áî¸ñʽ£¨ÖмäÓïÑÔ£¬IL£©ºÍ½«IL±àÒë³ÉÄܹ»ÔÚÄ¿±êcpuÉÏÔËÐеĴúÂëµÄ¼´Ê±±àÒëÆ÷¡£

Ëæ×ÅϵͳµÄ·¢Õ¹±äµÃÔ½À´Ô½¸´ÔÓ£¬Äܹ»Àí½âϵͳµÄÄÚ²¿¹¤×÷»úÖÆ±äµÃÔ½À´Ô½ÓмÛÖµ¡£ÔÚWindows®£¬µ÷²é¿ÉÖ´ÐгÌÐò×°ÔØÆ÷¡¢ÄÚ´æ¹ÜÀíÆ÷µÄ²Ù×÷»úÖÆ½«Õ¹Ê¾ºÜ¶à²»Í¬µÄ¼¼ÇÉ¡£ÁíÍ⣬ÓÐЩ¼¼ÇÉÔÚwindow 9X ƽ̨ÏÂÄܹ»Õý³£¹¤×÷£¬µ«ÊÇÔÚWindows NT® ºÍWindows 2000²»Äܹ¤×÷£¬·´Ö®ÒàÈ»¡£ÔÚWin32®Ï£¬²é¿´½ø³ÌµÄÄÚ²¿²Ù×÷µÄ×îºÃ·½Ê½ÊÇʹÓõ÷ÊÔAPI£¬µ«ÊÇËüÒ²Ö»ÄÜÊǰüº¬ºÜÉÙµÄÒ»²¿·Ö¡£

ÔÚ.NETϾÍÍêÈ«²»Í¬ÁË¡£ÒòΪCLRÔËÐÐʱÊÇÈκÎ.NET³ÌÐòµÄÖÐÐÄ£¬ËüÌṩÁËÒ»¸öÂß¼­Î»ÖÃÀ´²åÈë¹³×ÓÒÔ±ã¹Û²ì.NETµÄÄÚ²¿¡£Ô¤¼Æµ½¹¤¾ß¿ª·¢Õß¡¢ÏµÍ³¼¶³ÌÐòÔ±µÄÐèÒª£¬MicrosoftʹÓÃ.NETÀ´ÌṩÁËÒ»¸ö·Ç³£ÏêϸµÄ¡¢Ò»Öµķ½Ê½È¥¹Û²ì½ø³ÌµÄÄÚ²¿²Ù×÷¡£±¾Ô£¬ÎÒÒªÃèÊöÕâÖÖ»úÖÆ¡¢²¢Ìṩһ¸ö³ÌÐò£¨DNProfile£©À´¼Ç¼.NETÔËÐÐʱµÄ²Ù×÷¡£

The .NET Profiling API

              ¹Û²ì.NETÔËÐÐʱ¶¯×÷µÄÒ»ÖÖ·½Ê½Ê±Ê¹ÓÃÆÊÎöAPI¡£ÆÊÎöAPIµÄÃüÃû²»ºÃ£¬ÒòΪËü¶ÔºÜ¶àÖÖÊÂÇé¶¼ºÜÓÐÓ㬶ø²»½ö½öÊÇÆÊÎö¡£¿¼ÂÇ¿ÉÒÔ±»ÆÊÎöAPI¹Û²ìµÄ.NET¶¯×÷ÁÐ±í£¬ÈçÏ£º

        Figure 1 Functions of the Profiling API

CLR startup and shutdown

Application domain creation/shutdown

Assembly loads/unloads

Module loads/unloads

Class loads/unloads

COM interop VTable creation/destruction

JIT-compiles, code pitching, and pre-JITed method searches

Thread creation/destruction/suspends

Remoting activity

Exception handling

Managed/unmanaged code transitions

Garbage collection and managed heap objects

Method entry/exit

       ÕýÈçKeanu Reeves»á˵Whoooa! Ïà¶ÔÓÚ¾­¹ýÁ˶àÄêµÄ¼è¿à̽Ë÷ÕÒµ½µÄÈçºÎ¸øWINDOWS°²×°¹³×ÓÀ´½²£¬Microsoftʹ¹Û²ìCLRµÄÐÐΪ±äµÃ·Ç³£ÈÝÒ×ÁË¡£ÁбíÖеÄÿһ¸ö¶¯×÷¿ÉÒÔ¿´×÷Ò»¸öÍêÈ«²»Í¬µÄCALLBACK¡£ÀíÂÛÉϽ²£¬½ö½öÔÚCALLBACKº¯ÊýÖÐдÐèÒªµÄ´úÂë¾Í¿ÉÒÔÁË¡£

        ÏÖÔÚ£¬×îºÃµÄÆÊÎöAPIÎĵµÊÇ.NET SDKϵÄProfiling.doc£¬ÔÚTool Developers Guide\docsĿ¼Ï¡£¶ÔÓÚBeta2 À´½²£¬Õâ¸öÎĵµºÍʵÏÖÉÔ΢ÓÐЩ²»Í¬²½¡£ÔÚ±¾ÆÚ¿¯ÖУ¬ÎÒ²»»á¹ã·ºµÄÌÖÂÛÆÊÎöAPIµÄÿһ¸ö·½Ã棬¶øÊÇÖØµãÌÖÂÛÆÊÎöAPIÄÜ×öµÄ´óµÄ·½Ãæ¡£

.NETµÄÒ»¸ö´óµÄÂôµãÊÇËü²»ÔÙʹÓÃCOM¡£Õâ²»ÊÇÕæµÄ£¬ÊÂʵÉÏ£¬ÆÊÎöAPI¾ÍÊÇ»ùÓÚCOMµÄ¡£Ê¹ÓÃÆÊÎöAPI°üÀ¨´´½¨Ò»¸ö½ø³ÌÄÚ·þÎñÆ÷£¬ËüʵÏÖÁ˵¥Ò»µÄ½Ó¿Ú¡£Ã¿Ò»¸ö½Ó¿Ú·½·¨´ú±íÁËFigure 1ÖеÄÒ»¸öʼþ¡£ÔÚCALLBACK·½·¨ÄÚ²¿£¬´úÂë¿ÉÒÔʹÓÃÁíÍâµÄCOM½Ó¿Ú£¨ÓÉCLRÌṩ£©À´µÃµ½¹Û²ìʼþµÄÐÅÏ¢¡£

¸öÈËÀ´½²£¬ÎÒϲ»¶¸ü¼òµ¥µÄAPIÀ´¶ÔËù¸ÐÐËȤµÄÿһ¸öʼþ½øÐÐ×¢²á¡£½«APIʵÏÖ×÷Ϊһ¸öCOM¶ÔÏóÇ¿ÆÈÄãд¼¸ºõͬÑùµÄ´úÂëÒÔ±ãʹÓÃCOM¶ÔÏó¡£¼ÈÈ»ÆÊÎöAPIÊÇ»ùÓÚCOMµÄ£¬ÆÊÎöAPIµÄÓû§ºÜ¿ÉÄÜʹÓÃC++¡£

¾¡¹ÜʹÓõäÐ͵ÄCOM¶ø²»ÊÇʹÓÃÍйÜ.NET´úÂëÆð³õ¿´ÆðÀ´ÓÐÐ©Ææ¹Ö£¬×Ðϸ¿¼ÂÇÖ®ºó¾Í»áÃ÷°×¡£Èç¹ûÓÃÍйܴúÂëʵÏÖ½Ó¿Ú£¬Ëü½«¶Ô¼àÊÓµÄËùÓÐʼþµÄ²úÉú¸ºÃæÓ°Ïì¡£ÀýÈ磬Èç¹ûʵÏÖ½Ó¿ÚµÄÍйܴúÂë´¥·¢ÁËÒì³£Ôõô°ì£¿ÔÚAPIûÓ줻îµÄÇé¿öÏ£¬Ò쳣ʼþÒ²²»»á·¢Éú¡£

Ò»µ©ÄãÓÐÒ»¸öʵÏÖÁËProfiling½Ó¿ÚµÄCOM·þÎñÆ÷£¬ÏÂÒ»²½ÊÇÇ¿ÆÈCLR×°ÔØCOM·þÎñÆ÷¡¢µ÷ÓÃËüµÄ·½·¨¡£¼¼ÇÉÊÇÉèÖû·¾³±äÁ¿¡£¸ú×¢²á±í¡¢XMLÎļþ±È½ÏÆðÀ´£¬»·¾³±äÁ¿ÊÇͦ¹ÅÀϵġ£

Ϊʲô²»ÓÃ×¢²á±í£¨ÅäÖÃÎļþ£©¸æËßCLRÓ¦¸Ãµ÷ÓÃProfiling API£¿ÎÒ´ÓMicrosoft¿ª·¢ÕßÄÇÀïÌý˵µÄÒ»¸öÔ­ÒòÊÇÄÇÒªÇó.NET³ÌÐòÔÚÆô¶¯Ê±¼ì²é×¢²á±í½«»áÓÐÐÔÄÜÓ°Ïì¡£¿¼Âǵ½.NETÆô¶¯Ê±ÓкܶàÊÂÇéÒª×ö£¬ÕâÑùµÄÔ­Òò¿¼ÂǵÄÒ²ÊǺÜÉ÷ÖØµÄ¡£ËäÈ»Èç´Ë£¬Ê¹Óû·¾³±äÁ¿¿ÉÒÔ¶ÔËùÓгÌÐòÆð×÷Óã¨Èç¹ûÔÚϵͳ»·¾³±äÁ¿£©»òµ¥¶ÀµÄ½ø³Ì¡£ÔÚºóÕßÇé¿öÏ£¬µ÷ÊÔÆ÷¡¢ÆÊÎöÆ÷µÈ¹¤¾ß¿ÉÒÔÔÚÆô¶¯³ÌÐòʱָ¶¨»·¾³±äÁ¿¡£ÉÔºóÎÒ½«ÌÖÂÛËùÐèÒªµÄ»·¾³±äÁ¿¡£

The .NET Profiling API Interfaces

              ÎÒ¼ì²éµÄÖ÷ÒªµÄ½Ó¿ÚÊÇICorProfilerCallback£¬ÔÚ.NET Framework SDKµÄIncludeĿ¼ÏµÄCorProf.IDLÎļþÖж¨Òå¡£½Ó¿ÚµÄʵÏÖÐèҪʹÓÃÆÊÎöAPI¡£ÄãµÄ¹¤×÷ÊÇÌṩʵÏÖ¡£¾¡¹ÜÓкܶàµÄ·½·¨£¬²»ÒªÅ£¬¶ÔÓÚËûÃÇÖеĴó¶à˵£¬¿ÉÒÔ¼òµ¥µÄ·µ»ØS_OK»òE_NOIMPL¡£¶ÔÓÚÃ÷È·µÄʼþµÄ¶¯×÷£¬ÔÚºÏÊʵÄCALLBACK·½·¨ÖÐдºÏÊʵĴúÂë¡£

        ¼ì²éCALLBACK·½·¨£¬Äã»á·¢Ïִ󲿷ֽÓÊÕÓйØÓÚÄǸöʼþµÄÁíÍâÐÅÏ¢µÄ²ÎÊý¡£ÀýÈç,JITCompilationStarted·½·¨½ÓÊÕÁËÒ»¸öÃûΪfunctionIdµÄUINTÀàÐ͵IJÎÊý¡£Äã¿ÉÒÔ¶ÔËü×öʲô£¿´ð°¸ÔÚÓÚ½Ó¿ÚICorProfilerInfo¡£

        ICorProfilerInfo¿ÉÒÔÌṩÈÎºÎÆÊÎöÐÅÏ¢¡£¿¼ÂǸղÅÌá¼°µÄfunctionId£¬Äã¿ÉÒÔµ÷ÓÃICorProfilerInfo::GetTokenAndMetaDataFromFunction£¬Ëü·µ»Ø¸øÄãÔªÊý¾Ý½Ó¿Ú¡¢º¯ÊýµÄÔªÊý¾Ýtoken¡£Ê¹ÓÃÔªÊý¾Ý½Ó¿ÚºÍtoken£¬Äã¿ÉÒÔ²éѯº¯ÊýÃû¡¢ËüËùÔÚµÄÀà¡¢¼°ÄãËùÖªµÀµÄÈκÎÐÅÏ¢¡£

        ¼òµ¥µÄ½²£¬ÆÊÎöAPI°üº¬ÁËÁ½¸öCOM½Ó¿Ú¡£ÒýÈë½Ó¿Ú£¬ÓÉÄãÀ´ÊµÏÖ£¬ÊÇICorProfilerCallback¡£µ±CLRʼþ·¢Éúʱ£¬CLR»áµ÷ÓýӿÚÖеÄijһ¸ö·½·¨¡£Òý³ö½Ó¿Ú£¬ÊÇICorProfilerInfo£¬ÓÉCLRÌṩ¸øÄ㣬ÈÃÄãÔÚCALLBACKÄÚ²¿Ê¹Óá£

        ʹÓÃICorProfilerCallback²ÎÊýµÄÆÕ±éµÄģʽÊǹ㷺µÄʹÓÃIDÀ´´ú±íº¯Êý¡¢Àࡢģ¿é¡¢³ÌÐò¼¯£¬µÈ¡£IDÊDz»Í¸Ã÷µÄ¾ä±ú¡£¹ØÓÚËüµÄÓÐÒâÒåµÄÐÅÏ¢´ÓICorProfilerInfo½Ó¿ÚÀ´»ñµÃ¡£³ÌÐòÖ´Ðйý³ÌÖÐÈç¹ûº¯ÊýµÄ´úÂë±»Ð¶ÔØ£¬È»ºóÓÖ±»×°ÔØ¡¢²¢±àÒë£¬ÌØ¶¨µÄIDÖµ£¨ÈçfunctionId£©¿ÉÄÜ»á¸Ä±ä¡£µ«ÊÇÓÐCALLBACKÈÃÄãÖªµÀÕâ¸ö·¢ÉúÁË¡£

        ICorProfilerCallback·½·¨¿ÉÒÔ·Ö³ÉÂß¼­µÄ¼¸×é¡£´ó²¿·ÖÇé¿öÏ£¬Ê¼þ¶¼ÓÐStarted¡¢Finished·½·¨£¬²¢ÇҳɶԵĵ÷Óá£ÈÃÎÒÃǽøÐÐÉîÈëÑо¿Ëü£¬¸üºÃµÄÁ˽âÎÒÃÇ¿ÉÒÔͨ¹ýCLR¹Û²ìµ½Ê²Ã´¡£³ý·ÇÓÐÌØÊâ˵Ã÷£¬ÏÂÃæÁгöµÄËùÓз½·¨¶¼ÊôÓÚICorProfilerCallback½Ó¿Ú¡£

Initialize/Shutdown Methods

              ÔÚʹÓÃÆÊÎöAPIµÄ½ø³ÌÖУ¬InitializeÊǵÚÒ»¸ö±»µ÷Óõķ½·¨¡£ÄãµÄ´úÂë´ÓÕâ¸ö·½·¨µÃµ½ICorProfilerInfoÖ¸Õ롣ΨһµÄ²ÎÊýÊÇLPUNKNOWN£¬¶ÔËüµ÷ÓÃQueryInterface·½·¨µÃµ½ICorProfilerInfoÖ¸Õë¡£InitializeÊÇÄã¸æË߯ÊÎöAPIÄã¶ÔÄÄЩʼþ¸ÐÐËȤµÄµØ·½¡£

        ΪÁËÖ¸³öÄã¸ÐÐËȤµÄʼþ£¬µ÷ÓÃICorProfilerInfo::SetEventMask·½·¨£¬´«µÝÒ»¸öÉèÖÃÁ˺ÏÊʵÄbitµÄDWORDÀàÐ͵IJÎÊý¡£ÕâЩ±êÖ¾À´×ÔÓÚCorProf.hÎļþÖеÄCOR_PROF_MONITORö¾Ù±äÁ¿¡£µÍλֵ±êÖ¾±»ÃüÃûΪCOR_PRF_MONITOR_XXX£¬¸æËßCLRµ÷ÓÃICorProfilerCallbackµÄÄÄЩ·½·¨¡£ÀýÈ磬Èç¹ûÄãÏëÈÃClassLoadStarted·½·¨±»µ÷Óã¬Äã±ØÐëÉèÖÃCOR_PRF_MONITOR_CLASS_LOADS±êÖ¾¡£

        ICorProfilerInfo::SetEventMask·½·¨µÄ²ÎÊýµÄÁíÍâһЩ±êÖ¾ÒÔÒ»ÖÖ·½Ê½¡¢»òÕßÁíÒ»ÖÖ·½Ê½¸Ä±äCLRµÄÐÐΪ.ÀýÈ磬Èç¹ûÄãÏëÔÚÖ´ÐÐʱ¼àÊÓ¶ÔÏóµÄ·ÖÅ䣬±ØÐëÉèÖÃCOR_PRF_ENABLE_OBJECT_ALLOCATED±êÖ¾¡£ÏàËÆµÄ£¬COR_PRF_DISABLE_INLINING¸æËßCLR²»ÒªÄÚÁªÈκκ¯Êý¡£Èç¹ûÒ»¸ö·½·¨ÄÚÁªÁË£¬Ä㽫µÃ²»µ½ENTER¡¢LEAVE֪ͨ¡£

        Äã¿ÉÒÔÔÚÒÔºóµÄij¸öʱ¿Ìµ÷ÓÃICorProfilerInfo::SetEventMaskÀ´ÐÞ¸ÄÄãËù¸ÐÐËȤµÄʼþ¡£È»¶ø£¬Ä³Ð©Ê¼þÊDz»¿ÉÒԸıäµÄ£¬Òâζ×ÅÄãÒ»µ©ÔÚInitializeÉèÖÃÁË£¬ËûÃǽ«²»Äܱ»Ð޸ġ£

        µ±CLRÖÕÖ¹½ø³Ìʱ£¬Shutdown·½·¨±»µ÷Óá£ÔÚijЩÇé¿öÏ£¬Ëü²»»á±»µ÷Ó㬵«ÊǶÔÓÚÒ»¸öÕý³£ÖÕÖ¹µÄ.NET³ÌÐòÀ´½²£¬ËüÓ¦¸Ã±»µ÷Óá£

Application Domain Creation/Shutdown

              Õâ¸öÖÖÀàµÄ·½·¨ÓÐAppDomainCreationStarted, AppDomainCreationFinished, AppDomainShutdownStarted, and AppDomainShutdownFinished¡£ËûÃǵÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£ÕâЩ·½·¨µÄÖ÷ÒªTokenÊÇAppDomainID¡£ÐèҪעÒâµÄÊÇÔÚAppDomainCreationStarted »Øµ÷·½·¨ÖУ¬²»ÄÜʹÓÃAppDomainID£¬ÒòΪAppDomain»¹²»´æÔÚ¡£È»¶ø£¬Ò»µ©ÊÕµ½ÁËAppDomainCreationFinished֪ͨ£¬¾Í¿ÉÒÔÒÔAppDomainIDΪ²ÎÊýµ÷ÓÃÒÔΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetAppDomainInfo À´µÃµ½ÐÂAppDomainµÄÐÅÏ¢¡£

Assembly Loads/Unloads

              ÔÚ×°ÔØ¡¢Ð¶ÔسÌÐò¼¯Ê±£¬AssemblyLoadStarted, AssemblyLoadFinished, AssemblyUnloadStarted,  AssemblyUnloadFinishedÕâЩ·½·¨±»µ÷Óá£Ö÷ÒªµÄTokenÊÇAssemblyID¡£ÐèҪעÒâµÄÊÇÔÚAssemblyLoadStarted·½·¨Öв»ÄÜʹÓÃToken AssemblyID£¬ÒòΪ³ÌÐò¼¯»¹²»´æÔÚ¡£È»¶ø£¬Ò»µ©ÊÕµ½AssemblyLoadFinished֪ͨ£¬¾Í¿ÉÒÔÒÔAssemblyIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetAssemblyInfoÀ´µÃµ½Ð³ÌÐò¼¯µÄÐÅÏ¢¡£

Module Loads/Unloads

            ×°ÔØÄ£¿éÏà¹ØµÄº¯ÊýÓÐModuleLoadStarted, ModuleLoadFinished, ModuleUnloadStarted, ModuleUnloadFinished, ºÍModuleAttachedToAssembly¡£Ç°Ëĸöº¯ÊýµÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£Ö÷ÒªµÄTokenÊÇModuleID¡£ºÍAssemblyLoadStartedʱµÄTokenÒ»Ñù£¬´«µÝ¸øModuleLoadStarted·½·¨µÄTokenÒ²ÊDz»¿ÉÓõġ£ÒòΪģ¿é²»´æÔÚ¡£µ«Êǵ±ÊÕµ½ModuleLoadFinished֪ͨºó£¬¾Í¿ÉÒÔÒÔModuleIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetModuleInfoÀ´µÃµ½ÐÂÄ£¿éµÄÐÅÏ¢¡£

µ±CLR½«Ò»¸öÄ£¿éºÍÒ»¸ö³ÌÐò¼¯Ïà¹ØÁªÆðÀ´Ê±£¬×îºóÒ»¸öº¯Êý£¬ModuleAttachedToAssembly£¬±»µ÷Ó᣾¡¹ÜÄ£¿éºÍ³ÌÐò¼¯¾­³£ÊÇͬһ¸öÎļþ£¬Ò»¸ö³ÌÐò¼¯Ò²¿ÉÄÜÓжà¸öÄ£¿é¡£

Class Loads/Unloads

×°ÔØÀàÏà¹ØµÄº¯ÊýÓÐClassLoadStarted, ClassLoadFinished, ClassUnloadStarted, ºÍClassUnloadFinished¡£ÕâЩº¯ÊýµÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£´«µÝ¸øClassLoadStarted·½·¨µÄTokenÒ²ÊDz»¿ÉÓõġ£ÒòΪÀ಻´æÔÚ¡£µ«Êǵ±ÊÕµ½ClassLoadFinished֪ͨºó£¬¾Í¿ÉÒÔÒÔClassIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetClassIDInfoÀ´µÃµ½ÐÂÀàµÄÐÅÏ¢¡£

JIT Compilation

JIT±àÒë·½·¨£¨Èçͼ2£©Óõ½µÄÖ÷ÒªTokenÊÇFunctionID¡£

JITCompilationStarted

JITCompilationFinished

JITCachedFunctionSearchStarted

JITCachedFunctionSearchFinished

JITFunctionPitched

JITInlining

ÕâÀÊõÓﺯÊý¡¢·½·¨½»»¥µÄʹÓá£ÒÔFunctionIDΪ²ÎÊýµ÷Óà ICorProfilerInfo::GetFunctionInfoÀ´»ñµÃº¯ÊýµÄÐÅÏ¢¡£

·½·¨JITCompilationStartedÊǺÜÓÐȤµÄ£¬ÒòΪËüÔÊÐíÄãÔÚJITed֮ǰ²é¿´¡¢ÐÞ¸ÄIL¡£²é¿´ICorProfilerInfo:: GetILFunctionBodyÀ´»ñµÃϸ½Ú£¬²»ÒªÈÏΪËüºÜÈÝÒס£·½·¨JITCachedFunctionSearchStarted±íʾCLRѰÕÒÒѾ­±»JITed±àÒë³Énative´úÂëµÄº¯Êý¡£Í¨¹ýÉèÖÃÊä³ö²ÎÊýpbUseCachedFunctionΪFALSE£¬Äã¿ÉÒÔÇ¿ÖÆÔËÐÐʱ²»¿¼ÂÇPre-JITdµÄ״̬£¬Ê¹ÓÃ×îеÄJITed°æ±¾¡£

·½·¨JITFunctionPitched±íʾ´ÓÄÚ´æÖÐɾ³ýÒ»¸öÒÔǰJITedµÄ·½·¨¡£Ö»ÓÐÔÚÄÚ´æºÜÉÙµÄÇé¿öÏ£¬²Å»á·¢Éú¡£×îºó·½·¨JITInlining±íʾJITerÒªÄÚÁªº¯Êý¡£Èç¹ûÄãÒª¼ÆËãÄǸö·½·¨µÄenter/leave֪ͨ¸öÊý£¬¿ÉÒÔÉèÖÃÊä³ö²ÎÊýpfShouldInlineΪFALSEÀ´½ûÖ¹ÄÚÁª¡£Ò²¿ÉÒÔͨ¹ý´«µÝ¸øICorProfilerInfo::SetEventMaskµÄÒ»¸ö±êÖ¾À´½ûÖ¹½ø³Ì·¶Î§ÄÚµÄÄÚÁª¡£

Threading

Ï̷߳½·¨Èçͼ3

ThreadCreated

ThreadDestroyed

ThreadAssignedToOSThread

RuntimeSuspendStarted

RuntimeSuspendFinished

RuntimeSuspendAborted

RuntimeResumeStarted

RuntimeResumeFinished

RuntimeThreadSuspended

RuntimeThreadResumed

ThreadCreated/Destroyed·½·¨°üº¬ÁËÏ̵߳ÄÉúÃüÖÜÆÚ¡£ÀýÈ磬¸ÅÄîÉϽ²£¬Ò»¸öCLRÏß³ÌÔÚÆäÉúÃüÖÜÆÚÖпÉÒÔÔËÐÐÔÚ¶à¸öWin32Ïß³ÌÖ®ÉÏ¡£ThreadAssignedToOSThread·½·¨Ö¸Ê¾ÁËCLRÕýÔÚÔËÐÐÔÚÄĸöWin32Ïß³ÌÖ®ÉÏ¡£

              µ±CLRÖ´ÐÐʱ£¬ÓÐʱ±ØÐë¹ÒÆð²¿·Ö»òÕßËùÓеÄÏß³ÌÒÔ±ãÖ´ÐÐÀ¬»øÊÕ¼¯¡£RuntimeSuspend£¬RuntimeResumeϵÁеķ½·¨Ö¸Ê¾CLRÏ̱߳»¹ÒÆð£¨Êµ¼Ê±ÈÕâ¸ü¸´ÔÓ£¬ÎÒÔÚÕâÀﲿÉîÈëϸ½ÚÁË£©¡£´«µÝ¸øRuntimeSuspendStartedµÄÒ»¸ö²ÎÊýָʾÁËÏß³ÌΪʲô±»¹ÒÆð¡£×îºóÁ½¸öRuntimeThread·½·¨Ö¸Ê¾Ò»¸öÏß³ÌÕýÔÚ±»¹ÒÆð£¬²¢ÇÒÄÇ×ÜÔÚʼþRuntimeSuspendÄÚ·¢Éú¡£

COM Interop

            µ±CLRºÍÆÕͨµÄCOM¶ÔÏ󻥲Ù×÷ʱ£¬ÐèÒª´úÀí½Ó¿Ú¡£Á½¸ö·½·¨Ö¸Ê¾´úÀí±»´´½¨¡¢Ïú»Ù¡£´«µÝµ½ÕâÁ½¸öº¯ÊýµÄ²ÎÊýÊÇ.NET ClassID£¬ÏàÓ¦µÄCOM½Ó¿ÚIID£¬Ò»¸öÖ¸Ïò´úÀíµÄÐ麯Êý±í£¬Ð麯Êý±íµÄÏîÊý¡£

Managed/Unmanaged Code Transitions

              µ±ÍйܴúÂëµ÷Ó÷ÇÍйܴúÂ룬»òÕß·ÇÍйܴúÂëµ÷ÓÃÍйܴúÂëʱ£¬º¯ÊýUnmanagedToManagedTransition ¡¢ManagedToUnmanagedTransition±»µ÷Óᣴ«µÝ¸øÃ¿¸ö·½·¨FunctionIDÀ´´ú±íµ÷ÓÃÕߣ¬¿ÉÒÔÀûÓÃËüµ÷ÓÃICorProfilerInfo::GetFunctionInfoÀ´µÃµ½¸ü¶àÐ