#include "global.h"
#ifdef OPCPROF
#include "lang.h"
#include "lex.h"
#include "instrs.h"
#if 0
int get_time_since_last_time()
{
static long u_secs,u_usec;
static long s_secs,s_usec;
struct rusage rus;
int t;
if (getrusage(RUSAGE_SELF, &rus) < 0) return 0;
t= (rus.ru_utime.tv_sec-u_secs)*1000000 + rus.ru_utime.tv_usec-u_usec;
t+=(rus.ru_stime.tv_sec-s_secs)*1000000 + rus.ru_stime.tv_usec-s_usec;
u_secs= rus.ru_utime.tv_sec;
u_usec= rus.ru_utime.tv_usec;
s_secs= rus.ru_stime.tv_sec;
s_usec= rus.ru_stime.tv_usec
return t;
}
#else
long get_time_since_last_time()
{
static long last_time;
long t,tt;
t=clock();
tt=t-last_time;
last_time=t;
return tt;
}
#endif
void add_compiled(int instr)
{
if(instr>=0 && instr<F_MAX_OPCODE-F_OFFSET)
instrs[instr].compiled++;
}
int get_cost_since_last_time()
{
extern int eval_cost;
static long last_cost;
int t;
t=eval_cost-last_cost;
last_cost=eval_cost;
return t;
}
void check_cost_for_instr(int instr)
{
static int last_instr;
if(instr>=0 && instr<=F_MAX_INSTR-F_OFFSET)
{
if(last_instr>=0 && last_instr<=F_MAX_INSTR-F_OFFSET)
{
instrs[last_instr].used++;
instrs[last_instr].avg_time+=get_time_since_last_time();
instrs[last_instr].avg_cost+=get_cost_since_last_time();
}
last_instr=instr;
}else{
last_instr=-1;
}
}
int dump_opcode_info()
{
int e;
FILE *f;
f=fopen("opcode_statistics","w");
if(!f) return;
fprintf(f,"#nr eval_cost runned compiled average_cost average_time name\n");
for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
{
fprintf(f,"%3d %4d %6d %6d %10.4f %10.4f %s\n",
e,
instrs[e].eval_cost,
instrs[e].used,
instrs[e].compiled,
instrs[e].used ?
((float)instrs[e].avg_cost)/((float)instrs[e].used) : 0.0,
instrs[e].used ?
((float)instrs[e].avg_time)/((float)instrs[e].used) : 0.0,
get_f_name(e+F_OFFSET)) ;
}
fclose(f);
}
#endif