Почему std :: move () метода unique_ptr для функции void для сброса указателя занимает меньше времени, чем вызов явного unique_ptr.reset () - PullRequest
0 голосов
/ 25 февраля 2020

Я сделал эти PoC, чтобы выяснить, какой самый быстрый способ освободить память unique_ptr:

#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
#include <cstdlib>
#include <memory>

void freePointer(std::unique_ptr<int> aPointer){
    // The unique ptr memory is released here
}

int main ()
{
  using namespace std::chrono;

  // POC1
  std::unique_ptr<int> pointer (new int(3));
  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  pointer.reset();
  high_resolution_clock::time_point t2 = high_resolution_clock::now();
  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
  std::cout << "POC1: It took me " << time_span.count() << " seconds." << std::endl;

  // POC2
  std::unique_ptr<int> pointer2 (new int(3));
  high_resolution_clock::time_point t3 = high_resolution_clock::now();
  freePointer(std::move(pointer2));
  high_resolution_clock::time_point t4 = high_resolution_clock::now();
  duration<double> time_span2 = duration_cast<duration<double>>(t4 - t3);
  std::cout << "POC2: It took me " << time_span2.count() << " seconds." << std::endl;
  return 0;
}

Выход:

POC1: у меня ушло 2,557 e-06 секунд .
POC2: Мне потребовалось 5.07e-07 секунд.

Существует разница в величине разницы между PoX, и я не понимаю причину.

Может кто-нибудь дать мне свет?

1 Ответ

1 голос
/ 25 февраля 2020
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
#include <cstdlib>
#include <memory>
#include <vector>

void freePointer(std::unique_ptr<int> aPointer){
    // The unique ptr memory is released here
}

int main ()
{
  using namespace std::chrono;

  // POC1
  std::vector<std::unique_ptr<int>> pointers;
  for(int i=0;i<10000;++i) {
      pointers.emplace_back(new int(3));
  }
  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  for(int i=0;i<10000;++i) {
      pointers[i].reset();
  }
  high_resolution_clock::time_point t2 = high_resolution_clock::now();
  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
  std::cout << "POC1: It took me " << time_span.count() << " seconds." << std::endl;

  // POC2
  std::vector<std::unique_ptr<int>> pointers2;
  for(int i=0;i<10000;++i) {
      pointers2.emplace_back(new int(3));
  }
  high_resolution_clock::time_point t3 = high_resolution_clock::now();
  for(int i=0;i<10000;++i) {
        freePointer(std::move(pointers2[i]));
  }
  high_resolution_clock::time_point t4 = high_resolution_clock::now();
  duration<double> time_span2 = duration_cast<duration<double>>(t4 - t3);
  std::cout << "POC2: It took me " << time_span2.count() << " seconds." << std::endl;

  return 0;
}

После тестирования в онлайн-компиляторе результаты показывают, что POC2 медленнее, но результат неубедительный, так как были ситуации, когда POC1 был медленнее.

POC1: потребовалось me 0,000578603 секунды.
POC2: Мне потребовалось 0,00146163 секунды.

Для одного запуска вы заменяете ордер, сначала POC2, а затем POC1, второй будет самым медленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...