2012-05-29 13:31:11 +00:00
|
|
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
typedef struct SYS_CPU
|
|
|
|
{
|
|
|
|
unsigned long ID;
|
|
|
|
__int64 Start,Stop;
|
|
|
|
unsigned long NbCycles;
|
|
|
|
struct SYS_CPU *Previous;
|
|
|
|
struct SYS_CPU *Next;
|
|
|
|
} SYS_CPU;
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static __int64 first_cycle;
|
|
|
|
static __int64 last_cycle;
|
|
|
|
static unsigned long NbCpus=0;
|
|
|
|
static struct SYS_CPU *Sys_Cpu=NULL;
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
typedef struct ROUT
|
|
|
|
{
|
|
|
|
unsigned char Name[32];
|
|
|
|
unsigned long id;
|
|
|
|
unsigned long time;
|
|
|
|
} ROUT;
|
|
|
|
*/
|
|
|
|
|
|
|
|
ROUT Routines[20];
|
|
|
|
|
|
|
|
//#define PROFILE_BEGIN(name,i) {strcpy(Routine[i].Name,name); Routine[i].id=Sys_StartClock();}
|
|
|
|
//#define PROFILE_END(i) {Routine[i].time=Sys_StopClock(Routine[i].id);}
|
|
|
|
|
|
|
|
|
|
|
|
void FlushProfile(void)
|
|
|
|
{
|
|
|
|
FILE* file;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
file=fopen("\\profile.txt","wt");
|
|
|
|
if (file)
|
|
|
|
{
|
|
|
|
for(i=0 ; i<20 ; i++)
|
|
|
|
{
|
|
|
|
if (Routines[i].id)
|
|
|
|
{
|
|
|
|
fprintf(file,"-------------------------------\n");
|
|
|
|
fprintf(file,"Routine : %s",Routines[i].Name);
|
|
|
|
fprintf(file," Cpu : %2.2f\n",Routines[i].time/(float)Routines[i].nbtimes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(file);
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned long Sys_StartClock(void)
|
|
|
|
{
|
|
|
|
SYS_CPU *cpu,*temp,*cpu2;
|
|
|
|
unsigned long i,taken;
|
|
|
|
|
|
|
|
cpu=(SYS_CPU*)malloc(sizeof(SYS_CPU));
|
|
|
|
if (!cpu)
|
|
|
|
{
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
if (Sys_Cpu==NULL)
|
|
|
|
{
|
|
|
|
Sys_Cpu=cpu;
|
|
|
|
cpu->Previous=NULL;
|
|
|
|
cpu->Next=NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* temp=Sys_Cpu->Next;
|
|
|
|
Sys_Cpu->Next=cpu;
|
|
|
|
cpu->Previous=Sys_Cpu;
|
|
|
|
cpu->Next=temp;
|
|
|
|
if (temp)
|
|
|
|
{
|
|
|
|
temp->Previous=cpu;
|
|
|
|
}*/
|
|
|
|
temp = Sys_Cpu;
|
|
|
|
Sys_Cpu = cpu;
|
|
|
|
Sys_Cpu->Previous = NULL;
|
|
|
|
Sys_Cpu->Next = temp;
|
|
|
|
temp->Previous = Sys_Cpu;
|
|
|
|
}
|
|
|
|
NbCpus++;
|
|
|
|
for(i=1 ; i<NbCpus+1 ; i++)
|
|
|
|
{
|
|
|
|
taken=0;
|
|
|
|
for(cpu2=Sys_Cpu ; cpu2 ; cpu2=cpu2->Next)
|
|
|
|
{
|
|
|
|
if (cpu2->ID==i)
|
|
|
|
{
|
|
|
|
taken=1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!taken)
|
|
|
|
{
|
|
|
|
cpu->ID=i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
__asm
|
|
|
|
{
|
|
|
|
push eax
|
|
|
|
push edx
|
|
|
|
_emit 0x0F
|
|
|
|
_emit 0x31
|
|
|
|
mov ebx, OFFSET first_cycle
|
|
|
|
mov [ebx+0],eax
|
|
|
|
mov [ebx+4],edx
|
|
|
|
pop edx
|
|
|
|
pop eax
|
|
|
|
}
|
|
|
|
cpu->Start=first_cycle;
|
|
|
|
return(cpu->ID);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
float Sys_StopClock(unsigned long id)
|
|
|
|
{
|
|
|
|
SYS_CPU *cpu;
|
|
|
|
__int64 diftime;
|
|
|
|
|
|
|
|
for(cpu=Sys_Cpu ; cpu ; cpu=cpu->Next)
|
|
|
|
{
|
|
|
|
if (cpu->ID==id)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
__asm
|
|
|
|
{
|
|
|
|
push eax
|
|
|
|
push edx
|
|
|
|
_emit 0x0F
|
|
|
|
_emit 0x31
|
|
|
|
mov ebx,OFFSET last_cycle
|
|
|
|
mov [ebx+0],eax
|
|
|
|
mov [ebx+4],edx
|
|
|
|
pop edx
|
|
|
|
pop eax
|
|
|
|
}
|
|
|
|
cpu->Stop=last_cycle;
|
|
|
|
diftime=cpu->Stop-cpu->Start;
|
|
|
|
if (diftime>0xFFFFFFFF)
|
|
|
|
{
|
|
|
|
diftime=0xFFFFFFFF;
|
|
|
|
}
|
|
|
|
cpu->NbCycles=(unsigned long)diftime;
|
|
|
|
free(cpu);
|
|
|
|
return( diftime );
|
|
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|