Timing tests for virtual/nonvirtual classes, heap/stack allocation, and shared pointers

release/4.3a0
Richard Roberts 2010-12-09 01:32:29 +00:00
parent ea61c9d619
commit b928b6d4f5
2 changed files with 146 additions and 1 deletions

View File

@ -37,7 +37,7 @@ sources += DSFVector.cpp
check_PROGRAMS += tests/testBTree tests/testDSF tests/testDSFVector check_PROGRAMS += tests/testBTree tests/testDSF tests/testDSFVector
# Timing tests # Timing tests
noinst_PROGRAMS = tests/timeMatrix tests/timeublas noinst_PROGRAMS = tests/timeMatrix tests/timeublas tests/timeVirtual
#---------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------
# Create a libtool library that is not installed # Create a libtool library that is not installed

View File

@ -0,0 +1,145 @@
/**
* @file timeVirtual.cpp
* @brief Time the overhead of using virtual destructors and methods
* @author Richard Roberts
* @created 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;
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;
tic_("heap plain alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
Plain *obj = new Plain(i);
delete obj;
}
toc_("heap plain alloc, dealloc");
tic_("heap virtual alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
Virtual *obj = new Virtual(i);
delete obj;
}
toc_("heap virtual alloc, dealloc");
tic_("stack plain alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
Plain obj(i);
}
toc_("stack plain alloc, dealloc");
tic_("stack virtual alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
Virtual obj(i);
}
toc_("stack virtual alloc, dealloc");
tic_("shared plain alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
shared_ptr<Plain> obj(new Plain(i));
}
toc_("shared plain alloc, dealloc");
tic_("shared virtual alloc, dealloc");
for(size_t i=0; i<trials; ++i) {
shared_ptr<Virtual> obj(new Virtual(i));
}
toc_("shared virtual alloc, dealloc");
tic_("heap plain alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
Plain *obj = new Plain(i);
obj->setData(i+1);
delete obj;
}
toc_("heap plain alloc, dealloc, call");
tic_("heap virtual alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
Virtual *obj = new Virtual(i);
obj->setData(i+1);
delete obj;
}
toc_("heap virtual alloc, dealloc, call");
tic_("stack plain alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
Plain obj(i);
obj.setData(i+1);
}
toc_("stack plain alloc, dealloc, call");
tic_("stack virtual alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
Virtual obj(i);
obj.setData(i+1);
}
toc_("stack virtual alloc, dealloc, call");
tic_("shared plain alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
shared_ptr<Plain> obj(new Plain(i));
obj->setData(i+1);
}
toc_("shared plain alloc, dealloc, call");
tic_("shared virtual alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
shared_ptr<Virtual> obj(new Virtual(i));
obj->setData(i+1);
}
toc_("shared virtual alloc, dealloc, call");
tic_("intrusive virtual alloc, dealloc, call");
for(size_t i=0; i<trials; ++i) {
intrusive_ptr<VirtualCounted> obj(new VirtualCounted(i));
obj->setData(i+1);
}
toc_("intrusive virtual alloc, dealloc, call");
tictoc_print_();
return 0;
}