2.5 KiB
C++ versus Python performance
This exercise is intended to show explicitly the great difference that can exist between interpreted and compiled software. To illustrate the point, a few benchmarks have been lifted from the benchmarks game site. The benchmarks have been coded in such a way as to be algorithmically identical in the different programming languages.
Performance measurement
The task here is to carry out a performance measurement using the time
program, running both the C++ and the Python version of each code. A general way to determine the time needed for a program to run is the following:
time ./myexe args
where args
are any run-time arguments to the program. (The ./
prefix is not needed if you have the "current working directory" .
in your PATH
; however, doing so is generally considered bad practice, as it is insecure.) Note that all three programs take arguments that will affect the computing time needed. In the Python case you would replace myexe
with python3 mypython.py
(note that Python2 will likely fail to work).
How to run: C++
The general way to use (on Linux machines) the command-line g++ compiler illustrated below with a fictive source file called mysource.cc .
g++ mysource.cc -o myexe
Note that the C++ language standard is (still) evolving, and different programs adhere to different standards. The programs used here conform to the c++11 standard (which appears to be the default setting for the g++ version 7 compiler). Other standards could be specified using the -std=...
option to g++. Many options to g++ exist; extensive information can be obtained by doing
man g++
Note also that instead of a command line tool, other (graphical) tools or Integrated Development Environments or IDEs may be used for your code development. As a general principle, the important thing is that whatever you do should work with a straight compilation using g++.
Specifics
-
The
spectral-norm
code uses the OpenMP library to enable multi-threading, a topic that we will get to later. To compile this code, the-fopenmp
compilation flag is needed. -
The
mandelbrot
code produces a NetPBM graphics output file, but does so by writing it to its standard output. One way to redirect the output is to specifytime ( ./myexe args > mandelbrot.pbm )
(The parentheses here are needed to create a sub-shell; without them, the outputs from the time
command and from myexe
would get mixed up.)