Engine Profiling: Difference between revisions

From Spring
Jump to navigationJump to search
Hoijui (talk | contribs)
mNo edit summary
Hoijui (talk | contribs)
mNo edit summary
Line 51: Line 51:
<code><pre>
<code><pre>
# This has to be sent only once; it will be saved
# This has to be sent only once; it will be saved
opcontrol --event=CPU_CLK_UNHALTED:100000:0x0f:0:1 \
opcontrol --event=CPU_CLK_UNHALTED:1000000:0x0:0:1 \
           --callgraph=16 \
           --callgraph=16 \
           --separate-type=thread,library
           --separate=thread,library \
          --no-vmlinux


# start the profiler
# start the profiler

Revision as of 15:07, 13 November 2010

Development < Engine Profiling

Engine Profiling

Linux

Intro

There are several ways to profile an application.

gprof

The compiler injects special code in the binary that self profiles it when it runs. this is what cmake -DCMAKE_BUILD_TYPE=PROFILING is here for. We are not going to use this. It does not interfere with normal program's work-flow. With spring, it gets so slow that it is unusable for profiling anything in late game (which is where it is needed the most). It requires special compiling options.


oprof

OProfile uses statistical sampling. It is a kernel module, which every n clock ticks, registers which function is currently being processed. It is lightweight; it may run with almost 0 performance impact. This method always profiles your profiles your whole system; relevant info has to be filtered out after the profiling run has finished. The downside of statistical profiling, is that it requires at least a certain sample size to achieve good accuracy. Also remember, that oprof still requires the debug symbols, to resolve addresses into function names. It can be turned on/off at any time, so for instance, you may skip spring loading so you would only profile in-game runtime. You can also merge multiple profiling sessions.

Setting up oprof

Required stuff:

  • oprof kernel module
  • oprof package

Using oprof

there's special statistical sampling timing functions in modern cpu my laptop's core 2 duo has them which somehow sets the lower bar generally for recent stuff :p


You will have to load the kernel module: sudo insmod oprofile

The profiling daemon is controlled using opcontrol as root. As regular user, you can do post-processing using opreport.

Recommended settings

A call-graph depth of 16: --callgraph=16

Separate each thread and application in its own profile (you can always merge them later, using opreport): --separate=thread,library

Disable kernel profiling, enable user-space profiling --event=CPU_CLK_UNHALTED:100000:0x0f:0:1

A typical profiling session

# This has to be sent only once; it will be saved
opcontrol --event=CPU_CLK_UNHALTED:1000000:0x0:0:1 \
          --callgraph=16 \
          --separate=thread,library \
          --no-vmlinux

# start the profiler
opcontrol --start

# stop the profiler
opcontrol --stop

# in order to make the profile data available to user-space,
# you have to dump the data
opcontrol --dump

Post processing oprof data

gprof2dot takes oprof data and outputs a nice dot-graph. Then you can use either graphviz to render to an image, or display the graph directly, for example with xdot. The will look about like this: xdot-profile2.png

you might need help to output the oprof data in a way that gprof2dot can digest, tell me when you reach there

Windows

<Please add>