One day I finally became tired of mallocing and freeing a memory by hand, and decided to move to modern c++ unique_ptr constructions. Is that more time-consuming under a pressure? Absolutely not, and here is the synthetic test:
int main(int argc, const char * argv[])
{
const size_t sizes_amount = 256;
const size_t runs = 16*1024*1024;
size_t sizes[sizes_amount];
mt19937 mt((random_device())());
uniform_int_distribution<size_t> dist(0, 1024*1024);
for(auto &i: sizes)
i = dist(mt);
// test malloc/free and c pointers
auto t0 = high_resolution_clock::now();
for(int i = 0; i < runs; ++i) {
void *v = malloc(sizes[i % sizes_amount]);
/*Fake(v);use some empty fake function from another file so optimizer won’t throw this cycle away.*/
free(v);
}
// test unique_ptr + new uint8_t[]
auto t1 = high_resolution_clock::now();
for(int i = 0; i < runs; ++i) {
unique_ptr<uint8_t[]> v(new uint8_t[ sizes[i % sizes_amount] ]);
/*Fake(v);use some empty fake function from another file so optimizer won’t throw this cycle away.*/
v.reset();
}
auto t2 = high_resolution_clock::now();
printf(“malloc/free + c pointers: %lldn”, duration_cast<milliseconds>(t1 – t0).count());
printf(“new/detele + unique_ptr: %lldn”, duration_cast<milliseconds>(t2 – t1).count());
return 0;
}
Results are quite promising, performance is just similar, with a much less error prone code:
malloc/free + c pointers | new/detele + unique_ptr |
---|---|
5225 | 5200 |
5673 | 5427 |
5469 | 5653 |
5688 | 5624 |
6100 | 5497 |
5720 | 5640 |
5767 | 5854 |
5450 | 5626 |
5545 | 5631 |
5816 | 6199 |