Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

An improved version of the implementation method of the performance Statistics of the Cumberbatch + function under AIX

2025-01-19 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Servers >

Share

Shulou(Shulou.com)06/02 Report--

上一篇实现,是统计了每一次函数调用的层次关系和耗时。如果在函数调用比较多的情况下,更关心的是减少输出,只需要总计的耗时即可。另外如果是后台程序,输出到文件会更好。

因此,对程序做了改进。当设置TRACELOG环境变量,则输出到这个环境变量指定的文件中。如果设置了DETAILF,则会输出调用层次关系和每一次的耗时,否则只输出总计时间。

tr.cpp改进后的程序如下。

#include

#include

#include

#include

#include

#include

using std::vector;

using std::map;

using std::string;

using std::clog;

using std::endl;

using std::ofstream;

using std::ostream;

extern "C" void print_trace(const char * const procname);

struct Stat

{

int lvl;

string name;

long stm;

long etm;

long oitv;

Stat(int l, const string& s, long st) : lvl(l), name(s), stm(st), etm(0), oitv(0) {}

};

struct Sum

{

int cnt;

long itv;

Sum() : cnt(0), itv(0) {}

Sum operator+=(long i)

{

++cnt;

itv+=i;

return *this;

}

};

namespace

{

vector tracev;

map itvm;

int clvl = 0;

bool detailf = (getenv("DETAILF")!=NULL);

}

extern "C" void

__func_trace_enter(const char * const proc_name,

const char * const file_name,

const int line_no,

void ** const id)

{

// printf("{ %s (%s:%d) %p %s\n", proc_name, file_name, line_no, id[0], (char*)*id);

struct timeval nowtm;

gettimeofday(&nowtm, NULL);

++clvl;

tracev.push_back(Stat(clvl, string(proc_name)+"() : "+file_name, nowtm.tv_sec * 1000000 + nowtm.tv_usec));

}

extern "C" void

__func_trace_exit(const char * const proc_name,

const char * const file_name,

const int line_no,

void ** const id)

{

// printf("} %s (%s:%d) %p %s\n", proc_name, file_name, line_no, id[0], (char*)*id);

struct timeval nowtm;

int itv;

gettimeofday(&nowtm, NULL);

auto iter = tracev.end() - 1;

while (iter->etm != 0)

--iter;

iter->etm = nowtm.tv_sec * 1000000 + nowtm.tv_usec;

itv = iter->etm - iter->stm - iter->oitv;

itvm[proc_name]+=itv;

for (auto s = tracev.begin(); s!=iter; ++s)

{

if (s->etm == 0)

s->oitv += itv;

}

--clvl;

if (!detailf)

tracev.erase(iter, tracev.end());

if (clvl == 0)

{

print_trace(proc_name);

tracev.clear();itvm.clear();}

}

extern "C" void print_trace(const char * const procname)

{

time_t t;

char buf[30];

ofstream logf(getenv("TRACELOG"), std::ios::app);

ostream &log = logf ? logf : clog;

if (detailf)

{

log

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Servers

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report