【发布时间】:2016-03-12 06:21:40
【问题描述】:
我比较了分配一维数组或二维数组的不同类型,如下所示。我发现使用 new 运算符效率更高,也许 std::arrary 和 std::vector 是一个对象,它们是通用的和安全的但更多时间?而且,我不知道为什么调用新的外部函数比调用内部函数更有效?
#include <iostream>
#include <vector>
#include <array>
#include <ctime>
void test1 () {
int *arr = new int[10000];
for (int i=0; i<10000; ++i) {
arr[i] = 3;
}
for (int i=0; i<10000; ++i) {
int a = arr[i];
}
delete arr;
}
void test11 () {
int **arr = new int*[100];
for (int i=0; i<100; ++i) {
arr[i] = new int[100];
}
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j) {
arr[i][j] = 3;
}
}
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j) {
int a = arr[i][j];
}
}
delete [] arr;
}
void test2() {
std::vector<int> arr(10000);
for (int i=0; i<10000; ++i) {
arr[i] = 3;
}
for (int i=0; i<10000; ++i) {
int a = arr[i];
}
}
void test22() {
std::vector<std::vector<int> > arr(100, std::vector<int>(100));
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j) {
arr[i][j] = 3;
}
}
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j) {
int a = arr[i][j];
}
}
}
void test3(int *arr, int n) {
for (int i=0; i<n; ++i) {
arr[i] = 3;
}
for (int i=0; i<n; ++i) {
int a = arr[i];
}
}
void test33(int **arr, int m, int n) {
for (int i=0; i<m; ++i) {
for (int j=0; j<n; ++j) {
arr[i][j] = 3;
}
}
for (int i=0; i<m; ++i) {
for (int j=0; j<n; ++j) {
int a = arr[i][j];
}
}
}
void test4() {
std::array<int, 10000> arr;
for (int i=0; i<10000; ++i) {
arr[i] = 3;
}
for (int i=0; i<10000; ++i) {
int a = arr[i];
}
}
void test44() {
std::array<std::array<int, 100>, 100> arr;
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j) {
arr[i][j] = 3;
}
}
for (int i=0; i<100; ++i) {
for (int j=0; j<100; ++j)
int a = arr[i][j];
}
}
int main() {
clock_t start, end;
start = clock();
for (int i=0; i<1000; ++i) {
test1();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
test11();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
test2();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
test22();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
int *arr = new int[10000];
test3(arr, 10000);
delete arr;
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
int **arr = new int*[100];
for (int i=0; i<100; ++i) {
arr[i] = new int[100];
}
for (int i=0; i<1000; ++i) {
test33(arr, 100, 100);
}
delete [] arr;
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
test4();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
start = clock();
for (int i=0; i<1000; ++i) {
test44();
}
end = clock();
std::cout << (double)(end - start) * 1000.0 / CLOCKS_PER_SEC << " ms" << std::endl;
}
输出是:
90 ms
80 ms
70 ms
120 ms
50 ms
40 ms
100 ms
190 ms
感谢您的帮助,也许我没有正确描述我的问题,我写了一个会多次调用的函数,这个函数新建一个数组然后删除它:
void fun() {
int *arr = new int[10000]; //maybe very big
//todo something else
delete arr;
}
有人告诉我效率不高,因为它每次都新建和删除,现在我有两个问题:
1.内存管理的正确方法是什么?
int *arr = new int[]; delete arr;
int **arr = new int*[]; delete [] arr;
错了?可能是这样的:
for (int i=0; i<n; ++i){
delete [] arr;
}
delete arr;
2.我编写这个函数的最佳方式是什么
【问题讨论】:
-
在比较任何东西之前,首先修复你的代码:你用
new[]分配的所有东西必须用delete[]释放。 -
您是否也在发布模式下编译并进行了全面优化?
-
"内存管理的正确方法是什么?" - 使用
std::vector. -
@Galik 在下面的 cmets 中说这些是调试构建基准。