2005-03-28 03:38:21

by krishna

[permalink] [raw]
Subject: How to measure time accurately.

Hi All,

Can any one tell me how to measure time accurately for a block of C code
in device drivers.
For example, If I want to measure the time duration of firmware download.

Regards,
Krishna Chaitanya


2005-03-29 03:40:32

by Lee Revell

[permalink] [raw]
Subject: Re: How to measure time accurately.

On Mon, 2005-03-28 at 08:58 +0530, krishna wrote:
> Hi All,
>
> Can any one tell me how to measure time accurately for a block of C code
> in device drivers.
> For example, If I want to measure the time duration of firmware download.

rdtsc()



2005-03-29 05:07:30

by Chris Friesen

[permalink] [raw]
Subject: Re: How to measure time accurately.

krishna wrote:
> Hi All,
>
> Can any one tell me how to measure time accurately for a block of C code
> in device drivers.
> For example, If I want to measure the time duration of firmware download.

Most cpus have some way of getting at a counter or decrementer of
various frequencies. Usually it requires low-level hardware knowledge
and often it needs assembly code.


On ppc you'd use the mftbu/mftbl instructions, as suggested by Lee on
x86 you'd use the rdtsc instruction.

Chris

2005-03-29 09:11:01

by Jesper Juhl

[permalink] [raw]
Subject: Re: How to measure time accurately.

On Mon, 28 Mar 2005, Chris Friesen wrote:

> Date: Mon, 28 Mar 2005 23:07:14 -0600
> From: Chris Friesen <[email protected]>
> To: krishna <[email protected]>
> Cc: Linux Kernel <[email protected]>
> Subject: Re: How to measure time accurately.
>
> krishna wrote:
> > Hi All,
> >
> > Can any one tell me how to measure time accurately for a block of C code in
> > device drivers.
> > For example, If I want to measure the time duration of firmware download.
>
> Most cpus have some way of getting at a counter or decrementer of various
> frequencies. Usually it requires low-level hardware knowledge and often it
> needs assembly code.
>
>
> On ppc you'd use the mftbu/mftbl instructions, as suggested by Lee on x86
> you'd use the rdtsc instruction.
>

In some cases you can simply count jiffies - depending on how accurate you
need to time things I'd say that often something like this is adequate :


unsigned long start, time_spent;

start = jiffies;
/* do stuff */
time_spent = jiffies - start;
printk("stuff took %d jiffies (%d seconds)\n", time_spent, time_spent/HZ);


--
Jesper Juhl

2005-03-29 09:25:58

by Jan Engelhardt

[permalink] [raw]
Subject: Re: How to measure time accurately.


>In some cases you can simply count jiffies - depending on how accurate you
>need to time things I'd say that often something like this is adequate :

These "some cases" exclude this one:
If interrupts are disabled, a jiffy might be missed. Take care.

If you are on UP and want to measure within
- a tick [when using preempt]
- kernel space [no preempt]
disabled interrupts should usually not be the case.


Jan Engelhardt
--
No TOFU for me, please.

2005-03-29 23:32:41

by Peter Chubb

[permalink] [raw]
Subject: Re: How to measure time accurately.

>>>>> "Chris" == Chris Friesen <[email protected]> writes:

Chris> krishna wrote:
>> Hi All,
>>
>> Can any one tell me how to measure time accurately for a block of C
>> code in device drivers. For example, If I want to measure the time
>> duration of firmware download.

Chris> Most cpus have some way of getting at a counter or decrementer
Chris> of various frequencies. Usually it requires low-level hardware
Chris> knowledge and often it needs assembly code.

As a device driver is inside the linux kernel (unless you're writein a
user-mode device driver :-)) you can use the getcycles() macro that's
defined for most architectures. It provides a snapshot of the
cycle-counter.

Caveats:
1. If you're running with power management, the cycle
counter ticks at a variable rate.
2. If you're on a multiprocessor, the cycle counters of
different processors need not be synchronised.
--
Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au
The technical we do immediately, the political takes *forever*

2005-03-30 00:24:45

by Chris Friesen

[permalink] [raw]
Subject: Re: How to measure time accurately.

Peter Chubb wrote:
>>>>>>"Chris" == Chris Friesen <[email protected]> writes:

> Chris> Most cpus have some way of getting at a counter or decrementer
> Chris> of various frequencies. Usually it requires low-level hardware
> Chris> knowledge and often it needs assembly code.
>
> As a device driver is inside the linux kernel (unless you're writein a
> user-mode device driver :-)) you can use the getcycles() macro that's
> defined for most architectures. It provides a snapshot of the
> cycle-counter.

For ppc this only gives 32-bit values, which overflow every 129 seconds
on my G5. Depending on how long you're trying to time, this could be a
problem.

Chris

2005-03-30 09:47:02

by Jan Engelhardt

[permalink] [raw]
Subject: Re: How to measure time accurately.


> For ppc this only gives 32-bit values, which overflow every 129 seconds on my
> G5. Depending on how long you're trying to time, this could be a problem.

Just take an extra measure to "record" overflows (2^32-1 => 0) and you're set.



Jan Engelhardt
--
No TOFU for me, please.