样本剖析报告的动态计算的制作方法

文档序号:2671283阅读:254来源:国知局
专利名称:样本剖析报告的动态计算的制作方法
技术领域
本发明涉及计算机应用,尤其涉及样本剖析报告的动态计算。
背景技术
软件剖析涉及记录软件程序正在做什么并将结果呈现给用户,使得用户理解程序的各部分花费了多少执行时间。一种剖析机制被称为“采样”,其中在整个程序的执行中以周期性间隔对程序的调用栈进行采样。调用栈标识程序所处于的当前功能以及导致当前功能被调用的功能调用链(从主程序开始),调用栈中的每一级表示一功能调用。有时,调用栈可以是十几级或甚至数百级深。例如,如果调用栈是每毫秒采样的,并且执行时间是300 秒,则将有300,000个调用栈样本,每一调用栈可能相当大。由此,所记录的采样的数据可以相当庞大,涉及每一个所采样的调用栈的线性序列。在多线程应用中,这一采样对每一线程发生。为将所记录的数据呈现给用户一特定时间段,对于与该时间段对应的各调用栈, 呈现程序逐一访问每一个所采样的调用栈。随着呈现程序这样做,它响应性地创建了调用栈树,该树中的每一节点表示程序的一功能并且根节点表示主程序。当遇到唯一的调用栈时,树通过将带有树中适当祖先链的表示该功能的节点添加到树中来扩充,使得随着沿祖先链进行至根节点、以适当次序遇到调用栈中所有功能。随后,随着遇到非唯一的调用栈, 与适当的调用栈节点相关联的计数器递增。该时间段所有的调用栈被计数之后,向用户呈现适当的用户界面,从而给予用户对于在该给定时间段程序的哪些部分花费了多少时间的概念。高级剖析应用允许用户改变所评估的时间段,从而导致采样至新时间段的调用栈被再次计数,由此调整向用户的呈现。

发明内容
本文所描述的至少一个实施例涉及对表示程序的执行时间的分层时间树的构造或使用。为构造分层时间树,与根节点对应的时间帧是期间调用栈样本从程序中被收集的执行时间。在根节点处开始且递归地进行,每一节点随后以在给定时间段所有调用栈无需被访问的方式来填充,以便提供与该给定时间段有关的报告。本发明内容并非旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。


为了描述可以获得上面所列举的及其他优点和特征的方式,下面将参考附图来呈现对各实施例的更具体的描述。可以理解,这些附图只描绘了样本实施例,并且因此不被认为是对其范围的限制,将通过使用附图并利用附加属性和细节来描述和解释各实施例,在附图中
图1示出可用于采用此处所描述的各实施例的示例计算系统;图2示出用于构造表示程序的执行时间的分层时间树的方法的流程图;图3示出可使用图2的方法来构造的示例分层时间树;图4示出用于构造表示程序的执行时间的分层时间树的更具体的方法的流程图, 并且是图2的方法的一个示例;图5示出用于使用时间树结构以便构造与在给定的执行时间间隔所获得的调用栈样本有关的报告的方法的流程图;以及图6示出表示图5的方法的一个示例的更具体的方法的流程图。
具体实施例方式根据本文所描述的各实施例,描述了对表示程序的执行时间的分层时间树的构造或使用。为构造分层时间树,与根节点对应的时间帧是期间多个调用栈样本从程序中被收集的执行时间。在根节点处开始且递归地继续,每一节点随后以在给定时间段所有调用栈无需被访问的方式来填充,以便提供与该给定时间段有关的报告。首先,将参考图1来描述关于计算系统的某些介绍性讨论。随后,对分层时间树的构造和使用的实施例将参考图2 至图6来描述。首先,参考图1来描述关于计算系统的介绍性讨论。计算系统现在越来越多地采取多种多样的形式。计算系统可以例如是手持式设备、电器、膝上型计算机、台式计算机、大型机、分布式计算系统,或者甚至通常不被视为计算系统的设备。在本说明书以及权利要求书中,术语“计算系统”被广义地定义为包括包含至少一个处理器以及其上能含有可由处理器执行的计算机可执行指令的存储器的任何设备或系统(或其组合)。存储器可以采取任何形式,并可以取决于计算系统的特性和形式。计算系统可以分布在网络环境中,并可包括多个组分计算系统。如图1所示,在其最基本的配置中,计算系统100通常包括至少一个处理单元102 和存储器104。存储器104可以是物理系统存储器,该物理系统存储器可以是易失性、非易失性、或两者的某种组合。术语“存储器”在此也可用来指诸如物理存储介质等非易失性大容量存储。如果计算系统是分布式的,则处理、存储器和/或存储能力也可以是分布式的。 如此处所使用的那样,术语“模块”或“组件”可以指在计算系统上执行的软件对象或例程。 此处所描述的不同组件、模块、引擎,以及服务可以实现为在计算系统上执行的对象或进程 (例如,作为分开的线程)。在随后的描述中,参考由一个或多个计算系统执行的动作描述了各实施例。如果这样的动作是以软件实现的,则执行动作的相关联计算系统的一个或多个处理器响应于已经执行了计算机可执行指令来引导计算系统的操作。这样的操作的示例涉及对数据的操纵。计算机可执行指令(以及被操纵的数据)可以存储在计算系统100的存储器104中。 计算系统100还可包括可用于提供诸如此处所描述的用户界面之类的各种具体用户界面的显示器112。计算系统100还可包含允许计算系统100例如通过网络110与其他消息处理器通信的通信信道108。本发明的各实施例可包括或利用包括诸如例如,一个或多个处理器和系统存储器之类的计算机硬件的专用或通用计算机,如以下更详细讨论的。本发明范围内的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。 这些计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。因而,作为示例而非限制,本发明的各实施例可包括至少两种完全不同的计算机可读介质计算机存储介质和传输介质。计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。“网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链接。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于承载计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链接。上述的组合也应被包括在计算机可读介质的范围内。此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链接接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”) 内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在同样(或甚至主要)利用传输介质的计算机系统组件中。计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链接、无线数据链接,或者通过硬连线和无线数据链接的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备中。程序的各组件在程序的执行过程期间通过放置对彼此的功能调用来交互。为管理对程序的适当操作,操作系统维护跟踪哪个序列的功能调用已导致当前组件被执行的调用栈。当功能调用被放置时,级被压到栈上,由此在概念上留下面包屑,使得当功能在程序下完成其工作时程序知道返回到哪里。随着程序执行,调用栈将改变以反映程序执行的当前状态在哪里。在复杂程序中,调用栈在字面上可以是数百级深。常规剖析技术在周期性基础上对调用栈采样,从而生成大的调用栈集合。调用栈树生成过程随后遍历所有的调用栈样本以生成调用栈树。调用栈树以表示主程序的根节点开始。当调用栈反映主程序调用一功能时,新节点被添加到调用栈树以反映该功能调用。当所有调用栈样本已经被评估时,结果是表示所有调用栈的复杂调用栈树,其中,每一调用栈类型可通过从任何给定节点沿祖先链向上遍历至根节点来重新构造。调用栈树中的每一节点由此与唯一的调用栈类型对应,该调用栈类型至少在程序的执行内是唯一的。为了帮助此处所描述的至少某些实施例,每一调用栈类型可被分配一个唯一标识符,以允许小得多的唯一标识符被使用,而不是对每一调用栈类型的更完整的表示。此处所描述的原理允许以伸缩良好的有效方式来评估调用栈集合,由此允许剖析报告被快速地生成并且具有可接受的准确性。在一个实施例中,这通过使用分层时间树来完成。分层时间树是新的且唯一的,并且不会与以上描述的常规的调用栈树混淆。图2示出用于构造表示程序的执行时间的分层时间树的方法200的流程图。分层时间树将被用于有效地评估并编译从调用栈样本中收集的信息。分层时间树包括表示程序的执行时间的根节点。在一个实施例中,根节点表示程序的整个执行时间。根节点具有零个或更多子节点(child node) 0对于分层时间树中的任何节点,与父节点对应的各子节点各自具有时间间隔,当这些时间间隔放在一起时表示与父亲相同的时间间隔。例如,假设根节点具有在时间=0毫秒开始并且在时间=1000毫秒结束的时间间隔(即,被表达为w,1000])。现在假设根节点具有四个子节点,即节点A、节点B、节点C和节点D。节点A可能具有从时间=0毫秒至时间=250毫秒的时间间隔(例如
) 0 节点B可能具有从时间=250毫秒至时间=500毫秒的时间间隔,即[250, 500] 0节点C可能具有从时间=500毫秒至时间=750毫秒的时间间隔[500,750]。节点D可能具有从时间=750毫秒至时间=1000毫秒的时间间隔[750,1000]。同样,具有间隔
的节点 A可能有五个孩子,这五个孩子具有时间间隔
, [50,100]、[100,150]、[150,200]以及[200,250]ο方法200包括对分层时间树的构造(动作201)以及填充(动作202)。在一个实施例中,不是所有的调用栈样本都被包括在被填充在分层时间树中的信息内。例如,对于较少发生的调用栈中的某些的调用栈样本可能被忽略,以允许该过程更为高效。在认识到采样本身并不采用完美的准确性的概念时,忽略较少发生的某些调用栈可能是可接受的,因为样本发生在程序执行的随机时刻。使用样本报告的总体原因是要找出对执行时间的重要部分负责的各功能和/或调用栈,而不是捕获某些微小影响。在一个实施例中,对于分层时间树的每一叶子节点(leaf node),在与该叶子节点对应的时间帧中采样的各调用栈的至少某一些可被包括作为该叶子节点的一部分。在一个示例中,叶子节点可完整地包括调用栈样本。在另一示例中,可能只有与调用栈相关联的唯一标识符与叶子节点一起被标识。在一个实施例中,对于分层时间树的每一非叶子节点,非叶子节点表示至少某些在与非叶子节点对应的时间帧中采样的唯一调用栈,以及对于在与非叶子节点对应的该时间帧中遇到每一个唯一调用栈的次数的计数。各唯一调用栈可使用唯一调用栈标识符来标识。在随后的示例中,分层时间树在构造时被填充。由此,图2的动作201和动作202 基本上同时执行,或至少以交错方式来执行。例如,可遵循以下过程以便构造和填充分层时间树。
首先,根节点被分配程序的执行时间间隔的对应间隔。在一个实施例中,根节点表示程序的整个执行时间段。图3表示示例分层时间树300。在这一示例中,根节点301与时间间隔
(即0至1000毫秒)对应。随后,图4的方法400递归地应用于分层时间树中的每一节点。此时,只有分层树的根节点存在。然而,方法400将导致其他子节点被添加。如果经受该方法的节点的当前间隔包含小于M个调用栈样本(其中M为可配置的某一整数)(在判定框401中“是”),则当前节点被指定为叶子节点(动作411),并且当前节点用所有调用栈样本来填充(动作412),以及如果分层时间树中存在要填充的其他节点 (在判定框413中“是”),则方法400对分层时间树中的下一节点递归地执行(动作414), 或者如果分层时间树中不存在其他要填充的节点(在判定框413中“否”),则递归结束(动作 415)。将这一方法400应用于时间树300的根节点,假设“M”为100。现在假设在间隔
中存在不止100个调用栈样本。在该情况下(在判定框401中“否”),则采取通过方法400的不同处理路径,并且该节点被指定为非叶子节点(动作421)。与该当前间隔对应的各调用栈类型通过其计数器来排序(动作42 ,最频繁发生的调用栈类型出现在列表的顶部。随后,较频繁发生的调用栈类型自顶向下地被选择,直到该时间段调用栈总数的某一百分比P被选择(动作423)。随后,间隔被细分成N个子间隔(其中N为整数),并且对于每一细分的间隔创建新的子节点(动作424)。方法400随后对下一节点递归地执行方法400(动作414)。将这应用于图3的根节点301,该根节点被指定为非叶子节点(动作421),并且与该间隔对应的调用栈类型随后通过其计数器来排序(动作42 。例如,假设在间隔
中存在330个调用栈样本,并且当通过计数器来排序时,这些调用栈样本包括以下列表调用栈类型计数器A113
B75
C46
D25
E24
F19
G13
H9
I6 由此,存在9个不同类型的调用栈A至I,总共330个调用栈样本。调用栈样本类型从该列表的顶部被选择,直到通过包括对于仅在非叶子节点中的那些顶部调用栈类型的统计量来考虑至少95% (其中在这一情况下P = 95%)的调用栈样本(动作423)。例如,这可能包括使用一对该调用栈类型的唯一标识符结合其对于该间隔的计数器。95%阈值在调用栈类型A至G被选择时发生。较少发生的调用栈类型H和I从报告中被丢弃。间隔W, 1000]随后被分成两个(其中在这一情况下N=幻子间隔,并且新的子节点被创建并且与每一子间隔相关(动作424)。在这一情况下,子间隔为
和[500,1000],尽管不要求对各间隔的相等细分。节点311与间隔
相关,并且节点312与间隔[500,1000] 相关。方法400随后移至下一节点(在该示例中即节点311)。将方法400应用于图3的节点311,间隔W,500]内的调用栈数量为216,该数量是至少100(在判定框401中“否”)。由此节点311被指定为非叶子节点(动作421),并且与该间隔对应的调用栈类型随后通过其计数器来排序(动作42幻。作为示例,假设在通过计数器排序之后,生成以下列表调用栈类型计数器A72B44C35E21D20F14G10由此,存在7个不同类型的调用栈A至G,总共216个调用栈样本。调用栈样本类型从该列表的顶部被选择,直到通过包括对于仅在非叶子节点中的那些调用栈类型的统计量来考虑至少95%的调用栈样本(动作42;3)。例如,这可能包括使用一对该调用栈类型的唯一标识符结合其对于该间隔的计数器。95%阈值在调用栈类型A至F被选择时发生。较少发生的调用栈类型G从报告中被丢弃。间隔
随后被分成两个子间隔,并且新的子节点被创建并且与每一子间隔相关(动作424)。在这一情况下,子间隔为
和[250, 500]。节点321与间隔
相关,并且节点322与间隔[250,500]相关。方法400随后移至下一节点(在该示例中即321,尽管取决于递归的方法它可以是节点312)。将方法400应用于图3的节点321,间隔
内的调用栈数量为90,这在100 阈值以下(在判定框401中“是”)。由此节点321被指定为叶子节点(动作411),并且用与间隔
对应的所有调用栈来填充(动作412)。图3中使用星号来示出被指定为叶子节点的那些节点。存在要评估的其他节点(在判定框413中“是”),并且由此方法400 被应用于下一节点(动作414)。在这一递归类型中,下一节点为节点322。将方法400应用于图3的节点322,间隔[250,500]内的调用栈数量为116,该数量是至少100(在判定框401中“否”)。由此节点322被指定为非叶子节点(动作421),并且与该间隔对应的调用栈类型随后通过其计数器来排序(动作42 。作为示例,假设在通过计数器排序之后,生成以下列表调用栈类型计数器A40B26C25E15D9F1
由此,存在6个不同类型的调用栈A至F,总共116个调用栈样本。调用栈样本类型从该列表的顶部被选择,直到通过包括对于仅在非叶子节点中的那些调用栈类型的统计量来考虑至少95%的调用栈样本(动作42;3)。例如,这可能包括使用一对该调用栈类型的唯一标识符结合其对于该间隔的计数器。95%阈值在调用栈类型A至E被选择时发生。较少发生的调用栈类型F从报告中被丢弃。间隔[250,500]随后被分成两个子间隔,并且新的子节点被创建并且与每一子间隔相关(动作424)。在这一情况下,子间隔为[250,375] 和[375,500]。节点331与间隔[250,375]相关,并且节点332与间隔[375,500]相关。方法400随后移至下一节点(在该递归示例中即节点331)。将方法400应用于图3的节点331,间隔[250,375]内的调用栈数量为45,这在 100阈值以下(在判定框401中“是”)。由此节点331被指定为叶子节点(动作411),并且用与间隔[250,375]对应的所有调用栈来填充(动作412)。存在要评估的其他节点(在判定框413中“是”),并且由此方法400被应用于下一节点(动作414)。在这一递归类型中,下一节点为节点332。将方法400应用于图3的节点332,间隔[375,500]内的调用栈数量为70,这在 100阈值以下(在判定框401中“是”)。由此节点332被指定为叶子节点(动作411),并且用与间隔[375,500]对应的所有调用栈来填充(动作412)。存在要评估的其他节点(在判定框413中“是”),并且由此方法400被应用于下一节点(动作414)。在这一递归类型中,下一节点为节点312。将方法400应用于图3的节点312,间隔[500,1000]内的调用栈数量为99,这在 100阈值以下(在判定框401中“是”)。由此节点312被指定为叶子节点(动作411),并且用与间隔[500,1000]对应的所有调用栈来填充(动作412)。没有其他节点要评估(在判定框413中“否”),并且由此时间树现在被完全生成并填充(动作415)。图5示出用于使用时间树结构以便构造与在给定的执行时间间隔所获得的调用栈样本有关的报告的方法的流程图。首先,访问分层时间树(动作501),并且随后使用该时间树来构造与所收集的调用栈样本有关的报告,而无需分开地访问所有调用栈样本。图6示出用于使用时间树来构造这样的报告的方法600的流程图。以根节点开始来执行方法600。作为示例,方法600将被应用于图3中示出的示例时间树300。处理取决于以下各项而有所不同(参见判定框601)给定时间间隔是否1)与正被评估的节点的时间间隔根本不相交(在判定框601中“否”),2)与该节点的时间间隔完全相交(在判定框 601中“完全包括”),或幻仅与该节点的时间间隔部分地相交(在判定框601中“部分包括”)。现在将提供若干示例以示出方法600的所有处理路径。首先,假设用户想要查看间隔[700,1000]的报告。方法600首先针对根节点301 来评估。间隔[700,1000]与时间间隔W,1000]仅部分地相交(在判定框601中“部分包括”)。根节点301不是叶子节点(在判定框604中“否”),并且由此根节点的各子节点(即第一代子节点)随后被评估。方法600随后针对节点311来评估。间隔[700,1000]与时间间隔
完全不相交(在判定框601中“否”)。处理由此前进至各第一代子节点中的下一节点312。方法600随后针对节点312来评估。间隔[700,1000]与节点312的间隔[500, 1000]仅部分地相交(在判定框601中“部分包括”)。此外,节点312为叶子节点(在判定框604中“是”)。由此,该方法枚举指定时间间隔[700,1000]内的叶子节点的调用栈样本,由此完成该方法。不必评估第二代子节点321,因为在评估第一代子节点311时没有遇到动作605。仅在评估根节点时遇到动作605。注意,其中只有各调用栈被访问的枚举是针对节点312的,这些枚举仅包括99个调用栈。现在假设用户想要获取间隔
的报告。该方法首先针对根节点301来评估。 再一次,间隔[700,1000]与时间间隔W,1000]仅部分地相交(在判定框601中“部分包括”)。根节点不是叶子节点(在判定框604中“否”),并且由此根节点的各子节点(即第一代子节点)随后被评估。方法600随后针对节点311来评估。间隔
与时间间隔
完全相交 (在判定框601中“完全包括”)。随后,对这一节点的统计量由此被合并到结果中(动作 603)。例如,在该示例中回想,对于节点311的统计量包括以下调用栈类型计数器A72B44C35E21D20F14各调用栈中的每一调用栈的这些数量随后相对于先前已枚举的这些相同的调用类型的任何计数器来计数。在这一情况下,各个的先前计数为零,并且由此未来计数以这些数量开始。该过程随后移至这一代中的下一节点。在这一情况下,下一节点会是节点312。方法600随后针对节点312来评估。间隔
与节点312的间隔[500,1000] 仅部分地相交(在判定框601中“部分包括”)。此外,节点312为叶子节点(在判定框604 中“是”)。由此,该方法枚举指定时间间隔[500,700]内的叶子节点的调用栈样本,由此完成该方法。同样,不必评估第二代子节点321,因为在评估第一代子节点311时没有遇到动作605。注意,其中只有各调用栈被访问的枚举是针对节点312的,这些枚举仅包括99个调用栈。现在提供对于间隔[300,700]的最后一个示例。该方法首先针对根节点301来评估。再一次,间隔[300,700]与时间间隔W,1000]仅部分地相交(在判定框601中“部分包括”)。根节点不是叶子节点(在判定框604中“否”),并且由此根节点的各子节点(即第一代子节点)随后被评估。在这一示例中将遇到某一递归。该方法随后针对节点311来评估。间隔[300,700]与时间间隔
仅部分地相交(在判定框601中“部分包括”)。节点311不是叶子节点(在判定框604中“否”), 并且由此节点311的各子节点(即第二代子节点321和32 随后被评估。通过递归,节点 312最终被将评估,当在这一类型的递归示例中,第二代节点321是要评估的下一节点。方法600随后针对节点321来评估。间隔[300,700]与时间间隔
完全不相交(在判定框601中“否”)。处理由此前进至各第二代子节点中的下一节点322(动作 602)。方法600随后针对节点322来评估。间隔[300,700]与时间间隔[250,500]仅部分地相交(在判定框601中“部分包括”)。节点322不是叶子节点(在判定框604中 “否”),并且由此节点322的各子节点(即第三代子节点331和33 随后被评估。方法600随后针对节点331来评估。间隔[300,700]与节点331的间隔[250,375] 仅部分地相交(在判定框601中“部分包括”)。此外,节点331为叶子节点(在判定框604 中“是”)。由此,该方法枚举指定时间间隔[300,375]内的叶子节点的调用栈样本。过程随后前进至第三代节点332。方法600随后针对节点332来评估。间隔[300,700]与节点312的间隔[375,500] 完整地相交(在判定框601中“完全包括”)。对于节点332的统计量最后与结果合并。在一个示例中,这可通过执行对节点332中70个调用栈的每一调用栈类型的计数来执行。另选地,对节点332可能已经预先计算了统计量(S卩,对调用栈的每一类型的计数),在该情况下,在结果中可使用这些统计量,而无需访问与时间间隔[375,500]对应的每一个别调用栈。这完成了对第三代子节点331和332、以及对第二代子节点321和322的处理。通过递归,处理随后前进至节点312来进行评估。方法600随后针对节点312来评估。间隔[300,700]与节点312的间隔[500, 1000]仅部分地相交(在判定框601中“部分包括”)。此外,节点312为叶子节点(在判定框604中“是”)。由此,该方法枚举指定时间间隔[500,700]内的叶子节点的调用栈样本。 处理由此完成。这一方法具有多个效率优点。最重要的是,需要从调用栈文件读取的数据量与我们逐一读取所有栈的情况相比显著更低。在某些情况下,对于具有被完整地包含在感兴趣的时间间隔内的一时间间隔的节点的统计量,统计量可被快速地合并。第二,合并的树和寻找的量受到其对数的限制。第三,合并的各个栈的量受到其在节点中的有限数量(M)的限制。因此,本文所描述的原理准许基于在程序的执行期间所收集的经采样的调用栈来对报告进行可伸缩和动态的生成。本发明可被具体化为其他具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变都被权利要求书的范围所涵盖。
权利要求
1.一种包括在其上具有计算机可执行指令的一个或多个计算机存储介质的计算机程序产品,当所述计算机可执行指令由计算系统的一个或多个处理器执行时,使得所述计算系统执行以下动作构造表示程序的执行时间的分层时间树的动作,所述程序被执行以获取多个调用栈样本,其中所述分层时间树包括多个节点,每一节点与一执行时间间隔对应;以及用来自所述多个调用栈样本的信息来填充所述分层时间树的动作。
2.如权利要求1所述的计算机程序产品,其特征在于,所述多个调用样本中的至少某些不被包括在填充到所述分层时间树中的信息中。
3.如权利要求1所述的计算机程序产品,其特征在于,所述填充动作包括对于所述分层时间树的每一叶子节点,表示至少某些在与所述叶子节点对应的时间帧中所采样的调用栈。
4.如权利要求3所述的计算机程序产品,其特征在于,对于所述叶子节点中的至少某些,在该叶子节点中的各调用栈中的每一个调用栈被表示为原始调用栈数据。
5.如权利要求3所述的计算机程序产品,其特征在于,所述填充动作还包括对于所述分层时间树的每一非叶子节点,表示至少某些在与所述非叶子节点对应的时间帧中所采样的唯一调用栈,以及对于在与所述非叶子节点对应的所述时间帧中遇到每一个唯一调用栈的次数的计数。
6.如权利要求5所述的计算机程序产品,其特征在于,对于所述叶子节点中的至少某些,在该叶子节点中的各调用栈中的每一个调用栈使用调用栈标识符来呈现。
7.如权利要求1所述的计算机程序产品,其特征在于,对于所述非叶子节点中的至少某些,所述唯一调用栈中的至少某些表示在与所述叶子节点对应的时间间隔中所有调用栈的至少一预定百分比。
8.如权利要求7所述的计算机程序产品,其特征在于,所述预定百分比是可配置的。
9.如权利要求7所述的计算机程序产品,其特征在于,所述预定百分比是至少百分之 80或更多,但小于百分之100。
10.如权利要求7所述的计算机程序产品,其特征在于,所述预定百分比是至少百分之 90或更多,但小于百分之100。
11.如权利要求7所述的计算机程序产品,其特征在于,所述构造分层时间树的动作以及所述填充所述分层时间树的动作基本上同时执行。
12.如权利要求7所述的计算机程序产品,其特征在于,所述构造分层时间树的动作以及所述填充所述分层时间树的动作通过执行以下动作来执行将与所述分层时间树中的根节点对应的时间帧设置成期间所述多个调用栈样本被收集的整个执行时间的动作。
13.如权利要求12所述的计算机程序产品,其特征在于,所述计算机可执行指令还使得所述计算系统执行以下动作执行以所述时间树的根节点开始并继续到所述时间树的每一节点的以下各项的动作如果当前节点的时间间隔包含小于特定数量的调用栈样本,则所述当前节点为叶子节点,并且所述叶子节点用在所述时间间隔中所采样的调用栈样本来填充;如果所述当前节点的时间间隔包含至少特定数量的样本,则所述当前节点为非叶子节点,并且所述非叶子节点用在与所述当前节点对应的时间间隔中的调用栈中的至少某些有关的经编译的调用栈频率数据来填充,所述时间间隔被细分成多个子时间段,并且相同数量的子节点被创建,各自与所述子时间段中的一个相对应。
14.一种包括在其上具有计算机可执行指令的一个或多个计算机存储介质的计算机程序产品,当所述计算机可执行指令由计算系统的一个或多个处理器执行时,使得所述计算系统执行以下动作访问表示程序的执行时间的分层时间树的动作,所述程序被执行以获取多个调用栈样本,其中所述分层时间树包括多个经填充的节点,每一个经填充的节点与一执行时间帧对应,并且响应于所述程序的执行时间内的指定时间间隔;以及使用所述分层时间树来构造与所述多个调用栈样本有关的报告而无需分开地访问所有所述多个调用栈样本的动作。
15.如权利要求14所述的计算机程序产品,其特征在于,使用所述分层时间树来构造所述报告的动作包括对于所述分层时间树中的至少第一代子节点,对于具有与所述指定时间间隔不相交的时间间隔的任何子节点,忽略该子节点的动作;以及对于具有完整地包含在所述指定时间间隔内的时间间隔的任何子节点,合并来自该子节点的所有原始栈样本数据的动作;
16.如权利要求15所述的计算机程序产品,其特征在于,使用所述分层时间树来构造所述报告的动作还包括对于所述分层时间树中的至少第一代子节点中的每一个的以下动作对于作为所述分层时间树中的叶子节点且具有仅部分包含在所述指定时间间隔内的一时间间隔的任何子节点,枚举在所述指定时间间隔内的所述叶子节点的调用栈样本的动作。
17.如权利要求16所述的计算机程序产品,其特征在于,使用所述分层时间树来构造所述报告的动作还包括对于所述分层时间树中的至少第一代子节点中的每一个的以下动作对于作为所述分层时间树中的非叶子节点且具有仅部分包含在所述指定时间间隔内的一时间间隔的任何子节点,枚举下一代子节点并且将相同方法应用于所述非叶子节点的下一代子节点中的每一个的动作。
18.如权利要求15所述的计算机程序产品,其特征在于,使用所述分层时间树来构造所述报告的动作还包括对于所述分层时间树中的至少第一代子节点中的每一个的以下动作对于作为所述分层时间树中的非叶子节点且具有仅部分包含在所述指定时间间隔内的一时间间隔的任何子节点,枚举下一代子节点并且将相同方法应用于所述非叶子节点的下一代子节点中的每一个的动作。
19.一种用于构造以及填充表示程序的执行时间的分层时间树的方法,所述程序被执行以获取多个调用栈样本,其中所述分层时间树包括多个节点,每一节点与一执行时间间隔对应将与所述分层时间树中的根节点对应的时间帧设置成期间所述多个调用栈样本被收集的整个执行时间的动作;以及执行以所述时间树的根节点开始并通过所述时间树的每一节点继续的以下各项的动作如果当前节点的时间间隔包含小于特定数量的调用栈样本,则所述当前节点为叶子节点,并且所述叶子节点用在所述时间间隔中所采样的调用栈样本来填充;以及如果所述当前节点的时间间隔包含至少特定数量的样本,则所述当前节点为非叶子节点,并且所述非叶子节点用在与所述当前节点对应的时间间隔中的调用栈中的至少某些有关的经编译的调用栈频率数据来填充,所述时间间隔被细分成多个子时间段,并且相同数量的子节点被创建,各自与所述子时间段中的一个相对应。
20.如权利要求19所述的方法,其特征在于,还包括 访问所述分层树的动作;以及使用所述分层时间树来构造与所述多个调用栈样本有关的报告而无需分开地访问所有所述多个调用栈样本的动作。
全文摘要
本发明公开了样本剖析报告的动态计算。对表示程序的执行时间的分层时间树的构造或使用。为构造分层时间树,与根节点对应的时间帧是期间多个调用栈样本从程序中被收集的执行时间。在根节点处开始且递归地进行,每一节点随后以在给定时间段所有调用栈无需被访问的方式来填充,以便提供与该给定时间段有关的报告。
文档编号G06F11/36GK102385552SQ20111025395
公开日2012年3月21日 申请日期2011年8月24日 优先权日2010年8月25日
发明者A·达迪欧莫夫, M·阿加瓦尔, 季新华 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1