Difference between revisions of "Profiling Module"

From BaseX Documentation
Jump to navigation Jump to search
Line 8: Line 8:
  
 
==prof:time==
 
==prof:time==
 +
 +
{{Mark|Updated with Version 9.0:}} {{Code|$cache}} argument removed.
  
 
{| width='100%'
 
{| width='100%'
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
|{{Func|prof:time|$expr as item()|item()*}}<br />{{Func|prof:time|$expr as item(), $cache as xs:boolean|item()*}}<br />{{Func|prof:time|$expr as item(), $cache as xs:boolean, $label as xs:string|item()*}}
+
|{{Func|prof:time|$expr as item()|item()*}}<br />{{Func|prof:time|$expr as item(), $label as xs:string|item()*}}
 
|-
 
|-
 
| '''Summary'''
 
| '''Summary'''
|Measures the time needed to evaluate {{Code|$expr}} and sends it to standard error or, if the GUI is used, to the Info View.<br />If {{Code|$cache}} is set to {{Code|true()}}, the result will be temporarily cached. This way, a potential iterative execution of the expression (which often yields different memory usage) is blocked.<br/>A third, optional argument {{Code|$label}} may be specified to tag the profiling result.
+
|Measures the time needed to evaluate {{Code|$expr}} and outputs a string to standard error or, if the GUI is used, to the Info View.<br/>An optional {{Code|$label}} may be specified to tag the profiling result. Helpful notes:
 +
* Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
 +
* If a value has a compact internal representation, evaluation time will be very low, even if it may take a long time to iterate through all results.
 
|-
 
|-
 
| '''Properties'''
 
| '''Properties'''
Line 22: Line 26:
 
| '''Examples'''
 
| '''Examples'''
 
|
 
|
* {{Code|prof:time("1 to 100000")}} may output {{Code|25.69 ms}}.
+
* {{Code|prof:time(prof:sleep(1000))}} outputs something similar to {{Code|1000.99 ms}}.
* {{Code|prof:time("1 to 100000", true())}} may output {{Code|208.12 ms}}.
 
 
|}
 
|}
  
==prof:mem==
+
==prof:memory==
 +
 
 +
{{Mark|Updated with Version 9.0:}} Renamed (old name: <code>prof:mem</code>); {{Code|$cache}} argument removed.
  
 
{| width='100%'
 
{| width='100%'
 
|-
 
|-
 
| width='120' | '''Signatures'''
 
| width='120' | '''Signatures'''
|{{Func|prof:mem|$expr as item()|item()*}}<br />{{Func|prof:mem|$expr as item(), $cache as xs:boolean|item()*}}<br />{{Func|prof:mem|$expr as item(), $cache as xs:boolean, $label as xs:string|item()*}}
+
|{{Func|prof:memory|$expr as item()|item()*}}<br/>{{Func|prof:memory|$expr as item(), $label as xs:string|item()*}}
 
|-
 
|-
 
| '''Summary'''
 
| '''Summary'''
|Measures the memory allocated by evaluating {{Code|$expr}} and sends it to standard error or, if the GUI is used, to the Info View.<br />If {{Code|$cache}} is set to {{Code|true()}}, the result will be temporarily cached. This way, a potential iterative execution of the expression (which often yields different memory usage) is blocked.<br/>A third, optional argument {{Code|$label}} may be specified to tag the profiling result.
+
|Measures the memory allocated by evaluating {{Code|$expr}} and outputs a string to standard error or, if the GUI is used, to the Info View. An optional {{Code|$label}} may be specified to tag the profiling result. Helpful notes:
 +
* Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
 +
* If a value has a compact internal representation, memory consumption will be very low, even if the serialized result may consume much more memory.
 +
* In Java, memory profiling can only be approximative: To improve the measurement, main-memory will be garbage-collected before and after evaluation.
 
|-
 
|-
 
| '''Properties'''
 
| '''Properties'''
Line 41: Line 49:
 
| '''Examples'''
 
| '''Examples'''
 
|
 
|
* {{Code|prof:mem("1 to 100000")}} may output {{Code|0 Bytes}}.
+
* {{Code|prof:memory((1 to 100000) ! <a/>)}} will output something similar to {{Code|5620 kB}}.
* {{Code|prof:mem("1 to 100000", true())}} may output {{Code|26.678 mb}}.
+
|}
 +
 
 +
==prof:track==
 +
 
 +
{{Mark|Introduced with Version 9.0:}}
 +
 
 +
{| width='100%'
 +
|-
 +
| width='120' | '''Signatures'''
 +
|{{Func|prof:track|$expr as item()|item()*}}<br/>{{Func|prof:track|$expr as item(), $options as map(*)|item()*}}
 +
|-
 +
| '''Summary'''
 +
|Measures the execution time and memory consumption required for evaluating the specified {{Code|$expression}} and returns a map with the results. The following {{Code|$options}} are available:
 +
* {{Code|memory}}: Enables time profiling (default: true).
 +
* {{Code|time}}: Enables memory profiling (default: true).
 +
* {{Code|value}}: Returns the value (default: true).
 +
Helpful notes:
 +
* Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
 +
* If a value has a compact internal representation, memory consumption will be very low, even if the serialized result may consume much more memory.
 +
* In Java, memory profiling can only be approximative: To improve the measurement, and if the memory option is enabled, main-memory will be garbage-collected before and after evaluation. If you are not interested in the memory consumption, it is advisable to disable this option.
 +
|-
 +
| '''Properties'''
 +
|The function is ''non-deterministic'': evaluation order will be preserved by the compiler.
 +
|-
 +
| '''Examples'''
 +
|The function call <code>prof:track((1 to 1000000)[. mod 2 = 0])</code> will return something similar to:
 +
<pre class="brush:xquery">
 +
map {
 +
  "memory": 41548400,
 +
  "time": 34.99,
 +
  "value": (2, 4, 6, 8, 10, ...)
 +
}
 +
</pre>
 
|}
 
|}
  
Line 181: Line 221:
  
 
=Changelog=
 
=Changelog=
 +
 +
;Version 9.0
 +
 +
* Added: [[#prof:track|prof:track]]
 +
* Updated: renamed prof:mem to [[#prof:memory|prof:memory]]
  
 
;Version 8.5
 
;Version 8.5

Revision as of 17:29, 23 November 2017

This XQuery Module contains various functions to test and profile code, and to dump information to standard output.

Conventions

All functions and errors in this module are assigned to the http://basex.org/modules/prof namespace, which is statically bound to the prof prefix.

Functions

prof:time

Template:Mark $cache argument removed.

Signatures prof:time($expr as item()) as item()*
prof:time($expr as item(), $label as xs:string) as item()*
Summary Measures the time needed to evaluate $expr and outputs a string to standard error or, if the GUI is used, to the Info View.
An optional $label may be specified to tag the profiling result. Helpful notes:
  • Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
  • If a value has a compact internal representation, evaluation time will be very low, even if it may take a long time to iterate through all results.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.
Examples
  • prof:time(prof:sleep(1000)) outputs something similar to 1000.99 ms.

prof:memory

Template:Mark Renamed (old name: prof:mem); $cache argument removed.

Signatures prof:memory($expr as item()) as item()*
prof:memory($expr as item(), $label as xs:string) as item()*
Summary Measures the memory allocated by evaluating $expr and outputs a string to standard error or, if the GUI is used, to the Info View. An optional $label may be specified to tag the profiling result. Helpful notes:
  • Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
  • If a value has a compact internal representation, memory consumption will be very low, even if the serialized result may consume much more memory.
  • In Java, memory profiling can only be approximative: To improve the measurement, main-memory will be garbage-collected before and after evaluation.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.
Examples
  • prof:memory((1 to 100000) ! <a/>) will output something similar to 5620 kB.

prof:track

Template:Mark

Signatures prof:track($expr as item()) as item()*
prof:track($expr as item(), $options as map(*)) as item()*
Summary Measures the execution time and memory consumption required for evaluating the specified $expression and returns a map with the results. The following $options are available:
  • memory: Enables time profiling (default: true).
  • time: Enables memory profiling (default: true).
  • value: Returns the value (default: true).

Helpful notes:

  • Profiling might change the behavior of your code: An expression that might be executed iteratively will be cached by the profiling function.
  • If a value has a compact internal representation, memory consumption will be very low, even if the serialized result may consume much more memory.
  • In Java, memory profiling can only be approximative: To improve the measurement, and if the memory option is enabled, main-memory will be garbage-collected before and after evaluation. If you are not interested in the memory consumption, it is advisable to disable this option.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.
Examples The function call prof:track((1 to 1000000)[. mod 2 = 0]) will return something similar to:
map {
  "memory": 41548400,
  "time": 34.99,
  "value": (2, 4, 6, 8, 10, ...)
}

prof:sleep

Signatures prof:sleep($ms as xs:integer) as empty-sequence()
Summary Sleeps for the specified number of milliseconds.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.

prof:human

Signatures prof:human($number as xs:integer) as xs:string
Summary Returns a human-readable representation of the specified $number.
Example
  • prof:human(16384) returns 16K.

prof:dump

Signatures prof:dump($expr as item()) as empty-sequence()
prof:dump($expr as item(), $label as xs:string) as empty-sequence()
Summary Dumps a serialized representation of $expr to STDERR, optionally prefixed with $label, and returns an empty sequence. If the GUI is used, the dumped result is shown in the Info View.
Properties In contrast to fn:trace(), the consumed expression will not be passed on.

prof:variables

Signatures prof:variables() as empty-sequence()
Summary Prints a list of all current local and global variable assignments to standard error or, if the GUI is used, to the Info View.
As every query is optimized before being evaluated, not all of the original variables may be visible in the output. Moreover, many variables of function calls will disappear because functions are inlined. Function inlining can be turned off by setting the INLINELIMIT option to 0.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.
Examples
  • for $x in 1 to 2 return prof:variables() will dump the values of $x to standard error.

prof:current-ms

Signatures prof:current-ms() as xs:integer
Summary Returns the number of milliseconds passed since 1970/01/01 UTC. The granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.
Properties In contrast to fn:current-time(), the function is non-deterministic and returns different values every time it is called. Its evaluation order will be preserved by the compiler.
Examples
  • convert:integer-to-dateTime(prof:current-ms()) returns the current miliseconds in the xs:dateTime format.

prof:current-ns

Signatures prof:current-ns() as xs:integer
Summary Returns the current value of the most precise available system timer in nanoseconds.
Properties In contrast to fn:current-time(), the function is non-deterministic and returns different values every time it is called. Its evaluation order will be preserved by the compiler.
Examples Measures the time of an expression:
let $ns1 := prof:current-ns()
return (
  (: process to measure :)
  (1 to 1000000)[. = 0],
  let $ns2 := prof:current-ns()
  let $ms := ((($ns2 - $ns1) idiv 10000) div 100)
  return $ms || ' ms'
)

prof:void

Signatures prof:void($value as item()*) as empty-sequence()
Summary Swallows all items of the specified $value and returns an empty sequence. This function is helpful if some code needs to be evaluated and if the actual result is irrelevant.
Properties The function is non-deterministic: evaluation order will be preserved by the compiler.
Examples

prof:type

Signatures prof:type($expr as item()*) as item()*
Summary Similar to fn:trace($expr, $msg), but instead of a user-defined message, it emits the compile-time type and estimated result size of its argument.

Changelog

Version 9.0
Version 8.5
Version 8.1
Version 7.7
Version 7.6
Version 7.5

This module was introduced with Version 7.3.