The simple-profiling Module#

This module provides an easy to use interface for measuring application performance.

Simple Profiling#

timing Statement Macro#

Returns the time, in seconds and microseconds, spent executing the body of code it is wrapped around.

Macro Call:

timing () [ body ] end [ timing ]

Parameters:
  • body – A Dylan body bnf

Values:
Discussion:

Returns the time, in seconds and microseconds, spent executing the body of code it is wrapped around.

The first value returned is the number of whole seconds spent in body. The second value returned is the number of microseconds spent in body in addition to seconds.

Example:
timing ()
  for (i from 0 to 200)
    format-to-string("%d %d", i, i + 1)
  end
end;
=> 1 671000
profiling Macro#

Gives access to the CPU time, in seconds and microseconds, as well as some memory allocation statistics, spent executing the body of code it is wrapped around.

Macro Call:

profiling ([profiling-type, ...])
  body
results
  results
end

Parameters:
  • profiling-type – Any of cpu-time-seconds, cpu-time-microseconds, allocation and allocation-stats.

  • body – A Dylan body bnf

  • results – A Dylan body bnf

Discussion:

This macro takes a set of profiling-type parameters, performs the body of code and then executes the results. Within the results block, there will be bindings with the names of the profiling types which have the corresponding value.

Note

Using allocation-stats is more involved and not as flexible as one might hope. This needs further documentation and perhaps an improved implementation.

Note

The memory allocation statistics may not work on all run-times and platforms.

Example:
profiling (cpu-time-seconds, cpu-time-microseconds, allocation)
  execute-command(command)
results
  message(context, "Command took %d.%s seconds, and allocated %d bytes",
          cpu-time-seconds,
          integer-to-string(floor/(cpu-time-microseconds, 1000), size: 3),
          allocation)
end

Internals#

These functions don’t typically need to be called directly but may be useful in some scenarios.

<profiling-state> Type#
Equivalent:

<object-table>

<cpu-profiling-type> Type#
Equivalent:

one-of(#"cpu-time-seconds", #"cpu-time-microseconds")

profiling-type-result Open Generic function#
Signature:

profiling-type-result (state keyword #key #all-keys) => (value)

Parameters:
Values:
profiling-type-result(<profiling-state>, <cpu-profiling-type>) Method#
profiling-type-result(<profiling-state>, singleton(#"allocation")) Method#
profiling-type-result(<profiling-state>, singleton(#"allocation-stats")) Method#
start-profiling Function#
Signature:

start-profiling (profiling-types) => (state)

Parameters:
  • profiling-types – A sequence of any of #"cpu-time-seconds", #"cpu-time-microseconds", #"allocation# and #"allocation-stats#.

Values:

This is useful for when direct control over profiling is needed rather than using the profiling macro.

start-profiling-type Open Generic function#
Signature:

start-profiling-type (state keyword) => ()

Parameters:
start-profiling-type(<profiling-state>, <cpu-profiling-type>) Method#
start-profiling-type(<profiling-state>, singleton(#"allocation")) Method#
start-profiling-type(<profiling-state>, singleton(#"allocation-stats")) Method#
stop-profiling Function#
Signature:

stop-profiling (state profiling-types) => ()

Parameters:
stop-profiling-type Open Generic function#
Signature:

stop-profiling-type (state keyword) => ()

Parameters:
stop-profiling-type(<profiling-state>, <cpu-profiling-type>) Method#
stop-profiling-type(<profiling-state>, singleton(#"allocation")) Method#
stop-profiling-type(<profiling-state>, singleton(#"allocation-stats")) Method#