【发布时间】:2021-07-03 11:53:29
【问题描述】:
在性能方面,使用智能指针与常规指针有优势还是劣势?
我正在运行以下代码,在发布和调试中使用 VS2019 编译。
这些是发布的结果:
Assign Ptr time = 0.3285ms
Assign Smart ptr time = 0.101ms
Sum Ptr = 126756464
Sum Smart Ptr = 126756464
Sum Ptr time = 0.2124ms
Sum Smart ptr time = 0.2912ms
这些是调试的结果:
Assign Ptr time = 1.8149ms
Assign Smart ptr time = 15.8177ms
Sum Ptr = 126756464
Sum Smart Ptr = 126756464
Sum Ptr time = 1.8392ms
Sum Smart ptr time = 15.9617ms
代码
#include <iostream>
#include <cstdio> // getchar
#include <chrono>
#define HEIGHT 1000
#define WIDTH 1000
int main(void)
{
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;
using std::chrono::duration;
using std::chrono::milliseconds;
uint8_t matrix[HEIGHT * WIDTH];
uint8_t* matrixPtr = new uint8_t[HEIGHT * WIDTH];
std::unique_ptr<uint8_t[]> matrixSmartPtr = std::make_unique<uint8_t[]>(HEIGHT * WIDTH);
int index = 0;
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
matrix[index] = rand() % 255;
index++;
}
}
index = 0;
auto t1 = high_resolution_clock::now();
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
matrixPtr[index] = matrix[index];
index++;
}
}
auto t2 = high_resolution_clock::now();
index = 0;
auto t3 = high_resolution_clock::now();
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
matrixSmartPtr.get()[index] = matrix[index];
index++;
}
}
auto t4 = high_resolution_clock::now();
/* Getting number of milliseconds as a double. */
duration<double, std::milli> ms_assign_n = t2 - t1;
duration<double, std::milli> ms_assign_s = t4 - t3;
std::cout << "Assign Ptr time = " << ms_assign_n.count() << "ms" << std::endl;
std::cout << "Assign Smart ptr time = " << ms_assign_s.count() << "ms" << std::endl;
int sumA = 0;
index = 0;
auto t5 = high_resolution_clock::now();
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
sumA += matrixPtr[index];
index++;
}
}
auto t6 = high_resolution_clock::now();
std::cout << "Sum Ptr = " << sumA << std::endl;
int sumB = 0;
index = 0;
auto t7 = high_resolution_clock::now();
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
sumB += matrixSmartPtr.get()[index];
index++;
}
}
auto t8 = high_resolution_clock::now();
std::cout << "Sum Smart Ptr = " << sumB << std::endl;
/* Getting number of milliseconds as a double. */
duration<double, std::milli> ms_sum_n = t6 - t5;
duration<double, std::milli> ms_sum_s = t8 - t7;
std::cout << "Sum Ptr time = " << ms_sum_n.count() << "ms" << std::endl;
std::cout << "Sum Smart ptr time = " << ms_sum_s.count() << "ms" << std::endl;
delete[] matrixPtr;
std::cout << "Press enter to finish" << std::endl;
std::getchar(); // Avoid program from exiting
return 0;
}
我不明白为什么在发布时,使用智能指针进行分配更快,但求和结果相似甚至更差。
为什么智能指针在调试模式下更差?
【问题讨论】:
-
可能只是缓存一致性
-
如果您查看编译后的输出,您可以看到
unique_ptr被编译出来,并且只是一个常规指针。您看到的任何差异都只是噪音(在发布模式下) -
In rare cases
unique_ptr会更慢。但它不应该让您担心,因为它提供的安全性超过了可能的微小性能影响。
标签: c++ performance pointers smart-pointers