C:使用很多结构可以使程序变慢?

时间:2010-05-28 01:01:48

标签: c performance struct

我正在编写一个突破性克隆。我有一个版本,其中我只有一层深度的结构。此版本以70 fps运行。

为了在代码中更清晰,我决定代码应该有更多的抽象并创建更多的结构。大多数时候我有两个两层三层深的结构。此版本以30 fps运行。

由于除了结构之外还有其他一些差异,我问你:在C中使用大量结构会显着减慢代码吗?

例如在第二个版本上,我正在使用:

struct Breakout
{
   Ball ball;
   Paddle paddle;
   Level* levels;
}

struct Level
{
   Bricks* bricks;
}

所以,我使用了很多次breakout.levels [level_in_play] .bricks [i] .visible例如。这可能是一个原因吗?

感谢。

4 个答案:

答案 0 :(得分:11)

执行大量指针解除引用可能会影响性能。当你将一个大型结构拆分成较小的结构时,会发生两件事:

  1. 访问子结构的成员需要额外的指针取消引用和内存提取,这稍微慢一些,并且
  2. 您可以减少locality of reference,这会导致更多缓存未命中和页面错误,并且可能会大幅降低性能。
  3. 参考地点的位置可能就是在这里咬你的东西。如果可能的话,尝试在同一个malloc块中分配相关的结构,这会增加它们被缓存在一起的可能性。

答案 1 :(得分:4)

首先,猜测问题是什么很容易和诱人。关于猜测的偷偷摸摸的事情是 - 他们有时是正确的。但是为什么猜测,当你能找到堕落的时候确定是什么花时间。 I recommend this approach.

那就是说,这是我的猜测。 mallocfree,如果您在汇编语言级别单步执行它们,可能比您想象的要多得多。我只为结构分配内存,如果我知道我不会以特别高的频率进行。如果我必须以高频率动态分配/解除分配它们,那么有一个免费的已用副本列表是有帮助的,所以我可以从列表中取出它们而不是去malloc所有时间。

尽管如此,请拍一些照片。您可以更快地修复一系列问题并使其成为整批

答案 2 :(得分:4)

添加额外的解除引用层可能会导致一点(非常少)的减速开销。原因是,每个 - >编译器看到它意味着它必须进行额外的内存查找和偏移。例如,c->b->a要求编译器将指针c加载到内存中,引用它,偏移到b,取消引用,偏移到a,取消引用,然后将a加载到内存中。这是相当多的记忆工作。执行c.b.a需要初始加载c,一次添加,然后从内存直接加载。那是2次加载而不是5次。

除非在小而紧的环路中进行这种类型的工作,否则它不会蹲下来。如果你在沉重的内部循环中这样做(并且你的编译器没有帮助你),那么它可以加起来。对于这些情况,请考虑缓存最低级别的结构指针并从那里开始工作。

也就是说,无论何时提出表现,第一步都是剖析。没有个人资料,你猜。你已经断言struct derefencing是你性能的根源,但没有最新且有效的配置文件(在发布版本上)你猜测并且可能浪费时间。

答案 3 :(得分:1)

本身并不是“很多结构”,而是存在更多内存访问的可能性。然而,“许多间接”更可能是一个原因。您必须考虑生成多少内存访问才能获取实际数据。数据接近度和大小也可能会影响缓存,但分析起来要困难得多。

此外,由于您在评论中提到您正在执行动态内存分配,因此查找分配块所花费的时间是非确定性且可变的。如果在执行算法期间重复分配和释放块(而不是在初始化时预分配),这可能会导致性能下降和变化。

如果您有分析工具,请对代码进行分析,以查看性能影响发生的位置。