JPRED-2 Add alscript to the Git repository
[jpred.git] / sources / alscript / gjutil / gjtimes.c
diff --git a/sources/alscript/gjutil/gjtimes.c b/sources/alscript/gjutil/gjtimes.c
new file mode 100644 (file)
index 0000000..3ce31a6
--- /dev/null
@@ -0,0 +1,343 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <time.h>
+
+#include <gjutil.h>
+#include <gjtimes.h>
+
+#ifndef CLK_TCK
+#include <unistd.h>
+#define CLK_TCK sysconf(_SC_CLK_TCK)
+#endif
+
+
+/* timing routines  */
+
+struct tms *t_init = NULL;
+struct tms *t_last = NULL;
+struct tms *t_new = NULL;
+
+clock_t init_times,last_times, new_times;
+
+void GJ_init_times(void)
+{
+
+  extern struct tms *t_init, *t_last, *t_new;
+  extern clock_t init_times, last_times, new_times;
+
+  if(t_init == NULL){
+    t_init = (struct tms *) GJmalloc(sizeof(struct tms));
+    t_new = (struct tms *) GJmalloc(sizeof(struct tms));
+    t_last = (struct tms *) GJmalloc(sizeof(struct tms));
+
+    init_times = times(t_init);
+    new_times = init_times;
+    last_times = init_times;
+  
+    copy_tms(t_last,t_init);
+    copy_tms(t_new,t_init);
+  }
+}
+
+void copy_tms(struct tms *l,struct tms *r)
+{
+  l->tms_utime = r->tms_utime;
+  l->tms_stime = r->tms_stime;
+  l->tms_cutime = r->tms_cutime;
+  l->tms_cstime = r->tms_cstime;
+}
+
+
+void GJ_show_times(FILE *fp,int action)
+{
+  /* show the time(s) since init_times was called
+     if action = 0, print the time since the last call to GJ_init_times
+                    or GJ_show_times.
+     if action = 1, print as in 0, but add the total time since the
+                    first call to GJ_init_times.
+        action = 2, print elapsed and total time +
+                   tms_utime, tms_stime, tms_cutime and tms_cstime
+  */
+
+  clock_t init_calling, new_calling, last_calling;
+  clock_t init_child, new_child, last_child;
+
+  extern struct tms *t_init, *t_last, *t_new;
+  extern clock_t init_times, last_times, new_times;
+
+  new_times = times(t_new);
+   
+  if(action == 0){
+    fprintf(fp,"Elapsed time: %*6.2f\n",
+           (float)(new_times-last_times)/CLK_TCK);
+  }
+
+  if(action == 1){
+    /* compressed output - shows summary of user + sys for parent and child */
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+
+
+     fprintf(fp,"CPU(P%7.1f%7.1f)(C%7.1f%7.1f)(T%7.1f%7.1f)(E%7.1f%7.1f)\n",
+            (float)(new_calling - last_calling)/CLK_TCK,
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_child - last_child)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-last_calling+new_child-last_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK,
+            (float)(new_times-last_times)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+  }
+
+
+  if(action == 2){
+    /* full output */
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+
+
+     fprintf(fp,"         %7s:%7s:%7s|%7s:%7s:%7s:%7s:%7s\n",
+            "user","sys","total","c user","c sys","ctotal","el/tcpu","cum");
+     fprintf(fp,"Master  :%7.1f:%7.1f:%7.1f|%7.1f:%7.1f:%7.1f|%7.1f:%7.1f\n",
+            (float)(t_new->tms_utime - t_last->tms_utime)/CLK_TCK,
+            (float)(t_new->tms_stime - t_last->tms_stime)/CLK_TCK,
+            (float)(new_calling - last_calling)/CLK_TCK,
+            (float)(t_new->tms_utime - t_init->tms_utime)/CLK_TCK,
+            (float)(t_new->tms_stime - t_init->tms_stime)/CLK_TCK,
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_times-last_times)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+
+     fprintf(fp,"Children:%7.1f:%7.1f:%7.1f|%7.1f:%7.1f:%7.1f|%7.1f:%7.1f\n",
+            (float)(t_new->tms_cutime - t_last->tms_cutime)/CLK_TCK,
+            (float)(t_new->tms_cstime - t_last->tms_cstime)/CLK_TCK,
+            (float)(new_child - last_child)/CLK_TCK,
+            (float)(t_new->tms_cutime - t_init->tms_cutime)/CLK_TCK,
+            (float)(t_new->tms_cstime - t_init->tms_cstime)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-last_calling+new_child-last_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK);
+  }
+  if(action == 3){
+    /* very compressed output - shows cumparent, cumchild + sum of the two  and elapsed time summary*/
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+     fprintf(fp,"Cum CPU Time: Parent: %*7.1f Child: %*7.1f Total: %*7.1f Elapsed: %7.1f\n",
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+  }
+
+  copy_tms(t_last,t_new);
+  last_times = new_times;
+}
+
+
+char *GJ_get_times(int action)
+{
+  /* show the time(s) since init_times was called
+     if action = 0, print the time since the last call to GJ_init_times
+                    or GJ_show_times.
+     if action = 1, print as in 0, but add the total time since the
+                    first call to GJ_init_times.
+
+  */
+
+  clock_t init_calling, new_calling, last_calling;
+  clock_t init_child, new_child, last_child;
+
+  char *outbuf;
+
+  extern struct tms *t_init, *t_last, *t_new;
+  extern clock_t init_times, last_times, new_times;
+
+  new_times = times(t_new);
+
+  outbuf = (char *) GJmalloc(sizeof(char) *200);
+   
+  if(action == 0){
+    sprintf(outbuf,"%7.1f\0",
+           (float)(new_times-last_times)/CLK_TCK);
+  }
+#ifdef KEEP_THIS
+  if(action == 1){
+    /* compressed output - shows summary of user + sys for parent and child */
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+     sprintf(outbuf,"%7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f\0",
+            (float)(new_calling - last_calling)/CLK_TCK,
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_child - last_child)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-last_calling+new_child-last_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK,
+            (float)(new_times-last_times)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+  }
+#else
+  /* this is a version that ignores the child processes since these 
+     appear not to be reported on the SGI */
+  if(action == 1){
+    /* compressed output - shows summary of user + sys for parent and child */
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+     sprintf(outbuf,"%7.1f %7.1f %7.1f %7.1f\0",
+            (float)(new_calling - last_calling)/CLK_TCK,
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_times-last_times)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+  }
+#endif
+
+  if(action == 2){
+    /* full output */
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+
+
+     sprintf(outbuf,
+     "%7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f",
+            (float)(t_new->tms_utime - t_last->tms_utime)/CLK_TCK,
+            (float)(t_new->tms_stime - t_last->tms_stime)/CLK_TCK,
+            (float)(new_calling - last_calling)/CLK_TCK,
+            (float)(t_new->tms_utime - t_init->tms_utime)/CLK_TCK,
+            (float)(t_new->tms_stime - t_init->tms_stime)/CLK_TCK,
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_times-last_times)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK,
+            (float)(t_new->tms_cutime - t_last->tms_cutime)/CLK_TCK,
+            (float)(t_new->tms_cstime - t_last->tms_cstime)/CLK_TCK,
+            (float)(new_child - last_child)/CLK_TCK,
+            (float)(t_new->tms_cutime - t_init->tms_cutime)/CLK_TCK,
+            (float)(t_new->tms_cstime - t_init->tms_cstime)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-last_calling+new_child-last_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK);
+  }
+
+  if(action == 3){
+    /* very compressed output - shows cumparent, cumchild + sum of the two  and elapsed time summary*/
+     init_calling = t_init->tms_utime + t_init->tms_stime;
+     init_child = t_init->tms_cutime + t_init->tms_cstime;
+
+     last_calling = t_last->tms_utime + t_last->tms_stime;
+     new_calling = t_new->tms_utime + t_new->tms_stime;
+
+     last_child = t_last->tms_cutime + t_last->tms_cstime;
+     new_child = t_new->tms_cutime + t_new->tms_cstime;
+
+     sprintf(outbuf,"%7.1f %7.1f %7.1f %7.1f\0",
+            (float)(new_calling - init_calling)/CLK_TCK,
+            (float)(new_child - init_child)/CLK_TCK,
+            (float)(new_calling-init_calling+new_child-init_child)/CLK_TCK,
+            (float)(new_times-init_times)/CLK_TCK);
+  }
+
+  copy_tms(t_last,t_new);
+  last_times = new_times;
+  outbuf = (char *) GJrealloc(outbuf,sizeof(char) * (strlen(outbuf) + 1));
+  return outbuf;
+}
+
+void GJ_reset_times()
+{
+    extern struct tms *t_init, *t_new, *t_last;
+
+    if(t_init != NULL){
+      GJfree(t_init);
+      t_init = NULL;
+    }
+    if(t_new != NULL){
+      GJfree(t_new);
+      t_new = NULL;
+    }
+    if(t_last != NULL){
+      GJfree(t_last);
+      t_last = NULL;
+    }
+}
+#define DELETE
+#ifndef DELETE
+main(int argc,char **argv)
+{
+  int i,j;
+  float l;
+  GJ_init_times();
+  /*  fprintf(stderr,"(0)%s\n",GJ_get_times(0));*/
+  /*  fprintf(stderr,"(1)%s\n",GJ_get_times(1));*/
+  /*  fprintf(stderr,"(2)%s\n",GJ_get_times(2));*/
+  fprintf(stderr,"(3)%s\n",GJ_get_times(3));
+
+  for(i=0;i<5000;++i){
+    for(j=0;j<5000;++j){
+      l = i*j;
+    }
+  }
+  /*  fprintf(stderr,"(0)%s\n",GJ_get_times(0));*/
+  /*  fprintf(stderr,"(1)%s\n",GJ_get_times(1));*/
+  /*  fprintf(stderr,"(2)%s\n",GJ_get_times(2));*/
+  fprintf(stderr,"(3)%s\n",GJ_get_times(3));
+  for(i=0;i<10000;++i){
+    for(j=0;j<5000;++j){
+      l = i*j;
+    }
+  }
+  /*  fprintf(stderr,"(0)%s\n",GJ_get_times(0));*/
+  /*  fprintf(stderr,"(1)%s\n",GJ_get_times(1));*/
+  /*  fprintf(stderr,"(2)%s\n",GJ_get_times(2));*/
+  fprintf(stderr,"(3)%s\n",GJ_get_times(3));
+  GJ_reset_times();
+}
+#endif
+
+
+
+
+