public static void clearAllEnableGWData() { TagTimeEntry[] ttes = OpPerfBridge.getAllEnableProfilerData(); for (TagTimeEntry tte : ttes) { tte.clear(); // 如果是流量数据,还要同时reset String key = tte.getName(); NetUtils.clearNetValue(key); } }
public static void saveAllEnableGWData(GWSaveEntry saveEntry) { setLastSaveFolder(saveEntry.path3); String now = GTUtils.getSaveDate(); saveEntry.setNow(now); TagTimeEntry[] ttes = OpPerfBridge.getAllEnableProfilerData(); for (TagTimeEntry tte : ttes) { if (null != tte && tte.getAlias().equals("SM")) { LogUtils.writeGWDataForSM(saveEntry, tte); } else { LogUtils.writeGWData(saveEntry, tte); } } LogUtils.writeGWDesc(saveEntry, ttes); }
public void clearAllCache() { if (started) { return; } startedOnceUntilNotClear = false; if (null != groupMap) { for (GroupTimeEntry gte : groupMap.values()) { for (TagTimeEntry tte : gte.entrys()) { tte.clear(); } gte.clear(); } groupMap.clear(); } }
public void setState(boolean flag) { started = flag; if (flag) { startedOnceUntilNotClear = true; } // GTPref.getGTPref().edit().putBoolean(GTPref.PERF_MASTER_SWITCH, started).commit(); if (!started) { for (GroupTimeEntry gte : groupMap.values()) { for (TagTimeEntry tte : gte.entrys()) { /* * 后面处理注意,这个操作之后如果TagTimeEntry对象收到对应的 * 一条endTime消息,则是上次消费的,需要丢弃, * 即在lastStart==0时,只有收到startTime消息才是开始有效的。 * 同一个线程内,不需要担心乱序、多条的问题 */ tte.setLastStart(0); } } } }
/** 规定不区分线程的tid为0,被测程序的线程号为正数,GT控制台的线程号为负数 */ public void startTime(long tid, String group, String tag, int exKey, long start, int funcId) { if (null != group && null != tag) { GroupTimeEntry groupEntry = groupMap.get(group); if (null == groupEntry) { groupEntry = new GroupTimeEntry(group); lock.lock(); groupMap.put(group, groupEntry); lock.unlock(); } // 从Group中取出由tag, tid, exKey共同标示的TagTimeEntry对象 TagTimeEntry tagEntry = groupEntry.getThreadEntry(tag, tid, exKey); if (null == tagEntry) { tagEntry = new TagTimeEntry(groupEntry); tagEntry.setName(tag); tagEntry.setTid(tid); tagEntry.setExkey(exKey); /* * funcId用的是PERF_START_TIME_GLOBAL或PERF_START_DIGITAL_GLOBAL * 对于后面的使用只是保证UI精度,不会做其他依赖funcId的逻辑计算 */ tagEntry.setFunctionId(funcId); groupEntry.addEntry(tagEntry); } tagEntry.setLastStart(start); } }
/** 记录单点的性能数据(start和end这种成对的称为双点性能数据),也按tid区分全局的还是线程的 */ public void recordDigital(long tid, String group, String tag, long[] datas, int funcId) { if (!started) { return; } if (null != group && null != tag) { GroupTimeEntry groupEntry = groupMap.get(group); if (null == groupEntry) { groupEntry = new GroupTimeEntry(group); lock.lock(); groupMap.put(group, groupEntry); lock.unlock(); } // 从Group中取出由tag, tid共同标示的统计对象(exKey无用) TagTimeEntry staticsTagTimeEntry = groupEntry.getStaticsEntry(tag, tid); if (null == staticsTagTimeEntry) { staticsTagTimeEntry = new TagTimeEntry(groupEntry); staticsTagTimeEntry.setName(tag); staticsTagTimeEntry.setTid(tid); staticsTagTimeEntry.setFunctionId(funcId); staticsTagTimeEntry.initChildren(datas.length - 1); groupEntry.addStaticsEntry(staticsTagTimeEntry); } if (Functions.PERF_DIGITAL_MULT == funcId || Functions.PERF_DIGITAL_MULT_MEM == funcId) { TagTimeEntry[] subEntrys = staticsTagTimeEntry.getSubTagEntrys(); for (int i = 0; i < subEntrys.length; i++) { TagTimeEntry subEntry = subEntrys[i]; subEntry.add(datas[i]); } staticsTagTimeEntry.add(datas[0]); // TODO 得记录一个维度的值,否则外面UI无法展示 } else { staticsTagTimeEntry.add(datas[0]); } } }
public long endTime(long tid, String group, String tag, int exKey, long end, int funcId) { if (null != group && null != tag) { GroupTimeEntry groupEntry = null; TagTimeEntry tagEntry = null; if (null == groupMap.get(group)) { return -1; } groupEntry = groupMap.get(group); if (null == groupEntry) { return -1; } tagEntry = groupEntry.getThreadEntry(tag, tid, exKey); if (null == tagEntry) { return -1; } if (tagEntry.getLastStart() <= 0) { return -1; } long reduce = end - tagEntry.getLastStart(); tagEntry.setLastStart(0); if (started) { // 在对应的统计对象中加入差值,注意统计值是不关注exKey的 TagTimeEntry staticsTagTimeEntry = groupEntry.getStaticsEntry(tag, tid); staticsTagTimeEntry.add(reduce); } return reduce; } return -1; }