Home | History | Annotate | Download | only in perf
      1 #include <stdlib.h>
      2 
      3 #define nth_bit(x, n)   ((x >> n) & 1)
      4 #define Fn(N, Np1) \
      5    void* a##N(int x) { return ( nth_bit(x, N) ? a##Np1(x) : a##Np1(x) ); }
      6 
      7 // This test allocates a lot of heap memory, and every allocation features a
      8 // different stack trace -- the stack traces are effectively a
      9 // representation of the number 'i', where each function represents a bit in
     10 // 'i', and if it's a 1 the first function is called, and if it's a 0 the
     11 // second function is called.
     12 
     13 void* a999(int x)
     14 {
     15    return malloc(100);
     16 }
     17 
     18 Fn(17, 999)
     19 Fn(16, 17)
     20 Fn(15, 16)
     21 Fn(14, 15)
     22 Fn(13, 14)
     23 Fn(12, 13)
     24 Fn(11, 12)
     25 Fn(10, 11)
     26 Fn( 9, 10)
     27 Fn( 8, 9)
     28 Fn( 7, 8)
     29 Fn( 6, 7)
     30 Fn( 5, 6)
     31 Fn( 4, 5)
     32 Fn( 3, 4)
     33 Fn( 2, 3)
     34 Fn( 1, 2)
     35 Fn( 0, 1)
     36 
     37 int main(void)
     38 {
     39    int i;
     40 
     41    // Create a large XTree.
     42    for (i = 0; i < (1 << 18); i++)
     43       a0(i);
     44 
     45    // Do a lot of allocations so it gets dup'd a lot of times.
     46    for (i = 0; i < 100000; i++) {
     47       free(a1(234));
     48       free(a2(111));
     49    }
     50 
     51    return 0;
     52 }
     53