Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C数组的哪种数据组织生成的代码最快?为什么?_C_Arrays_Pointers_Data Structures_Struct - Fatal编程技术网

使用C数组的哪种数据组织生成的代码最快?为什么?

使用C数组的哪种数据组织生成的代码最快?为什么?,c,arrays,pointers,data-structures,struct,C,Arrays,Pointers,Data Structures,Struct,给定以下数据,组织元素数组的最佳方法是什么,以便能够以最快的速度进行随机访问 每个元素都有一些整数、一个由3个字符组成的名称(末尾为“\0”)和一个浮点值 我认为有两种可能的方法可以组织和访问这样的阵列: 第一: typedef struct { int num; char name[4]; float val; } t_Element; t_Element array[900000000]; //random access: num = array[i].num; name = array[i

给定以下数据,组织元素数组的最佳方法是什么,以便能够以最快的速度进行随机访问

每个元素都有一些整数、一个由3个字符组成的名称(末尾为“\0”)和一个浮点值

我认为有两种可能的方法可以组织和访问这样的阵列:

第一:

typedef struct { int num; char name[4]; float val; } t_Element;
t_Element array[900000000];
//random access:
num = array[i].num;
name = array[i].name;
val = array[i].val;
//sequential access:
some_cycle:
  num = array[i].num
  i++;
第二:

#define NUMS 0
#define NAMES 1
#define VALS 2
#define SIZE (VALS+1)
int array[SIZE][900000000];
//random access:
num = array[NUMS][i];
name = (char*) array[NAMES][i];
val = (float) array[VALS][i];
//sequential access:
p_array_nums = &array[NUMS][i];
some_cycle:
  num = *p_array_nums;
  p_array_nums++;  

我的问题是,什么方法更快,为什么?我的第一个想法是第二种方法生成最快的代码并允许最快的块复制,但我怀疑它是否比第一种方法节省了任何敏感的CPU指令数?

第一种方法可能更快,因为内存访问延迟将是性能的主要因素。理想情况下,您应该按顺序连续访问内存,以充分利用加载的缓存线并减少缓存未命中

当然,访问模式在任何此类讨论中都是至关重要的,这就是为什么有时使用SoA(阵列结构)和其他时候使用AoS(结构阵列)会更好,至少在性能至关重要的时候


当然,大多数时候你不应该担心这些事情(过早的优化等等)。

不可能。与任何与性能相关的测试一样,答案会因操作系统、CPU、内存、编译器等的一个或多个不同而有所不同


所以你需要自己测试一下。设置性能目标、测量、优化、重复。

这取决于常见的访问模式。如果您计划对数据进行迭代,在执行过程中访问每个元素,那么
struct
方法会更好。如果您计划在每个组件上独立迭代,那么并行数组更好

这也不是一个微妙的区别。由于主内存通常比一级缓存慢两个数量级左右,因此使用适合使用模式的数据结构可能会使性能提高三倍

不过,我必须说,您实现并行阵列的方法还有很多需要改进的地方。您应该简单地声明三个数组,而不是通过二维数组和强制转换获得“聪明”:

int nums[900000000];
char names[900000000][4];
float vals[900000000];

你对
大小的定义在我看来是假的。你什么意思?@Jens:我的输入错误应该是Vals,我希望以后每个元素中都有更多属性,所以我更喜欢2d数组。@psihodelia:根据需要声明更多数组有什么不对?另外,如果您要存储的下一个内容不适合四个字节,会导致2d数组的使用速度变慢吗?@psihodelia:您考虑了整个性能问题。二维阵列中的随机访问与多个一维阵列中的随机访问之间的差异可以忽略不计。如果你甚至可以测量差异,我会感到惊讶,如果你可以,如果2D速度变慢,我也不会感到惊讶……重申一下,缓存利用率是一个更重要的考虑因素,当谈到低水平的表现时。@Jim:我最近经常听到这种情况——我不知道我是否得罪了某人,也不知道这只是随机的“开车经过”投票,但无论哪种方式都有点令人恼火。无论哪种方式,这都是不道德的行为。