gnuplot revisited
Here is a more sophisticated example of using gnuplot
:
set terminal png size 1920, 1080 enhanced font 'Verdana,15'
# Different log scales
set logscale x 2
set logscale y 10
# %L is the exponent of the current log scale
set format y "%g"
set format x "2e%L"
# Move the legend to the top left
set key top left
# Display grid
set grid
set ylabel "Average Time (s)"
set xlabel "Problem size n"
# Fit the data in output.dat with linear function
# f(x) = a*x + b
# fit f(x) 'output.dat' using 1:2 via a, b
# Arbitrary reference function
g(x) = 4.87882e-11 * x + 1.44652e-07
# Set the number of samples (for discrete point plots)
set sample 50
set output 'plot_insert.png'
set title "Timing stdlib containers: insert"
# Automatically plot multiple columns in the data file,
# use the first row as title, and set the line width to 3
# Finally, also plot reference function in discrete points.
plot for [col=2:6:2] 'output.dat' using 1:col title columnheader lw 3 with lines,
g(x) title "O(n) reference" with points pointtype 1 lw 3
# Plot a second file
set output "plot_erase.png"
set title "Timing stdlib containers: erase"
plot for [col=3:7:2] 'output.dat' using 1:col title columnheader lw 3 with lines,
g(x) title "O(n) reference" with points pointtype 1 lw 3
For reference, here is what the file output.dat
looked like in my case:
n "vector insert" "vector erase" "list insert" "list erase" "set insert" "set erase"
16 1.52755e-07 1.49435e-07 9.73663e-08 7.1011e-08 1.68631e-07 9.87532e-08
32 1.51429e-07 1.50084e-07 9.77384e-08 7.05812e-08 1.70701e-07 1.00051e-07
64 1.55609e-07 1.49241e-07 9.77484e-08 7.10019e-08 1.69907e-07 9.99704e-08
128 1.60411e-07 1.54703e-07 9.89177e-08 7.14337e-08 1.71593e-07 1.00082e-07
256 1.66222e-07 1.59109e-07 1.0011e-07 7.30871e-08 1.76871e-07 1.03908e-07
512 1.85162e-07 1.90188e-07 1.04985e-07 7.62717e-08 1.80321e-07 1.05466e-07
1024 2.00222e-07 2.08123e-07 1.08935e-07 7.81612e-08 1.7591e-07 1.02936e-07
2048 2.32146e-07 2.40377e-07 9.63265e-08 6.94104e-08 1.67459e-07 9.7593e-08
4096 3.03668e-07 3.10476e-07 9.53831e-08 6.9201e-08 1.66743e-07 9.74839e-08
8192 4.7185e-07 4.77161e-07 9.79464e-08 7.10629e-08 1.71413e-07 1.00036e-07
16384 1.03076e-06 1.04001e-06 9.42701e-08 6.78754e-08 1.67353e-07 9.81198e-08
32768 2.10713e-06 2.08867e-06 9.5413e-08 6.90011e-08 1.67374e-07 9.85516e-08
65536 4.96184e-06 4.94945e-06 9.63352e-08 6.94543e-08 1.68892e-07 9.87505e-08
131072 1.1501e-05 1.14362e-05 9.45015e-08 6.78938e-08 1.66043e-07 9.72587e-08
262144 2.63044e-05 2.6239e-05 9.56299e-08 6.89657e-08 1.66921e-07 9.77711e-08
524288 5.62351e-05 5.6107e-05 9.64178e-08 6.97338e-08 1.68579e-07 9.83175e-08
1048576 0.000614559 0.00060455 1.01048e-07 7.28126e-08 1.77607e-07 1.03555e-07
And here are the resulting plots:
In this case, I was measuring the time complexity of inserting a single item at the beginning of different stdlib
containers, as a function of the current size n
. std::vector
has O(n) complexity, whereas std::set
and std::list
are constant for this operation.