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);
}

运行结果#

image-20240530225127503

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

实现代码#

C语言索引遍历探究
https://tuoyuangui.github.io/website/posts/typora/gnu语言/c语言索引遍历探究/
作者
椭圆规/tuoyuangui
发布于
2023-09-12
许可协议
CC BY-NC-SA 4.0