Data representation 3: Layout and performance

Overview

We summarize some lessons from last time, then investigate alignment, compound type layout, and performance.

Unit notesTextbook

Does every object always need an address?

Does every different object need a different address?

Lifetime and lifetime errors

Are different address ranges used for different purposes?

More questions

Alignment

intsort.cc

#include <cstdio>
#include <cassert>
#include <list>
#include "print_bytes.hh"

int main() {
    std::list<int> ints;

    // read integers from stdin, storing them in sorted order
    int input;
    while (fscanf(stdin, "%d", &input) == 1) {
        auto it = ints.begin();
        while (it != ints.end() && *it < input) {
            ++it;
        }
        ints.insert(it, input);
    }

    // print integers in sorted order
    for (auto& value : ints) {
        printf("%d\n", value);
    }
}

intsort.cc mark 2

-    std::list<int> ls;
+    std::vector<int> ls;

What happened????

Here are some results from several runs of ./intgen -n 100000 | time ./intsort > /dev/null (on my desktop in Docker):

Data structure Elapsed times
std::list 27.48 sec 27.45 sec 27.42 sec
std::vector 0.73 sec 0.73 sec 0.75 sec

An investigation

Analysis

Insertion order

Data structure Insertion order Elapsed times
std::list -r (random) 27.48 sec 27.45 sec 27.42 sec
std::vector -r 0.73 sec 0.73 sec 0.75 sec
std::list -u (increasing) 7.43 sec 7.43 sec 7.36 sec
std::vector -u 1.16 sec 1.14 sec 1.15 sec
std::list -d (decreasing) 0.01 sec 0.01 sec 0.01 sec
std::vector -d 0.35 sec 0.33 sec 0.34 sec