Changeset 4752


Ignore:
Timestamp:
11/14/03 17:55:35 (18 years ago)
Author:
piso
Message:

Work in progress.

Location:
trunk/j/src/org/armedbear/lisp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Profiler.java

    r4708 r4752  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: Profiler.java,v 1.1 2003-11-12 21:28:11 piso Exp $
     5 * $Id: Profiler.java,v 1.2 2003-11-14 17:55:17 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2424public class Profiler extends Lisp
    2525{
     26    private static int sleep = 1;
     27
    2628    public static final void sample(LispThread thread)
    2729    {
     
    3335        public void run()
    3436        {
    35             try {
    36                 int sleep = Fixnum.getValue(_GRANULARITY_.getSymbolValue());
    37                 while (profiling) {
    38                     sampleNow = true;
    39                     try {
    40                         Thread.sleep(sleep);
    41                     }
    42                     catch (InterruptedException e) {
    43                         Debug.trace(e);
    44                     }
     37            while (profiling) {
     38                sampleNow = true;
     39                try {
     40                    Thread.sleep(sleep);
    4541                }
    46             }
    47             catch (ConditionThrowable t) {
    48                 Debug.trace(t);
     42                catch (InterruptedException e) {
     43                    Debug.trace(e);
     44                }
    4945            }
    5046        }
    5147    };
    5248
    53     // ### start-profiler
    54     public static final Primitive0 START_PROFILER =
    55         new Primitive0("start-profiler", PACKAGE_PROF, true)
     49    // ### %start-profiler
     50    // %start-profiler type granularity
     51    public static final Primitive2 _START_PROFILER =
     52        new Primitive2("%start-profiler", PACKAGE_PROF, false)
    5653    {
    57         public LispObject execute() throws ConditionThrowable
     54        public LispObject execute(LispObject first, LispObject second)
     55            throws ConditionThrowable
    5856        {
    5957            CharacterOutputStream out = getStandardOutput();
    6058            out.freshLine();
    6159            if (profiling) {
    62                 out.writeLine("; Profiling already enabled.");
     60                out.writeLine("; Profiler already started.");
    6361            } else {
     62                if (first == Keyword.TIME)
     63                    sampling = true;
     64                else if (first == Keyword.COUNT_ONLY)
     65                    sampling = false;
     66                else
     67                    throw new ConditionThrowable(new LispError(
     68                        "%START-PROFILER: argument must be either :TIME or :COUNT-ONLY"));
    6469                Package[] packages = Packages.getAllPackages();
    6570                for (int i = 0; i < packages.length; i++) {
     
    7378                    }
    7479                }
    75                 sampling = true; // FIXME
    7680                if (sampling) {
     81                    sleep = Fixnum.getValue(second);
    7782                    if (!debug) {
    7883                        debug = true;
     
    8691                    new Thread(profilerRunnable).start();
    8792                }
    88                 out.writeLine("; Profiling started.");
     93                out.writeLine("; Profiler started.");
    8994                profiling = true;
    9095            }
     
    103108            if (profiling) {
    104109                profiling = false;
    105                 out.writeLine("; Profiling stopped.");
     110                out.writeLine("; Profiler stopped.");
    106111            } else
    107                 out.writeLine("; Profiling not enabled.");
     112                out.writeLine("; Profiler was not started.");
    108113            out.flushOutput();
    109114            return LispThread.currentThread().nothing();
  • trunk/j/src/org/armedbear/lisp/profiler.lisp

    r4707 r4752  
    22;;;
    33;;; Copyright (C) 2003 Peter Graves
    4 ;;; $Id: profiler.lisp,v 1.7 2003-11-12 21:26:59 piso Exp $
     4;;; $Id: profiler.lisp,v 1.8 2003-11-14 17:55:35 piso Exp $
    55;;;
    66;;; This program is free software; you can redistribute it and/or
     
    2020(in-package "PROFILER")
    2121
    22 ;; SHOW-CALL-COUNTS and PROFILE are exported in Lisp.java.
     22(defparameter *type* nil)
     23
     24(defparameter *granularity* 1 "Sampling interval (in milliseconds).")
    2325
    2426;; Returns list of all symbols with non-zero call counts.
     
    4547    (setf syms (sort syms #'<
    4648                     :key #'(lambda (x) (sys::%call-count (fdefinition x)))))
    47     (let* ((last-sym (car (last syms)))
    48            (max-count (if last-sym
    49                           (sys::%call-count (fdefinition last-sym))
    50                           nil)))
    51       (when (zerop max-count)
    52         (setf max-count nil))
     49    (let ((max-count nil))
     50      (when (eq *type* :time)
     51        (let* ((last-sym (car (last syms))))
     52          (setf max-count (if last-sym
     53                              (sys::%call-count (fdefinition last-sym))
     54                              nil))
     55          (when (eql max-count 0)
     56            (setf max-count nil))))
    5357      (dolist (sym syms)
    5458        (show-call-count-for-symbol sym max-count))))
    5559  (values))
    5660
    57 (defmacro profile (&rest forms)
    58   `(progn (start-profiler) ,@forms (stop-profiler)))
     61(defun start-profiler (&key type)
     62  "Starts the profiler.
     63  :TYPE may be either :TIME (statistical sampling) or :COUNT-ONLY (exact call
     64  counts)."
     65  (format t "start-profiler type = ~S~%" type)
     66  (unless type
     67    (setf type :time))
     68  (unless (memq type '(:time :count-only))
     69    (error ":TYPE must be :TIME or :COUNT-ONLY"))
     70  (setf *type* type)
     71  (%start-profiler type *granularity*))
     72
     73(defmacro with-profiling ((&key type) &body body)
     74  `(unwind-protect (progn (start-profiler :type ,type) ,@body)
     75                   (stop-profiler)))
Note: See TracChangeset for help on using the changeset viewer.