【问题标题】:which is faster a 2D char array or a 1D array to char pointers?2D char 数组或 1D 数组到 char 指针哪个更快?
【发布时间】:2019-08-16 09:48:08
【问题描述】:

我只需要知道哪个数组更快:2D char 数组或 1D 数组到 char 指针。

例如:

char* name1[]={"Marc", "Jean-Marie", "Paul", ...}
char name2[][11]={"Marc", "Jean-Marie", "Paul", ...}

如果我有相同的代码可以对这些数组进行排序,那么哪一个会更快完成?

【问题讨论】:

  • 动态数组是什么意思?我在这里看不到任何动态分配。
  • 对不起,我的意思是一个指向 char 指针的数组,我会编辑它
  • 如果您打算对它们进行就地排序,那么name1 可能会更快,因为您可以交换指针。 name2 行将要求您移动整个字符串,而不仅仅是指向字符串的指针。
  • 你试过了吗?如果你真的需要对某些东西进行速度优化,那么就没有办法同时进行编程和测量。如果你只知道如何实现两者中的一个,那么先去尝试它是否真的值得优化,因为另一个不一定更快。
  • 是的,我稍后会这样做,但现在我只需要一个快速的答案。谢谢

标签: c arrays dynamic


【解决方案1】:

对第二种变体进行排序将需要使用中间缓冲区或逐字节/基于块的交换的字符串副本。这可能会比简单地移动指针“慢”。

相反,使用指向实际字符串文字的指针意味着仅在排序时交换指针。所以这可能会“更快”。

此外,很可能您的字符串文字将被编译器在内存中更紧密地打包在一起,这有助于缓存性能,假设您实际上想要对比 3 多得多的字符串进行排序。

但是,对于您给出的示例。这并不完全清楚。在具有较大本机类型(例如指针或特殊 SIMD 增强)的系统上,完全有可能将二维数组中的字符串交换优化到几乎无法测量差异的程度。虽然这高度依赖于底层内存架构,以及它是否非常关心对齐。

最后一点是,如果您有一个非常大的二维数组,则需要静态分配或在堆上分配,因为它可能不适合堆栈。

当然,您可能只是开始在非常大的数组大小上看到可测量的差异。使用 3 个字符串的示例非常荒谬。

【讨论】:

  • 当然你可以用malloc分配一个非常大的二维数组,即使是动态维度...
  • 对,当然。这是匆忙写的,解决了问题中概述的这些数组。为了完整起见,我将包含此内容。
【解决方案2】:

首先,对于这么少的元素,这真的无关紧要。两者都同样快。

但是当数组中有大量元素时,需要查看缓存访问。

对于name1,您有一个数组或指针。指针本身指向存储字符串文字 "Marc" Jean-Marie" 等的其他位置。这可能会导致无法正确缓存数组。

对于name2,字符串"Marc" 等被复制到数组中。这对于缓存可能更容易。但是,您应该注意,如果您有一个大数组,则第二种方法会导致更多的 RAM 使用。

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多