Mail Archives: djgpp/1997/10/24/01:16:22
This is a multi-part message in MIME format.
--------------ACE111AC21DF8C50F913A08B
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Nate Eldredge wrote:
>
> At 09:02 10/7/1997 GMT, Stefan Schimanski wrote:
> >Hello,
> >
> >does anybody know how to profile code written with djgpp and allegro. gprof
> >doesn't work because no profiling data is produced by the executable. I've
> >tested it with a simple Hello-world program and it worked. Could it be that
> >the timer code of allegro kills the profiler code inside the executable?
> Yeah, I think that's the case. Shawn?
> You might be able to implement some limited profiling by using an Allegro
> timer as a counter, and printing its value at various strategic places in
> the code.
>
> Nate Eldredge
> eldredge AT ap DOT net
I can see this as a little problematic since allegro's timer is not
accurate at all.
well - it is accurate but not suitable for profiling. you should do a
simple test to
discover that - install a timer which executes each millisecond and
increase some counter by one each time. wait 10 minutes - your allegro
timer will report something like 9:55 ...
I have a timer library, but I haven't tested it with allegro yet.
I send it as an attachment - the .cpp file if for Borland C. The .cc
file is for djgpp. remove the main() function in djtimer.cc - it's
intended for testing.
Genady
--------------ACE111AC21DF8C50F913A08B
Content-Type: application/msword; name="Tctimer.doc"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="Tctimer.doc"
VENUSU1FUiAtIFJvdXRpbmVzIGZvciBoaWdoLXJlc29sdXRpb24gdGltaW5nIG9mIGV2ZW50
cyBmb3IgVHVyYm8gQw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClJpY2hhcmQgUy4gU2Fkb3dz
a3kNCjgvMTAvODgNClZlcnNpb24gMS4wDQpSZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFp
bg0KDQpCQVNFRCBPTiBUUFRJTUUuQVJDDQoNCndoaWNoIHdhcyB3cml0dGVuIGJ5IEJyaWFu
IEZvbGV5IGFuZCBLaW0gS29ra29uZW4gb2YgVHVyYm9Qb3dlciBTb2Z0d2FyZSBhbmQNCnJl
bGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLg0KDQpPdmVydmlldw0KLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tDQpPbmUgcHJvYmxlbSBjb21tb25seSBmYWNlZCB3aGVuIHRyeWluZyB0
byBydW4gYmVuY2htYXJrcyBvbiBhIFBDIGlzIHRoYXQsIGJ5DQpkZWZhdWx0LCB0aGUgc3lz
dGVtIGNsb2NrIGlzIGFjY3VyYXRlIG9ubHkgdG8gMS8xOHRoIG9mIGEgc2Vjb25kLiBUaGUg
VENUSU1FUg0KdW5pdCBwcm92aWRlcyBhIHNpbXBsZSBhbmQgY29udmVuaWVudCBtZWFucyBv
ZiB0aW1pbmcgZXZlbnRzIHdpdGggbWljcm9zZWNvbmQNClVubGVzcyB5b3VyIHByb2dyYW0g
aXMgd29ya2luZyB3aXRoIHRoZSB0aW1lciBjaGlwIGF0IGEgdmVyeSBsb3cgbGV2ZWwsIG5v
DQppbmNvbXBhdGliaWxpdGllcyBzaG91bGQgYXJpc2UsIG5vciBzaG91bGQgdGhlIHBlcmZv
cm1hbmNlIG9mIHlvdXIgcHJvZ3JhbQ0KY2hhbmdlLg0KDQpVc2luZyBUQ1RJTUVSDQotLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0NCkJlZm9yZSB1c2luZyBhbnkgb3RoZXIgVENUaW1lciBy
b3V0aW5lcywgaW5pdGlhbGl6ZXRpbWVyKCkgbXVzdCBiZSBjYWxsZWQuDQpUaGVuLCBldmVu
dHMgYXJlIHRpbWVkIGJ5IGNhbGxpbmcgcmVhZHRpbWVyIHdoZW4geW91IGFyZSByZWFkeSB0
byBzdGFydC9zdG9wDQp0aW1pbmcuIEFueSBwcm9ncmFtIHRoYXQgY2FsbHMgaW5pdGlhbGl6
ZXRpbWVyKCkgbXVzdCBjYWxsIHJlc3RvcmV0aW1lcigpDQpiZWZvcmUgdGVybWluYXRpbmcu
ICBTZWUgVEVTVFRJTUUuQyBmb3IgYSBzYW1wbGUgdXNlIG9mIHRoZSBUQ1RJTUVSIHJvdXRp
bmVzLg0KDQpUQ1RJTUVSIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcm91dGluZXM6DQoNCg0K
bG9uZyByZWFkdGltZXIodm9pZCk7DQovKlJlYWQgdGhlIHRpbWVyIHdpdGggMSBtaWNyb3Nl
Y29uZCByZXNvbHV0aW9uKi8NCg0Kdm9pZCBlbGFwc2VkdGltZShsb25nIHN0YXJ0LCBsb25n
IHN0b3AsIGRvdWJsZSAqcmVzdWx0KTsNCi8qQ2FsY3VsYXRlIHRpbWUgZWxhcHNlZCAoaW4g
bWlsbGlzZWNvbmRzKSBiZXR3ZWVuIFN0YXJ0IGFuZCBTdG9wKi8NCg0KDQp2b2lkIGluaXRp
YWxpemV0aW1lcih2b2lkKTsNCi8qUmVwcm9ncmFtIHRoZSB0aW1lciBjaGlwIHRvIGFsbG93
IDEgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiovDQoNCnZvaWQgcmVzdG9yZXRpbWVyKHZvaWQp
Ow0KLypSZXN0b3JlIHRoZSB0aW1lciBjaGlwIHRvIGl0cyBub3JtYWwgc3RhdGUqLw0KDQpJ
bml0aWFsaXplVGltZXIgbXVzdCBiZSBleGVjdXRlZCBiZWZvcmUgYW55IG90aGVyIFRDVElN
RVIgcm91dGluZXMgYXJlIGNhbGxlZC4NClJlc3RvcmVUaW1lciBtdXN0IGJlIGNhbGxlZCBi
ZWZvcmUgdGhlIHByb2dyYW0gZW5kcy4gIEZhaWx1cmUgdG8gY2FsbA0KaW5pdGlhbGl6ZXRp
bWVyIHdpbGwgcmVzdWx0IGluIGluY29ycmVjdCByZXN1bHRzIGFuZCBmYWlsdXJlIHRvIGNh
bGwNCnJlc3RvcmV0aW1lciBtYXkgcmVzdWx0IGluIGNoYW9zLg0KDQpMaW1pdGF0aW9ucw0K
LS0tLS0tLS0tLS0NCkJlY2F1c2UgbG9uZyBpbnRlZ2VycyBhcmUgdXNlZCB0byByZXByZXNl
bnQgdGltZSwgVENUSU1FUiBjYW5ub3QgYmUgdXNlZCB0bw0KdGltZSBldmVudHMgbG9uZ2Vy
IHRoYW4gYWJvdXQgNjAgbWludXRlczoNCg0KICAgNCwyOTQsOTY3LDI5NSAoPSAkRkZGRkZG
RkYsIGxhcmdlc3QgdW5zaWduZWQgdmFsdWUgcmVwcmVzZW50ZWQgYnkgbG9uZ2ludCkNCiAv
ICAgICAxLDE5MywxODEgKHRpbWVyIHJlc29sdXRpb24gaW4gY291bnRzL3NlY29uZCkNCiAt
LS0tLS0tLS0tLS0tLS0NCiAgICAgICAgICAgMyw1OTkNCiAgICAgICAgIC8gICAgNjAgKHNl
Y29uZHMvbWludXRlKQ0KICAgICAgICAgLS0tLS0tLQ0KICAgICAgICAgICAgNTkuOSBtaW51
dGVzDQoNClRoaXMgc2hvdWxkIGhhcmRseSBiZSBhIHByb2JsZW0sIGhvd2V2ZXIsIHNpbmNl
IGFuIGV2ZW50IGxvbmdlciB0aGFuIGFuIGhvdXINCnByZXN1bWFibHkgZG9lc24ndCBuZWVk
IHRvIGJlIHRpbWVkIHdpdGggMS1taWNyb3NlY29uZCBhY2N1cmFjeSBhbnl3YXkuDQoNCkFs
c28gbm90ZSB0aGF0IHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcgdGhlIHRpbWUgdGFrZXMgdGlt
ZS4gSGVuY2UsIHJlc3VsdHMgb2YNCnRpbWluZyB2ZXJ5IHNob3J0IGV2ZW50cyB3aWxsIGJl
IHNrZXdlZCBieSB0aGUgb3ZlcmhlYWQgb2YgcmVhZGluZyB0aGUgdGltZXIuDQpUaGUgZm9s
bG93aW5nIHRhYmxlIHNob3dzIHRoZSB0aW1lIG1lYXN1cmVkIGJldHdlZW4gdHdvIGNhbGxz
IHRvIFJlYWRUaW1lciwNCm9uZSByaWdodCBhZnRlciB0aGUgb3RoZXIuDQoNCiAgVG9zaGli
YSAxMDAwICg0Ljc3TUh6IDgwODgpICAgIDEyNSBtaWNyb3NlY29uZHMNCiAgQVRUIDYzMDAg
KDhNSHogODA4NikgICAgICAgICAgICA1MyAgICAgIg0KICBEZXNrcHJvIDI4NiAoOE1IeiA4
MDI4NikgICAgICAgIDM1ICAgICAiDQogIFNwZXJyeSBJVCAoNy4xTUh6IDI4NiwgMCB3YWl0
KSAgMzIgICAgICINCiAgSUJNIFBTLzIgbW9kZWwgNTAgICAgICAgICAgICAgICAyNSAgICAg
Ig0KICBQQyBEZXNpZ25zIEdWMzg2ICgxNk1IeikgICAgICAgIDI3ICAgICAiDQoa
--------------ACE111AC21DF8C50F913A08B
Content-Type: text/plain; charset=us-ascii; name="Tctimer.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Tctimer.cpp"
#include <dos.h>
const TimerResolution=1193181.667;
void cardinal(long l,double *result)
{
*result = ((l<0)?4294967296.0 + (long)l : (long)l);
}
void elapsedtime(long start, long stop, double *result)
{
double r;
cardinal(stop - start, &r);
*result = (1000.0 * r) / TimerResolution;
}
void initializetimer(void)
{
outportb(0x043,0x034);
asm jmp short NullJump1
NullJump1:;
outportb(0x040,0x000);
asm jmp short NullJump2
NullJump2:;
outportb(0x040,0x000);
}
void restoretimer(void)
{
outportb(0x043,0x036);
asm jmp short NullJump1
NullJump1:;
outportb(0x040,0x000);
asm jmp short NullJump2
NullJump2:;
outportb(0x040,0x000);
}
long readtimer(void)
{
asm cli /* Disable interrupts */
asm mov dx,020h /* Address PIC ocw3 */
asm mov al,00Ah /* Ask to read irr */
asm out dx,al
asm mov al,00h /* Latch timer 0 */
asm out 043h,al
asm in al,dx /* Read irr */
asm mov di,ax /* Save it in DI */
asm in al,040h /* Counter --> bx*/
asm mov bl,al /* LSB in BL */
asm in al,040h
asm mov bh,al /* MSB in BH */
asm not bx /* Need ascending counter */
asm in al,021h /* Read PIC imr */
asm mov si,ax /* Save it in SI */
asm mov al,00FFh /* Mask all interrupts */
asm out 021h,al
asm mov ax,040h /* read low word of time */
asm mov es,ax /* from BIOS data area */
asm mov dx,es:[06Ch]
asm mov ax,si /* Restore imr from SI */
asm out 021h,al
asm sti /* Enable interrupts */
asm mov ax,di /* Retrieve old irr */
asm test al,001h /* Counter hit 0? */
asm jz done /* Jump if not */
asm cmp bx,0FFh /* Counter > 0x0FF? */
asm ja done /* Done if so */
asm inc dx /* Else count int req. */
done:;
asm mov ax,bx /* set function result */
}
--------------ACE111AC21DF8C50F913A08B
Content-Type: text/plain; charset=us-ascii; name="Tctimer.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Tctimer.h"
void cardinal(long l, double *result);
void elapsedtime(long start, long stop, double *result);
/*Calculate time elapsed (in milliseconds) between Start and Stop*/
void initializetimer(void);
/*Reprogram the timer chip to allow 1 microsecond resolution*/
void restoretimer(void);
/*Restore the timer chip to its normal state*/
long readtimer(void);
/*Read the timer with 1 microsecond resolution*/
--------------ACE111AC21DF8C50F913A08B
Content-Type: text/plain; charset=us-ascii; name="djtimer.cc"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="djtimer.cc"
#include <pc.h>
#include <stdlib.h>
#include <dos.h>
#include <iostream.h>
//void __dosmemgetw(unsigned long _offset, int _xfers, void *_buffer);
#include <go32.h>
#include <string.h>
#include <conio.h>
#include <sys/movedata.h>
#include <time.h>
#define randomize() srandom(time(0)) // under djgpp
const double TimerResolution=1193181.667;
void cardinal(unsigned long l,double *result)
{
*result = ((l<0)?4294967296.0 + (unsigned long)l : (unsigned long)l);
}
void elapsedtime(unsigned long start, unsigned long stop, double *result)
{
double r;
cardinal(stop - start, &r);
*result = (1000.0 * r) / TimerResolution;
}
void initializetimer(void)
{
outportb(0x043,0x034);
asm ("jmp NullJump1;"
"NullJump1:;");
outportb(0x040,0x000);
asm ("jmp NullJump2;"
"NullJump2:;");
outportb(0x040,0x000);
}
void restoretimer(void)
{
outportb(0x043,0x036);
asm ("jmp NullJump3;"
"NullJump3:;");
outportb(0x040,0x000);
asm ("jmp NullJump4;"
"NullJump4:;");
outportb(0x040,0x000);
}
unsigned long readtimer(void)
{
unsigned long eax,ebx,ecx,edx,esi,edi,dx;
unsigned short low,high;
/* asm ("cli");
outportb(0x20,0xA); // ask to read irr
outportb(0x43,0x0); // latch tiemr 0
unsigned char irr=inportb(0x20); // read irr
unsigned char low=inportb(0x40);
unsigned char high=inportb(0x40);
unsigned short counter=~((high << 8) + low);
unsigned char imr=inportb(0x21);
outportb(0x21,0xFF);
unsigned short counter2;
dosmemget(0x46C,2,&counter2);
outportb(0x21,imr);
asm ("sti");
if (irr==1) goto done;
if (counter>0xFF) goto done;
counter2++;
done:
cout << counter2 << "," << counter << endl;
return (counter2 << 16) + counter; */
__asm__ __volatile__ (
"cli;" // Disable interrupts
"movw $0x20,%%dx; " // Address PIC ocw3
"movb $0xA,%%al; " // Ask to read irr
"outb %%al,%%dx; "
"movb $0,%%al; " // Latch timer 0
"outb %%al,$0x43; "
"inb %%dx,%%al; " // Read irr
"movw %%ax,%%di; " // Save it in DI
"inb $0x40,%%al; " // Counter --> bx
"movb %%al,%%bl; " // LSB in BL
"inb $0x40,%%al; "
"movb %%al,%%bh; " // MSB in BH
"notw %%bx; " // Need ascending counter
"inb $0x21,%%al; " // Read PIC imr
"movw %%ax,%%si; " // Save it in SI
"movb $0xFF,%%al; " // Mask all interrupts
"outb %%al,$0x21; "
: "=a" (eax), "=b"(ebx), "=d" (edx), "=S"(esi), "=D"(edi)
:
);
dosmemget(0x46C,2,&dx);
edx=dx;
__asm__ __volatile__ (
"movw %%si,%%ax ; " //* Restore imr from SI
"outb %%al,$0x21; "
"sti ; " //* Enable interrupts
"movw %%di,%%ax ; " //* Retrieve old irr
"testb $01,%%al ; " //* Counter hit 0?
"jz done ; " //* Jump if not
"cmpw $0xFF,%%bx; " //* Counter > 0x0FF?
"ja done ; " //* Done if so
"incw %%dx ; " //* Else count int req.
"done: ; "
"movw %%bx,%%ax ; "
: "=a" (low) , "=d" (high)
: "a" (eax), "b" (ebx), "d" (edx), "S" (esi), "D" (edi));
// set function result
// "movw %%ax, %0" : "=a"(eax));
// "movw %%dx, %0" : "=d"(edx));
// return dx << 16 + ax;
// cout << "Low: " << low << " High: " << high << " Total: "
// << high << 16 + low << endl;
return (high << 16) + low;
}
int main()
{
// unsigned short int dx;
// dosmemget(0x46C,2,&dx);
// cout << dx;
cout << "Press any key to start the timer" << endl;
getch();
initializetimer();
cout << "Press any key to stop the timer" << endl;
long TStart=readtimer();
getch();
long TStop=readtimer();
double a;
elapsedtime(TStart,TStop,&a);
cout << endl << "Time passed : " << (long)(a/1000.) << " seconds " << endl;
cout << endl << "---------------" << endl << endl;
// restoretimer();
/*
cout << "Press any key to start various delay tests . . . " ;
cout.flush();
getch(); cout << endl;
randomize();
for (int i=0 ; i < 50 ; i++)
{
int del=random() % 1000 + 10;
cout << "Delaying for " << del << " milliseconds. ";
cout.flush();
TStart=readtimer();
delay(del);
TStop=readtimer();
elapsedtime(TStart,TStop,&a);
cout << " Measured " << (long)a << "ms. Press any key." << endl;
cout.flush();
// getch();
} */
// 2.9626
cout << "Running 100,000,000,000 nop instructions";
cout.flush();
TStart=readtimer();
asm volatile (
"mov $0xFFFF,%ecx \n"
"NullJump5:;"
"nop;"
"loop NullJump5;"
);
// asm volatile ("movl $100000000000,%ecx \n"
// "Here:\n"
// "nop\n"
// "loop aloop");
TStop=readtimer();
elapsedtime(TStart,TStop,&a);
cout << endl << "Time passed : " << a << " ms " << endl;
return 1;
}
--------------ACE111AC21DF8C50F913A08B
Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Card for Genady Beryozkin
Content-Disposition: attachment; filename="vcard.vcf"
begin: vcard
fn: Genady Beryozkin
n: Beryozkin;Genady
org: The Technion
adr: ;;;Natzrat Illit / Haifa;;;Israel
email;internet: c0467082 AT t2 DOT technion DOT ac DOT il
note: Homepage : http://t2.technion.ac.il/~c0467082/
x-mozilla-cpt: ;0
x-mozilla-html: FALSE
version: 2.1
end: vcard
--------------ACE111AC21DF8C50F913A08B--
- Raw text -