码迷,mamicode.com
首页 > 编程语言 > 详细

stl::sort 算法的跟踪

时间:2014-12-27 23:04:22      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:

  1 // basics/tracer.hpp
  2 #include <iostream>
  3 class SortTracer
  4 {
  5 private:
  6     int value;                  // 用来排序的整数
  7     int generation;             // 此追踪器的生成个数
  8     static long n_created;      // 构造函数被调用的次数
  9     static long n_destroyed;    // 析构函数被调用的次数
 10     static long n_assigned;     // 赋值次数
 11     static long n_compared;     // 比较次数
 12     static long n_max_live;     // 同一时间最多存在几个objects
 13     
 14     // 重新计算「同一时间最多存在几个objects」
 15     static void update_max_live()
 16     {
 17         if (n_created - n_destroyed > n_max_live)
 18         {
 19             n_max_live = n_created-n_destroyed;
 20         }
 21     }
 22 public:
 23     static long creations()
 24     {
 25         return n_created;
 26     }
 27     static long destructions()
 28     {
 29         return n_destroyed;
 30     }
 31     static long assignments()
 32     {
 33         return n_assigned;
 34     }
 35     static long comparisons()
 36     {
 37         return n_compared;
 38     }
 39     static long max_live()
 40     {
 41         return n_max_live;
 42     }
 43     
 44 public:
 45 // 构造函数 (constructor)
 46     SortTracer (int v = 0) 
 47         :value(v), 
 48         generation(1)
 49     {
 50         ++n_created;
 51         update_max_live();
 52         std::cerr << "SortTracer #" << n_created
 53                   << ", created generation " << generation
 54                   << " (total: " << n_created - n_destroyed
 55                   << ) << std::endl;
 56     }
 57 // copy 构造函数(copy constructor)
 58     SortTracer (SortTracer const& b)
 59         : value(b.value), 
 60         generation(b.generation+1)
 61     {
 62         ++n_created;
 63         update_max_live();
 64         std::cerr << "SortTracer #" << n_created
 65                   << ", copied as generation " << generation
 66                   << " (total: " << n_created - n_destroyed
 67                   << ) << std::endl;
 68     }
 69  // 解构式(destructor)
 70     ~SortTracer()
 71     {
 72         ++n_destroyed;
 73         update_max_live();
 74         std::cerr << "SortTracer generation " << generation
 75                   << " destroyed (total: "
 76                   << n_created - n_destroyed << ) << std::endl;
 77     }
 78 // 赋值(assignment)
 79     SortTracer& operator= (SortTracer const& b)
 80     {
 81         ++n_assigned;
 82         std::cerr << "SortTracer assignment #" << n_assigned
 83                   << " (generation " << generation
 84                   << " = " << b.generation
 85                   << ) << std::endl;
 86         value = b.value;
 87         return *this;
 88     }
 89     // 比较(comparison)
 90     friend bool operator < (SortTracer const& a,
 91                             SortTracer const& b)
 92     {
 93         ++n_compared;
 94         std::cerr << "SortTracer comparison #" << n_compared
 95                   << " (generation " << a.generation
 96                   << " < " << b.generation
 97                   << ) << std::endl;
 98         return a.value < b.value;
 99     }
100     int val() const
101     {
102         return value;
103     }
104 };

 

下面的测试程序对std::sort算法进行一系列的跟踪

 1 #include "first.hpp"
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 long SortTracer::n_created = 0;
 6 long SortTracer::n_destroyed = 0;
 7 long SortTracer::n_max_live = 0;
 8 long SortTracer::n_assigned = 0;
 9 long SortTracer::n_compared = 0;
10 
11 int main()
12 {
13 // 准备样本数据源
14     SortTracer input[] = { 7, 3, 5, 6, 4, 2, 0, 1, 9, 8 };
15 // 打印起始值
16     for (int i=0; i<10; ++i)
17     {
18         std::cerr << input[i].val() <<  ;
19     }
20     std::cerr << std::endl;
21 // 记录起始值
22     long created_at_start = SortTracer::creations();
23     long max_live_at_start = SortTracer::max_live();
24     long assigned_at_start = SortTracer::assignments();
25     long compared_at_start = SortTracer::comparisons();
26 // 执行算法
27     std::cerr << "---[ Start std::sort() ]--------------------" << std::endl;
28     std::sort<>(&input[0], &input[9]+1);
29     std::cerr << "---[ End std::sort() ]----------------------" << std::endl;
30 // 检验结果
31     for (int i=0; i<10; ++i)
32     {
33         std::cerr << input[i].val() <<  ;
34     }
35     std::cerr << std::endl << std::endl;
36 // 最终报告
37     std::cerr << "std::sort() of 10 SortTracer‘s"
38               << " was performed by: " << std::endl
39               << SortTracer::creations() - created_at_start
40               << " temporary tracers" << std::endl <<  
41               << "up to "
42               << SortTracer::max_live()
43               << " tracers at the same time ("
44               << max_live_at_start << " before)" << std::endl <<  
45               << SortTracer::assignments() - assigned_at_start
46               << " assignments" << std::endl <<  
47               << SortTracer::comparisons() - compared_at_start
48               << " comparisons" << std::endl << std::endl;
49 }

 

最终运行结果:

SortTracer #1, created generation 1 (total: 1)
SortTracer #2, created generation 1 (total: 2)
SortTracer #3, created generation 1 (total: 3)
SortTracer #4, created generation 1 (total: 4)
SortTracer #5, created generation 1 (total: 5)
SortTracer #6, created generation 1 (total: 6)
SortTracer #7, created generation 1 (total: 7)
SortTracer #8, created generation 1 (total: 8)
SortTracer #9, created generation 1 (total: 9)
SortTracer #10, created generation 1 (total: 10)
7 3 5 6 4 2 0 1 9 8 
---[ Start std::sort() ]--------------------
SortTracer comparison #1 (generation 1 < 1)
SortTracer #11, copied as generation 2 (total: 11)
SortTracer assignment #1 (generation 1 = 1)
SortTracer assignment #2 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #2 (generation 1 < 1)
SortTracer #12, copied as generation 2 (total: 11)
SortTracer comparison #3 (generation 2 < 1)
SortTracer assignment #3 (generation 1 = 1)
SortTracer comparison #4 (generation 2 < 1)
SortTracer assignment #4 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #5 (generation 1 < 1)
SortTracer #13, copied as generation 2 (total: 11)
SortTracer comparison #6 (generation 2 < 1)
SortTracer assignment #5 (generation 1 = 1)
SortTracer comparison #7 (generation 2 < 1)
SortTracer assignment #6 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #8 (generation 1 < 1)
SortTracer #14, copied as generation 2 (total: 11)
SortTracer comparison #9 (generation 2 < 1)
SortTracer assignment #7 (generation 1 = 1)
SortTracer comparison #10 (generation 2 < 1)
SortTracer assignment #8 (generation 1 = 1)
SortTracer comparison #11 (generation 2 < 1)
SortTracer assignment #9 (generation 1 = 1)
SortTracer comparison #12 (generation 2 < 1)
SortTracer assignment #10 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #13 (generation 1 < 1)
SortTracer #15, copied as generation 2 (total: 11)
SortTracer assignment #11 (generation 1 = 1)
SortTracer assignment #12 (generation 1 = 1)
SortTracer assignment #13 (generation 1 = 1)
SortTracer assignment #14 (generation 1 = 1)
SortTracer assignment #15 (generation 1 = 1)
SortTracer assignment #16 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #14 (generation 1 < 1)
SortTracer #16, copied as generation 2 (total: 11)
SortTracer assignment #17 (generation 1 = 1)
SortTracer assignment #18 (generation 1 = 1)
SortTracer assignment #19 (generation 1 = 1)
SortTracer assignment #20 (generation 1 = 1)
SortTracer assignment #21 (generation 1 = 1)
SortTracer assignment #22 (generation 1 = 1)
SortTracer assignment #23 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #15 (generation 1 < 1)
SortTracer #17, copied as generation 2 (total: 11)
SortTracer comparison #16 (generation 2 < 1)
SortTracer assignment #24 (generation 1 = 1)
SortTracer comparison #17 (generation 2 < 1)
SortTracer assignment #25 (generation 1 = 1)
SortTracer comparison #18 (generation 2 < 1)
SortTracer assignment #26 (generation 1 = 1)
SortTracer comparison #19 (generation 2 < 1)
SortTracer assignment #27 (generation 1 = 1)
SortTracer comparison #20 (generation 2 < 1)
SortTracer assignment #28 (generation 1 = 1)
SortTracer comparison #21 (generation 2 < 1)
SortTracer assignment #29 (generation 1 = 1)
SortTracer comparison #22 (generation 2 < 1)
SortTracer assignment #30 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #23 (generation 1 < 1)
SortTracer #18, copied as generation 2 (total: 11)
SortTracer comparison #24 (generation 2 < 1)
SortTracer assignment #31 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
SortTracer comparison #25 (generation 1 < 1)
SortTracer #19, copied as generation 2 (total: 11)
SortTracer comparison #26 (generation 2 < 1)
SortTracer assignment #32 (generation 1 = 1)
SortTracer comparison #27 (generation 2 < 1)
SortTracer assignment #33 (generation 1 = 2)
SortTracer generation 2 destroyed (total: 10)
---[ End std::sort() ]----------------------
0 1 2 3 4 5 6 7 8 9 

std::sort() of 10 SortTracers was performed by: 
9 temporary tracers
 up to 11 tracers at the same time (10 before)
 33 assignments
 27 comparisons

SortTracer generation 1 destroyed (total: 9)
SortTracer generation 1 destroyed (total: 8)
SortTracer generation 1 destroyed (total: 7)
SortTracer generation 1 destroyed (total: 6)
SortTracer generation 1 destroyed (total: 5)
SortTracer generation 1 destroyed (total: 4)
SortTracer generation 1 destroyed (total: 3)
SortTracer generation 1 destroyed (total: 2)
SortTracer generation 1 destroyed (total: 1)
SortTracer generation 1 destroyed (total: 0)

 

stl::sort 算法的跟踪

标签:

原文地址:http://www.cnblogs.com/dLong/p/4189268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!