gpt4 book ai didi

C++:结构访问速度比基本变量慢?

转载 作者:IT老高 更新时间:2023-10-28 22:33:14 25 4
gpt4 key购买 nike

我发现了一些像这样“优化”的代码:

void somefunc(SomeStruct param){
float x = param.x; // param.x and x are both floats. supposedly this makes it faster access
float y = param.y;
float z = param.z;
}

并且评论说它会使变量访问更快,但我一直认为structs元素访问和它毕竟不是struct一样快。

有人能帮我解决这个问题吗?

最佳答案

通常的优化规则 (Michael A. Jackson) 适用:1. 不要这样做。2.(仅供专家引用:)先别做。

话虽如此,让我们假设它是最内部的循环,它占用了性能关键型应用程序 80% 的时间。即便如此,我怀疑你永远不会看到任何不同。让我们以这段代码为例:

struct Xyz {
float x, y, z;
};

float f(Xyz param){
return param.x + param.y + param.z;
}

float g(Xyz param){
float x = param.x;
float y = param.y;
float z = param.z;
return x + y + z;
}

Running it through LLVM显示:仅在没有优化的情况下,两者按预期运行(g 将结构成员复制到局部变量中,然后对它们求和;f 对从 param 获取的值求和 直接)。使用标准优化级别,两者都会产生相同的代码(提取一次值,然后将它们相加)。

对于短代码,这种“优化”实际上是有害的,因为它不必要地复制了 float 。对于在多个地方使用成员的更长的代码,如果你主动告诉你的编译器是愚蠢的,它可能会有所帮助。添加 65 个(而不是 2 个)成员/本地成员的快速测试证实了这一点:在没有优化的情况下,f 重复加载结构成员,而 g 重用已提取的本地成员.优化版本再次相同,并且都只提取一次成员。 (令人惊讶的是,即使启用了 LTO,将加法转换为乘法也没有降低强度,但这只是表明所使用的 LLVM 版本并没有进行过于激进的优化 - 所以它在其他编译器中应该也能正常工作。)

所以,底线是:除非您知道您的代码必须由一个非常愚蠢和/或古老的编译器编译,以至于它不会优化任何东西,您现在有证据编译器将使两种方式等效,因此可以消除以性能为名犯下的破坏可读性和酿造的罪行。 (如有必要,为您的特定编译器重复实验。)

关于C++:结构访问速度比基本变量慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com