Skip to content

Instantly share code, notes, and snippets.

@Mytherin
Last active June 19, 2021 12:14
Show Gist options
  • Save Mytherin/4db3faa8e233c4a9b874b21f62bb4b96 to your computer and use it in GitHub Desktop.
Save Mytherin/4db3faa8e233c4a9b874b21f62bb4b96 to your computer and use it in GitHub Desktop.
Shared pointer assignment benchmark
#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";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment