0Day Forums
Timer function to provide time in nano seconds using C++ - Printable Version

+- 0Day Forums (https://0day.red)
+-- Forum: Coding (https://0day.red/Forum-Coding)
+--- Forum: C# (https://0day.red/Forum-C)
+--- Thread: Timer function to provide time in nano seconds using C++ (/Thread-Timer-function-to-provide-time-in-nano-seconds-using-C)



Timer function to provide time in nano seconds using C++ - zabrina473 - 07-24-2023

I wish to calculate the time it took for an API to return a value.
The time taken for such an action is in the space of nanoseconds. As the API is a C++ class/function, I am using the timer.h to calculate the same:

#include <ctime>
#include <iostream>

using namespace std;

int main(int argc, char** argv) {

clock_t start;
double diff;
start = clock();
diff = ( std::clock() - start ) / (double)CLOCKS_PER_SEC;
cout<<"printf: "<< diff <<'\n';

return 0;
}

The above code gives the time in seconds. How do I get the same in nano seconds and with more precision?



RE: Timer function to provide time in nano seconds using C++ - Mrimpeachment0 - 07-24-2023

In general, for timing how long it takes to call a function, you want to do it many more times than just once. If you call your function only once and it takes a very short time to run, you still have the overhead of actually calling the timer functions and you don't know how long that takes.

For example, if you estimate your function might take 800 ns to run, call it in a loop ten million times (which will then take about 8 seconds). Divide the total time by ten million to get the time per call.


RE: Timer function to provide time in nano seconds using C++ - javierdn - 07-24-2023

If you need subsecond precision, you need to use system-specific extensions, and will have to check with the documentation for the operating system. POSIX supports up to microseconds with [gettimeofday][1], but nothing more precise since computers didn't have frequencies above 1GHz.

If you are using Boost, you can check [boost::posix_time][2].

[1]:

[To see links please register here]

[2]:

[To see links please register here]




RE: Timer function to provide time in nano seconds using C++ - norenetmftwusjsw - 07-24-2023

If this is for Linux, I've been using the function "gettimeofday", which returns a struct that gives the seconds and microseconds since the Epoch. You can then use timersub to subtract the two to get the difference in time, and convert it to whatever precision of time you want. However, you specify nanoseconds, and it looks like the function [clock_gettime()][1] is what you're looking for. It puts the time in terms of seconds and nanoseconds into the structure you pass into it.


[1]:

[To see links please register here]




RE: Timer function to provide time in nano seconds using C++ - oaks758 - 07-24-2023

I'm using Borland code here is the code ti_hund gives me some times a negativnumber but timing is fairly good.

#include <dos.h>

void main()
{
struct time t;
int Hour,Min,Sec,Hun;
gettime(&t);
Hour=t.ti_hour;
Min=t.ti_min;
Sec=t.ti_sec;
Hun=t.ti_hund;
printf("Start time is: %2d:%02d:%02d.%02d\n",
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
....
your code to time
...

// read the time here remove Hours and min if the time is in sec

gettime(&t);
printf("\nTid Hour:%d Min:%d Sec:%d Hundreds:%d\n",t.ti_hour-Hour,
t.ti_min-Min,t.ti_sec-Sec,t.ti_hund-Hun);
printf("\n\nAlt Ferdig Press a Key\n\n");
getch();
} // end main



RE: Timer function to provide time in nano seconds using C++ - dunton369 - 07-24-2023

With that level of accuracy, it would be better to reason in CPU tick rather than in system call [like clock()][1]. And do not forget that if it takes more than one nanosecond to execute an instruction... having a nanosecond accuracy is pretty much impossible.

Still, [something like that][2] is a start:

Here's the actual code to retrieve number of 80x86 CPU clock ticks passed since the CPU was last started. It will work on Pentium and above (386/486 not supported). This code is actually MS Visual C++ specific, but can be probably very easy ported to whatever else, as long as it supports inline assembly.

inline __int64 GetCpuClocks()
{

// Counter
struct { int32 low, high; } counter;

// Use RDTSC instruction to get clocks count
__asm push EAX
__asm push EDX
__asm __emit 0fh __asm __emit 031h // RDTSC
__asm mov counter.low, EAX
__asm mov counter.high, EDX
__asm pop EDX
__asm pop EAX

// Return result
return *(__int64 *)(&counter);

}

This function has also the advantage of being extremely fast - it usually takes no more than 50 cpu cycles to execute.

[Using the Timing Figures][3]:
If you need to translate the clock counts into true elapsed time, divide the results by your chip's clock speed. Remember that the "rated" GHz is likely to be slightly different from the actual speed of your chip. To check your chip's true speed, you can use several very good utilities or the Win32 call, QueryPerformanceFrequency().


[1]:

[To see links please register here]

[2]:

[To see links please register here]

[3]:

[To see links please register here]