我有一个项目,我尝试为微控制器构建固件,并尝试更好地控制使用的优化标志。我想要,而不是使用-O
以下是我尝试的和不起作用的:
我知道我可以用
-O1
编译项目。所以我使用了-Q
和--help
标志来输出当我激活-O1
标志时激活的标志。我使用这些信息在我的构建过程中手动指定不同的标志,编译工作正常,但是在链接阶段失败了,因为. bss部分不再适合我的内存了(我只有384kByte可用)。
当我在链接器脚本中增加RAM大小时,链接可以正常工作,但最终会失败。bss部分被放置在416kbyte,二值图像比直接使用
-O1
时大75%。
当我比较gcc报告的标志和参数时,这两个版本之间没有区别,但是没有
-O1
的版本仍然要大得多。
根据GCC文档(GCC手册),
-O
标志是否仅激活特定的优化标志,因此也可以手动执行(或不执行?)
以下是我的gcc命令:
具有单一优化标志的GCC调用
gcc -std=c99 -msoft-float -fno-inline -fdata-sections -ffunction-sections -Wall -Wextra\
-faggressive-loop-optimizations -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments\
-fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdelete-null-pointer-checks\
-fdse -fearly-inlining -ffast-math -fforward-propagate -ffp-contract=fast -ffp-int-builtin-inexact\
-ffunction-cse -fgcse-lm -fguess-branch-probability -fhandle-exceptions -fif-conversion -fif-conversion2\
-finline-atomics -finline-functions-called-once -fipa-profile -fipa-pure-const -fipa-reference\
-fira-algorithm=CB -fira-hoist-pressure -fira-share-save-slots -fira-share-spill-slots -fivopts\
-fjump-tables -flifetime-dse -flifetime-dse=2 -fmath-errno -fmove-loop-invariants -fomit-frame-pointer\
-fpeephole -fplt -fprefetch-loop-arrays -fprintf-return-value -frename-registers -freorder-blocks
-frtti -fsched-critical-path-heuristic -fsched-dep-count-heuristic -fsched-group-heuristic\
-fsched-interblock -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic\
-fsched-stalled-insns-dep -fschedule-fusion -fshort-enums -fshrink-wrap -fshrink-wrap-separate\
-fsigned-zeros -fsplit-ivs-in-unroller -fsplit-wide-types -fssa-backprop -fssa-phiopt -fstack-reuse=all\
-fstdarg-opt -fstrict-volatile-bitfields -fno-threadsafe-statics -ftrapping-math -ftree-bit-ccp\
-ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim\
-ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-loop-if-convert -ftree-loop-im\
-ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=1 -ftree-phiprop -ftree-pta\
-ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -fvar-tracking -fvar-tracking-assignments\
-fweb -fmerge-constants -fno-associative-math -fno-cx-limited-range -fno-exceptions -fno-finite-math-only\
-fno-reciprocal-math -fno-unsafe-math-optimizations -fexcess-precision=standard -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz\
-fno-builtin-strtok -c -o timer.o timer.c
GCC与
-O1
gcc -O1 -std=c99 -msoft-float -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz -fno-builtin-strtok -c -o timer.o timer.c
如果需要,我也可以提供gcc的输出,看看在这两种情况下哪些标志是活动的。我发现的唯一区别是,
-foverce-精度
被设置为-O1
的默认值。我尝试了两种可能性(快速和标准),但这没有任何区别。
有人知道
-O
选项另外激活了我忽略的什么魔法吗?
根据GCC手册
Most optimizations are only enabled if an -O level is set on the command line.
Otherwise they are disabled, even if individual optimization flags are specified.
因此,仅指定优化标志是不够的。例如,在这里,您可以看到,只有同时启用了-O
和-fweb
时,才会启用某些分析:
class pass_web : public rtl_opt_pass
{
...
virtual bool gate (function *) { return (optimize > 0 && flag_web); }
即使指定-O1
并选择性地从更高的优化级别启用优化,也不会可靠地工作,因为某些传递显式地依赖于-O
值。例如,在这里您可以看到CSE优化的部分在-O1
处被禁用:
else if (tem == 1 || optimize > 1)
cse_cfg_altered |= cleanup_cfg (0);
存在与循环有关的问题。为什么?也许是虫子? 我使用的是最新的4.8.0,经过测试的x64、x86以及其他版本。都是同样的行为。
我试图找出关键的优化选项。首先,用 -Q-v列出了启用的标志(-faggressive loop optimizations-falign labels-fasynchronous unwind tables等)。然后,如果将这些标志直接提供给gcc而不是-O3,那么如果禁用了优化,则生成的程序的性能将降低。 gcc文件指出 并不是所有的优化都由一个标志直接控制 会是这个问题还是我错过了其他的?
我正在使用GCC4.4.2构建一些大型项目。因为我想构建它以供发布,所以我使用了GCC优化标志,但不幸的是,它在某种程度上弄乱了我的代码,最终的二进制文件没有按照预期工作,当使用标志(或没有优化)构建时,一切都很好。我之前的项目也有类似的问题,当时是标志在优化级别上造成了问题,我通过搜索本文档中提到的所有标志,就优化级别而言,设法发现它是由该特定标志引起的: http://gcc.gnu.org/
我正在尝试创建一个小的PDF文件,嵌入一个优化的PNG图像显示为3页PDF的页眉和页脚(相同的图像必须在PDF中显示6倍) 我优化的PNG映像只有2.3KB。看起来很锋利。 我还尝试制作一个测试页面,并使用wkhtml2pdf,但它做了同样的事情。添加低质量标志没有任何区别。 PDF规范建议支持PNG? 从略读PDF规范,它看起来像是支持PNG图像。
我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?
问题内容: 我有一个脚本,它通过自定义ORM生成数以万计的插入Postgres数据库中。可以想象,它非常慢。这用于开发目的,以便创建伪数据。我可以在Postgres级别上进行简单的优化以使其更快吗?它是唯一按顺序运行的脚本,不需要线程安全。 也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一种快速而肮脏的解决方案,可以大大加快这一过程。 谢谢。 问题答案: 如果您在生产环境中不需要这种功能,建