clang/gcc 可以优化 linked-list 树吗?
Can clang/gcc optimize linked-list trees?
我有一个 C 程序,它有一个用 linked-lists 实现的树(child->parent 和 sibling->sibling)。
我对编译器优化非常陌生。我看过并读过有关 O-O3 的文章,我想我已经读过有关加速嵌套 for 循环等的文章。
如果我想通过我的树实现提高性能,我是否需要开始考虑重新实现它?或者我可以直接处理编译器?
编译器优化不会将您的数据结构更改为其他内容。你会得到的最好的是一个局部数组变量被完全保存在寄存器中并被优化掉。
从理论上讲,通过全程序优化,编译器可以弄清楚您在使用数据结构做什么,并使用更好的数据结构。在实践中,如果我们有它,我们只需添加一些自然语言处理,我们就会有一个 AI 来编写 类/基于英语描述的库。
您最好的选择是使用 -O3
。或者 -Ofast
如果 -ffast-math
和类似的 "unsafe" 优化没问题。更好的是:使用 -profile-generate
和 -fprofile-use
来优化基于哪些循环 运行 很多,分支通常走哪条路,等等。这将使编译器尽可能地减少算法 运行 时间内的任何常数因子。
要缩短最坏情况下的查找时间,您确实需要更改算法。涉及重新平衡以避免退化情况的多种树中的一种,或者完全不同的数据结构(例如哈希 table)。
我有一个 C 程序,它有一个用 linked-lists 实现的树(child->parent 和 sibling->sibling)。
我对编译器优化非常陌生。我看过并读过有关 O-O3 的文章,我想我已经读过有关加速嵌套 for 循环等的文章。
如果我想通过我的树实现提高性能,我是否需要开始考虑重新实现它?或者我可以直接处理编译器?
编译器优化不会将您的数据结构更改为其他内容。你会得到的最好的是一个局部数组变量被完全保存在寄存器中并被优化掉。
从理论上讲,通过全程序优化,编译器可以弄清楚您在使用数据结构做什么,并使用更好的数据结构。在实践中,如果我们有它,我们只需添加一些自然语言处理,我们就会有一个 AI 来编写 类/基于英语描述的库。
您最好的选择是使用 -O3
。或者 -Ofast
如果 -ffast-math
和类似的 "unsafe" 优化没问题。更好的是:使用 -profile-generate
和 -fprofile-use
来优化基于哪些循环 运行 很多,分支通常走哪条路,等等。这将使编译器尽可能地减少算法 运行 时间内的任何常数因子。
要缩短最坏情况下的查找时间,您确实需要更改算法。涉及重新平衡以避免退化情况的多种树中的一种,或者完全不同的数据结构(例如哈希 table)。