HOW I CALCULATE TIME IN C PROGRAM - c

how i calculate real time in a program of c ....
__________________________start=clock();
----------------------------end=clock();
diff=end-start;
start=124682129.0000000
end =124682129.0000000
result value of diff is 0.0000000000000000000000
i am sorting an array i want to calculate time before sort and end of sort in gcc compiler ......
how i can calculate these times?
real time
execution time

If you want to get the execution time of your program, you can do this:
//some code
#include <time.h>
int main () {
double seconds;
time_t started=time(NULL);
RunSomeFunc();
seconds=difftime(time(NULL),started);
//more code
}
Here you're measuring the execution time of RunSomeFunc.
Docs
difftime
ctime a.k.a time.h

simple program to print time in C
/* localtime example */
#include <stdio.h>
#include <time.h>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "Current local time and date: %s", asctime (timeinfo) );
return 0;
}

Related

localtime() reports incorrect hour and isdst flag

UPDATED CODE 11/06/20
localtime is reporting incorrect tm_hour (+1 hour) and tm_isdst (1).
Notes:
I am in the Eastern time zone.
It is currently Nov 6 (not DST).
Environment variable TZ is not set.
The Control Panel (Date & Time) is set to "(UTC-05:00) Eastern Time (US & Canada)".
There were many SO posts about this issue but none directly addressed this issue.
Is this a bug or am I doing something wrong?
My code is below (compiled with MSVC "Win32 Debug", run on Win10-64):
// localtime.c - Test Program for localtime()
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
int
main(int argc,char **argv)
{
time_t utc;
struct tm *tm;
utc = time( NULL );
tm = localtime( &utc );
printf( "Program localtime.exe:\n" );
printf( "Env Var TZ: %s\n", getenv( "TZ" ) );
printf( "tm->tm_hour: %d\n", tm->tm_hour );
printf( "tm->tm_isdst: %d\n", tm->tm_isdst );
printf( "Press any key to exit...\n" );
getch();
exit( 0 );
return( 0 );
}
Program Output (run at 10:20 AM EST)
Program localtime.exe:
Env Var TZ: (null)
tm->tm_hour: 11
tm->tm_isdst: 1
My guess is that you're using an uninitialized value in the time funciton and not capturing its return value.
Try this:
time_t ltime;
struct tm *tm;
ltime = time( NULL );
tm = localtime( &ltime );
Very, very weird. If find if I set env var "TZ", localtime() works fine. What is Strange is, it makes no difference what I set it to, e.g. "XXX".

Getting the localtime in milliseconds

I need the fastest way to get the localtime (thus considering the current timezone) at least in milliseconds precision, if is possible to get in tenths of milliseconds it would be better.
I would like to avoid the use of gettimeofday() as it is now an obsolete function.
So, there seems that I'll need to use the clock_gettime(CLOCK_REALTIME, ...) and adjust the hour to the current timezone, but how ? And where is the best point to do that ? Before to store the timestamp got with clock_gettime, or before to convert it in a gregorian calendar in the current timezone?
EDIT: My original sample joining get_clock and localtime - There are better ways to reach that?
#include <time.h>
#include <stdio.h>
int main() {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
struct tm* ptm;
ptm = localtime(&(ts.tv_sec));
// Tenths of milliseconds (4 decimal digits)
int tenths_ms = ts.tv_nsec / (100000L);
printf("%04d-%02d-%02d %02d:%02d:%02d.%04d\n",
1900 + ptm->tm_year, ptm->tm_mon + 1, ptm->tm_mday,
ptm->tm_hour, ptm->tm_min, ptm->tm_sec, tenths_ms);
}
I don't think there's a better way than with clock_gettime() and localtime(). However you need to round the returned nanoseconds correctly and consider the case when the time is rounded up to the next second. To format the time you can use strftime() instead of formatting the tm struct manually:
#include <time.h>
#include <stdio.h>
int main(void) {
struct timespec ts;
long msec;
int err = clock_gettime(CLOCK_REALTIME, &ts);
if (err) {
perror("clock_gettime");
return 1;
}
// round nanoseconds to milliseconds
if (ts.tv_nsec >= 999500000) {
ts.tv_sec++;
msec = 0;
} else {
msec = (ts.tv_nsec + 500000) / 1000000;
}
struct tm* ptm = localtime(&ts.tv_sec);
if (ptm == NULL) {
perror("localtime");
return 1;
}
char time_str[sizeof("1900-01-01 23:59:59")];
time_str[strftime(time_str, sizeof(time_str),
"%Y-%m-%d %H:%M:%S", ptm)] = '\0';
printf("%s.%03li\n", time_str, msec);
}
Yes, this can be achieved using the clock_gettime() function. In the current version of POSIX, gettimeofday() is marked obsolete. This means it may be removed from a future version of the specification. Application writers are encouraged to use the clock_gettime() function instead of gettimeofday().
Long story short, here is an example of how to use clock_gettime():
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_in_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
If your goal is to measure elapsed time, and your system supports the "monotonic clock" option, then you should consider using CLOCK_MONOTONIC instead of CLOCK_REALTIME.
One more point, remember to include -lm flag when trying to compile the code.
To get the timezone, just do the following:
#define _GNU_SOURCE /* for tm_gmtoff and tm_zone */
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t = time(NULL);
struct tm lt = {0};
localtime_r(&t, &lt);
printf("Offset to GMT is %lds.\n", lt.tm_gmtoff);
printf("The time zone is '%s'.\n", lt.tm_zone);
return 0;
}
Note: The seconds since epoch returned by time() are measured as if in GMT (Greenwich Mean Time).

Date formatting in pure C using time zones

I want to implement Unix milliseconds converter to human readable date format.
using this post https://stackoverflow.com/a/1657307/1979882 I found I can receive such string but I can't setup a time zone inside the code. The code uses only system time zone.
#include <stdio.h>
#include <time.h>
int main ( int argc, char *argv[] )
{
time_t now;
struct tm *lcltime;
now = time ( NULL );
lcltime = localtime ( &now );
printf ( "The time is %d:%d\n", lcltime->tm_hour, lcltime->tm_min );
return 0;
}
Is it possible to customize it?
EDIT
I need some Java-like method:
SimpleDateFormat df= new SimpleDateFormat("dd MMM hh:mm z",Locale.ENGLISH);
df.setTimeZone("Europe/London");
System.out.println("London Time " + df.format(System.currentTime()));
df.setTimeZone("Asia/Benjin");
System.out.println("Benjin Time " + df.format(System.currentTime()));
EDIT_2
I found I can setup time zone using setenv(...)
url
https://stackoverflow.com/a/1620451/1979882
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (int argc, char *argv[])
{
struct tm *mt;
time_t mtt;
char ftime[10];
setenv("TZ", "PST8PDT", 1);
tzset();
mtt = time(NULL);
mt = localtime(&mtt);
strftime(ftime,sizeof(ftime),"%Z %H%M",mt);
printf("%s\n", ftime);
}
But in changes the system time zone. I need just time zone modification only inside my code.
You can change the argument to localtime based on the timezone difference required.
now += (time_t)(3600*TIME_DIFF_IN_HRS)
lcltime = localtime ( &now );
To be totally portable, you can get the current time zone by referring this post

C timestamp difference

Yes, i made revision of subject timestamp :) But there is something that i can't understand
My code:
#include <stdio.h>
#include <time.h>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
time_t now = time(NULL);
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ("Current local time and date: %s \n", asctime (timeinfo) );
printf("System time: %d",now);
return 0;
}
After run i got:
Current local time and date: Fri May 3 09:17:07 2013
System time: 1367565427
But 1367565427 it's not 09:17 but 07:17:07
Why? I asked for my local - system time (which is now 09:17) with " time_t now = time(NULL); "
So how can i get my stetem time?
Timestamp is in GMT, while localtime converts timestamp to your local time, so you seems to live in GMT +2.0 zone.

Keeping track as to how long a program ran for in C

How can I keep track of how long my program executed a certain instruction in, for example, if one were to measure the diskusage, that would take time, and at the end my program should give an oupit along the lines of
real=50.0s user=30.s sys=20.0s
How do I distinguish and gather the system time, and the actual command time?
Use getrusage in Linux:
#include <sys/time.h>
#include <sys/resource.h>
...
struct rusage rusage;
getrusage(RUSAGE_SELF, &rusage);
/* use rusage.ru_utime and rusage.ru_stime for user and system time resp. */
Back in the day I used to use pureCoverage to examine the execution time, but it was expensive. There might be free tools that do the same sort of thing, but for a quick and dirty solution...
include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
time_t start_time, end_time;
start_time = time(NULL);
//Do your thing...
end_time = time(NULL);
int diff = end_time - start_time;
//Diff will be the number of milliseconds that elapsed.
}
There's another solution, not much different from the previous example.
#include<time.h>
int main ()
{
clock_t start_time, stop_time;
start_time = clock();
// ... do your thing;
stop_time = clock();
printf("Elapsed time: %lf", (double)( stop_time - start_time ) / CLOCKS_PER_SEC);
}

Resources