간단히 살펴보고 []
연산자를 gcc -lstdc++ -std=c++14 -O0
위해이 결과를 사용하여 컴파일 하고 출력 한 다음 코드에서 설명하는 것처럼 원시 포인터보다 ~ 5 배 느립니다 .
malloc []: 414252610
unique [] is: 2062494135
uq get [] is: 238801500
uq.get()[] is: 1505169542
new is: 241049490
저는 C ++를 배우기 시작하고 있습니다. 저는 이것을 생각하고 있습니다. 당신은 항상 당신이 무엇을하고 있는지 알고 다른 사람들이 당신의 C ++에서 무엇을했는지 알기 위해 더 많은 시간을 할애해야합니다.
편집하다
@Mohan Kumar가 methioned에 따라 자세한 내용을 제공했습니다. gcc 버전은 7.4.0 (Ubuntu 7.4.0-1ubuntu1~14.04~ppa1)
, 위의 결과 -O0
는를 사용할 때 얻었지만 '-O2'플래그를 사용하면 다음과 같이 표시됩니다.
malloc []: 223
unique [] is: 105586217
uq get [] is: 71129461
uq.get()[] is: 69246502
new is: 9683
그런 다음에 이동 clang version 3.9.0
, -O0
했다 :
malloc []: 409765889
unique [] is: 1351714189
uq get [] is: 256090843
uq.get()[] is: 1026846852
new is: 255421307
-O2
였다:
malloc []: 150
unique [] is: 124
uq get [] is: 83
uq.get()[] is: 83
new is: 54
clang의 결과 -O2
는 놀랍습니다.
#include <memory>
#include <iostream>
#include <chrono>
#include <thread>
uint32_t n = 100000000;
void t_m(void){
auto a = (char*) malloc(n*sizeof(char));
for(uint32_t i=0; i<n; i++) a[i] = 'A';
}
void t_u(void){
auto a = std::unique_ptr<char[]>(new char[n]);
for(uint32_t i=0; i<n; i++) a[i] = 'A';
}
void t_u2(void){
auto a = std::unique_ptr<char[]>(new char[n]);
auto tmp = a.get();
for(uint32_t i=0; i<n; i++) tmp[i] = 'A';
}
void t_u3(void){
auto a = std::unique_ptr<char[]>(new char[n]);
for(uint32_t i=0; i<n; i++) a.get()[i] = 'A';
}
void t_new(void){
auto a = new char[n];
for(uint32_t i=0; i<n; i++) a[i] = 'A';
}
int main(){
auto start = std::chrono::high_resolution_clock::now();
t_m();
auto end1 = std::chrono::high_resolution_clock::now();
t_u();
auto end2 = std::chrono::high_resolution_clock::now();
t_u2();
auto end3 = std::chrono::high_resolution_clock::now();
t_u3();
auto end4 = std::chrono::high_resolution_clock::now();
t_new();
auto end5 = std::chrono::high_resolution_clock::now();
std::cout << "malloc []: " << (end1 - start).count() << std::endl;
std::cout << "unique [] is: " << (end2 - end1).count() << std::endl;
std::cout << "uq get [] is: " << (end3 - end2).count() << std::endl;
std::cout << "uq.get()[] is: " << (end4 - end3).count() << std::endl;
std::cout << "new is: " << (end5 - end4).count() << std::endl;
}