1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
* Atlanta, Georgia 30332-0415
* All Rights Reserved
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
* See LICENSE for the license information
* -------------------------------------------------------------------------- */
/**
* @file timeVirtual.cpp
* @brief Time the overhead of using virtual destructors and methods
* @author Richard Roberts
* @date Dec 3, 2010
*/
#include <gtsam/base/timing.h>
#include <boost/shared_ptr.hpp>
#include <boost/intrusive_ptr.hpp>
#include <iostream>
using namespace std;
using namespace boost;
using namespace gtsam;
struct Plain {
size_t data;
Plain(size_t _data) : data(_data) {}
void setData(size_t data) { this->data = data; }
};
struct Virtual {
size_t data;
Virtual(size_t _data) : data(_data) {}
virtual void setData(size_t data) { this->data = data; }
virtual ~Virtual() {}
};
struct VirtualCounted {
size_t data;
size_t refCount;
VirtualCounted(size_t _data) : data(_data) {}
virtual void setData(size_t data) { this->data = data; }
virtual ~VirtualCounted() {}
};
void intrusive_ptr_add_ref(VirtualCounted* obj) { ++ obj->refCount; }
void intrusive_ptr_release(VirtualCounted* obj) {
assert(obj->refCount > 0);
-- obj->refCount;
if(obj->refCount == 0)
delete obj;
}
int main(int argc, char *argv[]) {
size_t trials = 10000000;
gttic_(heap_plain_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
Plain *obj = new Plain(i);
delete obj;
}
gttoc_(heap_plain_alloc_dealloc);
gttic_(heap_virtual_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
Virtual *obj = new Virtual(i);
delete obj;
}
gttoc_(heap_virtual_alloc_dealloc);
gttic_(stack_plain_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
Plain obj(i);
}
gttoc_(stack_plain_alloc_dealloc);
gttic_(stack_virtual_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
Virtual obj(i);
}
gttoc_(stack_virtual_alloc_dealloc);
gttic_(shared_plain_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
boost::shared_ptr<Plain> obj(new Plain(i));
}
gttoc_(shared_plain_alloc_dealloc);
gttic_(shared_virtual_alloc_dealloc);
for(size_t i=0; i<trials; ++i) {
boost::shared_ptr<Virtual> obj(new Virtual(i));
}
gttoc_(shared_virtual_alloc_dealloc);
gttic_(heap_plain_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
Plain *obj = new Plain(i);
obj->setData(i+1);
delete obj;
}
gttoc_(heap_plain_alloc_dealloc_call);
gttic_(heap_virtual_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
Virtual *obj = new Virtual(i);
obj->setData(i+1);
delete obj;
}
gttoc_(heap_virtual_alloc_dealloc_call);
gttic_(stack_plain_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
Plain obj(i);
obj.setData(i+1);
}
gttoc_(stack_plain_alloc_dealloc_call);
gttic_(stack_virtual_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
Virtual obj(i);
obj.setData(i+1);
}
gttoc_(stack_virtual_alloc_dealloc_call);
gttic_(shared_plain_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
boost::shared_ptr<Plain> obj(new Plain(i));
obj->setData(i+1);
}
gttoc_(shared_plain_alloc_dealloc_call);
gttic_(shared_virtual_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
boost::shared_ptr<Virtual> obj(new Virtual(i));
obj->setData(i+1);
}
gttoc_(shared_virtual_alloc_dealloc_call);
gttic_(intrusive_virtual_alloc_dealloc_call);
for(size_t i=0; i<trials; ++i) {
intrusive_ptr<VirtualCounted> obj(new VirtualCounted(i));
obj->setData(i+1);
}
gttoc_(intrusive_virtual_alloc_dealloc_call);
tictoc_print_();
return 0;
}
|