我有一个C程序,其中有一个用链表实现的树(child-> parent和sibling-> sibling)。
我对编译器优化非常环保。我已经看过并阅读过关于O-O3的内容,我认为我已经阅读过关于加速嵌套for循环等的内容。
如果我想通过树实现提高性能,我是否需要开始考虑重新实现它?或许我可以扼杀编译器?
答案 0 :(得分:2)
编译器优化不会将您的数据结构更改为其他内容。你得到的最好的是一个本地数组变量完全保存在寄存器中并进行优化。
理论上,对于整个程序的优化,编译器可以弄清楚你正在对数据结构做什么,并使用更好的数据结构。在实践中,如果我们有这个,我们只是简单地处理一些自然语言处理,我们有一个AI来编写基于英语描述的类/库。
最好的办法是使用-O3
。或-Ofast
如果-ffast-math
和类似的“不安全”优化都可以。更好的是:使用-profile-generate
和-fprofile-use
来优化基于哪些循环运行很多,分支通常采用哪种方式,以及类似的东西。这将使编译器尽可能地做到最小化算法运行时中的任何常量因素。
要改善最坏情况的查找时间,您需要更改算法。多种树中的任何一种都涉及重新平衡以避免退化情况,或完全不同的数据结构(例如哈希表)。