|
|
|
#include <memory> |
|
#include <vector> |
|
|
|
#include <chrono> |
|
#include <iostream> |
|
|
|
using namespace std; |
|
|
|
#define BENCH_COUNT 10000000 |
|
|
|
// benchmark for checking whether shared_ptr is equal before assigning |
|
|
|
// shared pointer assignment benchmark |
|
// M1 macbook (clang++): |
|
// Shared pointer assignment (equal) |
|
// Without check: 86ms |
|
// With check: 7ms |
|
|
|
// Shared pointer assignment (not equal) |
|
// Without check: 85ms |
|
// With check: 86ms |
|
|
|
template<class T> |
|
void AssignSharedPointer(shared_ptr<T> &target, const shared_ptr<T> &source) { |
|
if (target.get() != source.get()) { |
|
target = source; |
|
} |
|
} |
|
|
|
int main() { |
|
|
|
// allocate shared pointers |
|
vector<shared_ptr<int>> shared_bank; |
|
vector<shared_ptr<int>> assign; |
|
for(size_t i = 0; i < BENCH_COUNT; i++) { |
|
shared_bank.push_back(make_shared<int>(i)); |
|
assign.push_back(shared_bank[i]); |
|
} |
|
|
|
// dry run |
|
for(size_t i = 0; i < BENCH_COUNT; i++) { |
|
assign[i] = shared_bank[i]; |
|
} |
|
|
|
std::cout << "Shared pointer assignment (equal)\n"; |
|
|
|
auto start =chrono::system_clock::now(); |
|
for(size_t i = 0; i < BENCH_COUNT; i++) { |
|
assign[i] = shared_bank[i]; |
|
} |
|
auto end = chrono::system_clock::now(); |
|
|
|
auto elapsed = |
|
std::chrono::duration_cast<std::chrono::milliseconds>(end - start); |
|
std::cout << "Without check: " << elapsed.count() << "ms\n"; |
|
|
|
start =chrono::system_clock::now(); |
|
for(size_t i = 0; i < BENCH_COUNT; i++) { |
|
AssignSharedPointer(assign[i], shared_bank[i]); |
|
} |
|
end = chrono::system_clock::now(); |
|
|
|
elapsed = |
|
std::chrono::duration_cast<std::chrono::milliseconds>(end - start); |
|
std::cout << "With check: " << elapsed.count() << "ms\n"; |
|
|
|
|
|
std::cout << "Shared pointer assignment (not equal)\n"; |
|
|
|
// reset |
|
for(size_t i = 0; i < BENCH_COUNT - 1; i++) { |
|
assign[i] = shared_bank[i + 1]; |
|
} |
|
|
|
start =chrono::system_clock::now(); |
|
for(size_t i = 0; i < BENCH_COUNT - 1; i++) { |
|
assign[i] = shared_bank[i]; |
|
} |
|
end = chrono::system_clock::now(); |
|
|
|
elapsed = |
|
std::chrono::duration_cast<std::chrono::milliseconds>(end - start); |
|
std::cout << "Without check: " << elapsed.count() << "ms\n"; |
|
|
|
// reset |
|
for(size_t i = 0; i < BENCH_COUNT - 1; i++) { |
|
assign[i] = shared_bank[i + 1]; |
|
} |
|
|
|
start =chrono::system_clock::now(); |
|
for(size_t i = 0; i < BENCH_COUNT; i++) { |
|
AssignSharedPointer(assign[i], shared_bank[i]); |
|
} |
|
end = chrono::system_clock::now(); |
|
|
|
elapsed = |
|
std::chrono::duration_cast<std::chrono::milliseconds>(end - start); |
|
std::cout << "With check: " << elapsed.count() << "ms\n"; |
|
|
|
} |