#!/usr/sbin/dtrace -Zs #pragma D option quiet #pragma D option switchrate=10 dtrace:::BEGIN { jsFile = "ajax-validation"; JavaMethodBoundary = "doGet"; } *mozilla$1:::js_function-entry /basename(copyinstr(arg0)) == jsFile/ { depth++; jsFEntry[copyinstr(arg2), depth] = vtimestamp; } *mozilla$1:::js_function-return /basename(copyinstr(arg0)) == jsFile/ { @jsFTimes[copyinstr(arg2)] = sum(vtimestamp - jsFEntry[copyinstr(arg2), depth]); depth--; } hotspot$2:::method-entry { self->strPtr = (char *)copyin(arg1, args[2]+1); self->strPtr[(int)args[2]] = '\0'; self->classStr = (string)self->strPtr; self->strPtr = (char *)copyin(arg3, (int)args[4]+1); self->strPtr[(int)args[4]] = '\0'; self->methodStr = (string)self->strPtr; } hotspot$2:::method-entry /JavaMethodBoundary == self->methodStr/ { self->interested = 1; } hotspot$2:::method-entry /self->interested/ { self->depth++; javaFEntry[self->classStr, self->methodStr, self->depth] = vtimestamp; } hotspot$2:::method-return { self->strPtr = (char *)copyin(arg1, args[2]+1); self->strPtr[(int)args[2]] = '\0'; self->classStr = (string)self->strPtr; self->strPtr = (char *)copyin(arg3, (int)args[4]+1); self->strPtr[(int)args[4]] = '\0'; self->methodStr = (string)self->strPtr; } hotspot$2:::method-return /self->interested/ { @javaFTimes[self->classStr, self->methodStr] = sum(vtimestamp - javaFEntry[self->classStr, self->methodStr, self->depth]); self->depth--; } hotspot$2:::method-return /JavaMethodBoundary == self->methodStr/ { self->interested = 0; } END { normalize(@jsFTimes, 1000); normalize(@javaFTimes, 1000); printf("JavaScript Functions\n"); printf("--------------------\n"); printf("%-10s %-25s\n", "inc. time", "Function"); printa("%@-10u %-25s\n", @jsFTimes); printf("\n\n\n"); printf("Java Methods\n"); printf("------------\n"); printf("%-10s %-50s %s\n", "inc. time", "Class", "Method"); printa("%@-10u %-50s %s\n", @javaFTimes); }