316 字
2 分钟
C语言索引遍历探究
C语言索引遍历探究
# include "alloc_function.h"# include <stdio.h># include <stdlib.h># include <string.h>#include <limits.h># define TIMES 21
int main(){ clock_t t0, t1, t2; float *arr1d; float ***arr3d; float time_r; float sum; float *pointer; size_t N1=2000; size_t N2=1000; size_t N3=50; arr1d = alloc1float(N1*N2*N3); arr3d = alloc3float(N1,N2,N3); size_t N = N1*N2*N3; printf("N=%ld\n", N); printf("size_t=[0,%u]\n", UINT_MAX); printf("int =[%d,%d]\n", INT_MIN, INT_MAX);
// 1D array time_r=0.0f; for(size_t time=0; time<TIMES; time++){ t0 = clock(); sum = 0.0f; for(size_t i=0; i<N; i++) { arr1d[i] = 1e-6f; sum += arr1d[i]; } t1 = clock(); if (time>0) time_r += (float)(t1-t0)/1000000.0; } printf("1D array: %f \t %f\n", time_r,sum);
// 1D array pointer time_r=0.0f; for(size_t time=0; time<TIMES; time++){ t0 = clock(); sum = 0.0f; for(pointer = arr1d; pointer<arr1d+N; pointer++) { *pointer = 1e-6f; sum += *pointer; } t1 = clock(); if (time>0) time_r += (float)(t1-t0)/1000000.0; } printf("1D array pointer: %f \t %f \n", time_r, sum);
// 3D array Nonequential read time_r=0.0f; for(size_t time=0; time<TIMES; time++){ t0 = clock(); sum = 0.0f;
for(size_t i=0; i<N1; i++) { for(size_t j=0; j<N2; j++) { for(size_t k=0; k<N3; k++){ arr3d[k][j][i] = 1e-6f; sum += arr3d[k][j][i]; } } } t1 = clock(); if (time>0) time_r += (float)(t1-t0)/1000000.0; } printf("3D array Nonequential: %f \t %f\n", time_r, sum);
// 3D array Sequential read time_r=0.0f; for(size_t time=0; time<TIMES; time++){ t0 = clock(); sum = 0.0f;
for(size_t k=0; k<N3; k++) { for(size_t j=0; j<N2; j++) { for(size_t i=0; i<N1; i++){ arr3d[k][j][i] = 1e-6f; sum += arr3d[k][j][i]; } } } t1 = clock(); if (time>0) time_r += (float)(t1-t0)/1000000.0; } printf("3D array Sequential: %f \t %f\n", time_r, sum);
}运行结果

- 使用指针遍历,要比索引块快
%5;- 非顺序读写耗时约为顺序读写的
2.5倍;- 多维数组,没有一维数组快。