[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
get-internal-run-time
From: |
Lars Brinkhoff |
Subject: |
get-internal-run-time |
Date: |
01 May 2004 09:01:16 +0200 |
User-agent: |
Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 |
Richard Stallman <address@hidden> writes:
> [Lars Brinkhoff wrote:]
> [I wish there were a] function that returns the amount of
> processor time used [by Emacs], for implementing [the Common
> Lisp function] get-internal-run-time.
>
> ANSI CL says:
> The intent is that the difference between the values of
> two calls to this function be the amount of time between
> the two calls during which computational effort was
> expended on behalf of the executing program.
> I haven't found a suitable function for this in Emacs.
>
> Would you like to contribute such a function?
Here's a first attempt, submitted for comment.
2004-05-01 Lars Brinkhoff <address@hidden>
* editfns.c (Fget_internal_run_time): New function.
(syms_of_data): Defsubr it.
Index: editfns.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/editfns.c,v
retrieving revision 1.372
diff -c -r1.372 editfns.c
*** editfns.c 27 Apr 2004 13:28:38 -0000 1.372
--- editfns.c 1 May 2004 06:57:46 -0000
***************
*** 39,44 ****
--- 39,48 ----
#include <stdio.h>
#endif
+ #ifdef HAVE_SYS_RESOURCE_H
+ #include <sys/resource.h>
+ #endif
+
#include <ctype.h>
#include "lisp.h"
***************
*** 1375,1380 ****
--- 1379,1425 ----
return Flist (3, result);
}
+
+ DEFUN ("get-internal-run-time", Fget_internal_run_time,
Sget_internal_run_time,
+ 0, 0, 0,
+ doc: /* Return the current run time used by Emacs.
+ The time is returned as a list of three integers. The first has the
+ most significant 16 bits of the seconds, while the second has the
+ least significant 16 bits. The third integer gives the microsecond
+ count.
+
+ On systems that can't determine the run time, get-internal-run-time
+ does the same thing as current-time. The microsecond count is zero on
+ systems that do not provide resolution finer than a second. */)
+ ()
+ {
+ #ifdef HAVE_SYS_RESOURCE_H
+ struct rusage usage;
+ Lisp_Object result[3];
+ int secs, usecs;
+
+ if (getrusage (RUSAGE_SELF, &usage) < 0)
+ /* This shouldn't happen. What action is appropriate? */
+ Fsignal (Qerror, Qnil);
+
+ /* Sum up user time and system time. */
+ secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
+ usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
+ if (usecs >= 1000000)
+ {
+ usecs -= 1000000;
+ secs++;
+ }
+
+ XSETINT (result[0], (secs >> 16) & 0xffff);
+ XSETINT (result[1], (secs >> 0) & 0xffff);
+ XSETINT (result[2], usecs);
+
+ return Flist (3, result);
+ #else
+ return Fcurrent_time ();
+ #endif
+ }
int
***************
*** 4280,4285 ****
--- 4325,4331 ----
defsubr (&Suser_full_name);
defsubr (&Semacs_pid);
defsubr (&Scurrent_time);
+ defsubr (&Sget_internal_run_time);
defsubr (&Sformat_time_string);
defsubr (&Sfloat_time);
defsubr (&Sdecode_time);
- get-internal-run-time,
Lars Brinkhoff <=