GCCの最適化オプションは "-O3"までしかない
ここ十数年ぐらいの GCCの最適化は "-O3"までありません。
稀に "-O3"より大きい、"-O4"等を見るけど、それは結局 "-O3"に
されてしまいます。
追記
なお最高速度のオプションは "-Ofast"です。ただこれは規約に
沿わない形での最適化も含まれます。大部分は問題無いと思い
ますが、利用する場合は一応注意した方がよいでしょう。
GCC 4.8 snapshotのソースコードで確認したところ、一応内部的には保持
されていますが、結局最大で 3との比較しかないので意味がありません。
(255以上だと 255以上にされます)
大昔は "-O6"まであったという話ですが、今はありません。
将来的にどうなるか知りませんが、意図しないことをされないように
"-O3"までをつけるのが無難でしょう。
各オプションの違いを知る。
GCCの各オプティマイズレベルで有効になる最適化を調べる - Life is very short
最適化オプションと"--help=optimizers"でどのオプションが有効に
なるか確認できますので、それの差分を取ればよいでしょう。
% gcc --version gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc -Q -O2 --help=optimizers > O2.list % gcc -Q -O3 --help=optimizers > O3.list % diff -u O2.list O3.list --- O2.list 2012-12-11 21:14:46.475241940 +0900 +++ O3.list 2012-12-11 21:14:50.627241794 +0900 @@ -36,7 +36,7 @@ -ffloat-store [無効] -fforward-propagate [有効] -fgcse [有効] - -fgcse-after-reload [無効] + -fgcse-after-reload [有効] -fgcse-las [無効] -fgcse-lm [有効] -fgcse-sm [無効] @@ -46,11 +46,11 @@ -fif-conversion [有効] -fif-conversion2 [有効] -finline-atomics [有効] - -finline-functions [無効] + -finline-functions [有効] -finline-functions-called-once [有効] -finline-small-functions [有効] -fipa-cp [有効] - -fipa-cp-clone [無効] + -fipa-cp-clone [有効] -fipa-matrix-reorg [無効] -fipa-profile [有効] -fipa-pta [無効] @@ -80,7 +80,7 @@ -fpeel-loops [無効] -fpeephole [有効] -fpeephole2 [有効] - -fpredictive-commoning [無効] + -fpredictive-commoning [有効] -fprefetch-loop-arrays [有効] -freg-struct-return [無効] -fregmove [有効] @@ -142,7 +142,7 @@ -ftree-dse [有効] -ftree-forwprop [有効] -ftree-fre [有効] - -ftree-loop-distribute-patterns [無効] + -ftree-loop-distribute-patterns [有効] -ftree-loop-distribution [無効] -ftree-loop-if-convert [有効] -ftree-loop-if-convert-stores [無効] @@ -150,7 +150,7 @@ -ftree-loop-ivcanon [有効] -ftree-loop-optimize [有効] -ftree-lrs [無効] - -ftree-partial-pre [無効] + -ftree-partial-pre [有効] -ftree-phiprop [有効] -ftree-pre [有効] -ftree-pta [有効] @@ -163,14 +163,14 @@ -ftree-tail-merge [有効] -ftree-ter [有効] -ftree-vect-loop-version [有効] - -ftree-vectorize [無効] + -ftree-vectorize [有効] -ftree-vrp [有効] -funit-at-a-time [有効] -funroll-all-loops [無効] -funroll-loops [無効] -funsafe-loop-optimizations [無効] -funsafe-math-optimizations [無効] - -funswitch-loops [無効] + -funswitch-loops [有効] -funwind-tables [無効] -fvar-tracking [有効] -fvar-tracking-assignments [有効]
O4で試してみる
% gcc -Q -O3 --help=optimizers > O3.list % gcc -Q -O4 --help=optimizers > O4.list % diff -u O3.list O4.list % # 同じなので差分はでません。
Emacs 24以上を使うなら color-themeではなく、Emacsの themeフレームワークを使おう
color-themeでEmacsの見た目をきれいにする - Qiita
Emacs 24以上を使っているという前提があるのですが、独自のテーマを作る場合は
color-themeより、Emacs 24から導入された themeフレームワークを使う
ことをおすすめです。
機能的には変わらないと思うのですが、color-themeをインストール
する必要がないというのがお手軽です。~/.emacs.d以下においておけば、
load-theme関数を使って利用することができます。
サンプル
試しに @kubosho_さんの molokaiを themeフレームワーク版に
書き換えてみました。コードはほとんど同じです。カーソル等のごく一部の
パラメータの指定が違うのと、各項目を quoteするぐらいです。
(deftheme molokai "Molokai color theme") (custom-theme-set-faces 'molokai ;; 背景・文字・カーソル '(cursor ((t (:foreground "#F8F8F0")))) '(default ((t (:background "#1B1D1E" :foreground "#F8F8F2")))) ;; 選択範囲 '(region ((t (:background "#403D3D")))) ;; モードライン '(mode-line ((t (:foreground "#F8F8F2" :background "#000000" :box (:line-width 1 :color "#000000" :style released-button))))) '(mode-line-buffer-id ((t (:foreground nil :background nil)))) '(mode-line-inactive ((t (:foreground "#BCBCBC" :background "#333333" :box (:line-width 1 :color "#333333"))))) ;; ハイライト '(highlight ((t (:foreground "#000000" :background "#C4BE89")))) '(hl-line ((t (:background "#293739")))) ;; 関数名 '(font-lock-function-name-face ((t (:foreground "#FFFFFF")))) ;; 変数名・変数の内容 '(font-lock-variable-name-face ((t (:foreground "#FFFFFF")))) '(font-lock-string-face ((t (:foreground "#E6DB74")))) ;; 特定キーワード '(font-lock-keyword-face ((t (:foreground "#F92672")))) ;; Boolean '(font-lock-constant-face((t (:foreground "#AE81BC")))) ;; 括弧 '(show-paren-match-face ((t (:foreground "#1B1D1E" :background "#FD971F")))) '(paren-face ((t (:foreground "#A6E22A" :background nil)))) ;; コメント '(font-lock-comment-face ((t (:foreground "#74715D")))) ;; CSS '(css-selector ((t (:foreground "#66D9EF")))) '(css-property ((t (:foreground "#FD971F")))) ;; nXML-mode ;; タグ名 '(nxml-element-local-name ((t (:foreground "#F92672")))) ;; 属性 '(nxml-attribute-local-name ((t (:foreground "#66D9EF")))) ;; 括弧 '(nxml-tag-delimiter ((t (:foreground "#A6E22A")))) ;; DOCTYPE宣言 '(nxml-markup-declaration-delimiter ((t (:foreground "#74715D")))) ;; dired '(dired-directory ((t (:foreground "#A6E22A")))) '(dired-symlink ((t (:foreground "#66D9EF")))) ;; MMM-mode '(mmm-default-submode-face ((t (:foreground nil :background "#000000"))))) ;;;###autoload (when load-file-name (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name)))) (provide-theme 'molokai)
themeをロードするための設定
(load-theme 'molokai t) (enable-theme 'molokai)
GCC 4.7の最適化オプション比較表
GCCの各オプティマイズレベルで有効になる最適化を調べる - Life is very short
の GCC 4.7版。"-Ofast"を追加しました。"-Ofast"は規約を一部
無視した最適化を行うようです。"-O3"より高速になるよう意図
されています。
なお GCC 4.8では "-Og"という最適化とデバッグ機能を兼ね備えた
オプションが追加されるそうです。需要がわかりづらいですが・・・。
表生成スクリプト
#!/usr/bin/env perl use strict; use warnings; $ENV{LANG} = 'C'; my @levels = qw(-O0 -O1 -O2 -O3 -Os -Ofast); my @base = qw(gcc -- -Q --help=optimizers); my %optimize; for my $level (@levels) { my @cmd = @base; $cmd[1] = $level; open my $fh, "-|", @cmd or die "Can't exec @cmd"; while (my $line = <$fh>) { chomp $line; next unless $line =~ m{(?:enabled|disabled)}; if ($line =~ m{(\S+) \s+ \[ ([^\]]+) \]}xms) { my ($option, $flag) = ($1, $2); if ($flag eq 'enabled') { $optimize{$level}->{$option} = 1; } else { $optimize{$level}->{$option} = 0; } } } close $fh; } print "|*|"; print "*$_|" for @levels; print "\n"; for my $key (sort keys %{$optimize{'-O0'}}) { print "|$key|"; for my $level (@levels) { printf "%s|", $optimize{$level}->{$key} == 1 ? "o" : 'x'; } print "\n"; }
比較表
-O0 | -O1 | -O2 | -O3 | -Os | -Ofast | |
---|---|---|---|---|---|---|
-falign-functions | x | x | o | o | o | o |
-falign-jumps | x | x | o | o | o | o |
-falign-labels | x | x | o | o | o | o |
-falign-loops | x | x | o | o | o | o |
-fasynchronous-unwind-tables | o | o | o | o | o | o |
-fbranch-count-reg | o | o | o | o | o | o |
-fbranch-probabilities | x | x | x | x | x | x |
-fbranch-target-load-optimize | x | x | x | x | x | x |
-fbranch-target-load-optimize2 | x | x | x | x | x | x |
-fbtr-bb-exclusive | x | x | x | x | x | x |
-fcaller-saves | x | x | o | o | o | o |
-fcombine-stack-adjustments | x | o | o | o | o | o |
-fcommon | o | o | o | o | o | o |
-fcompare-elim | x | o | o | o | o | o |
-fconserve-stack | x | x | x | x | x | x |
-fcprop-registers | x | o | o | o | o | o |
-fcrossjumping | x | x | o | o | o | o |
-fcse-follow-jumps | x | x | o | o | o | o |
-fcx-fortran-rules | x | x | x | x | x | x |
-fcx-limited-range | x | x | x | x | x | o |
-fdata-sections | x | x | x | x | x | x |
-fdce | o | o | o | o | o | o |
-fdefer-pop | x | o | o | o | o | o |
-fdelayed-branch | x | x | x | x | x | x |
-fdelete-null-pointer-checks | o | o | o | o | o | o |
-fdevirtualize | x | x | o | o | o | o |
-fdse | o | o | o | o | o | o |
-fearly-inlining | o | o | o | o | o | o |
-fexceptions | x | x | x | x | x | x |
-fexpensive-optimizations | x | x | o | o | o | o |
-ffinite-math-only | x | x | x | x | x | o |
-ffloat-store | x | x | x | x | x | x |
-fforward-propagate | x | o | o | o | o | o |
-fgcse | x | x | o | o | o | o |
-fgcse-after-reload | x | x | x | o | x | o |
-fgcse-las | x | x | x | x | x | x |
-fgcse-lm | o | o | o | o | o | o |
-fgcse-sm | x | x | x | x | x | x |
-fgraphite-identity | x | x | x | x | x | x |
-fguess-branch-probability | x | o | o | o | o | o |
-fif-conversion | x | o | o | o | o | o |
-fif-conversion2 | x | o | o | o | o | o |
-finline-atomics | o | o | o | o | o | o |
-finline-functions | x | x | x | o | o | o |
-finline-functions-called-once | x | o | o | o | o | o |
-finline-small-functions | x | x | o | o | o | o |
-fipa-cp | x | x | o | o | o | o |
-fipa-cp-clone | x | x | x | o | x | o |
-fipa-matrix-reorg | x | x | x | x | x | x |
-fipa-profile | x | o | o | o | o | o |
-fipa-pta | x | x | x | x | x | x |
-fipa-pure-const | x | o | o | o | o | o |
-fipa-reference | x | o | o | o | o | o |
-fipa-sra | x | x | o | o | o | o |
-fivopts | o | o | o | o | o | o |
-fjump-tables | o | o | o | o | o | o |
-floop-block | x | x | x | x | x | x |
-floop-flatten | x | x | x | x | x | x |
-floop-interchange | x | x | x | x | x | x |
-floop-parallelize-all | x | x | x | x | x | x |
-floop-strip-mine | x | x | x | x | x | x |
-fmath-errno | o | o | o | o | o | x |
-fmerge-all-constants | x | x | x | x | x | x |
-fmerge-constants | x | o | o | o | o | o |
-fmodulo-sched | x | x | x | x | x | x |
-fmove-loop-invariants | o | o | o | o | o | o |
-fno-threadsafe-statics | o | o | o | o | o | o |
-fnon-call-exceptions | x | x | x | x | x | x |
-fnothrow-opt | x | x | x | x | x | x |
-fomit-frame-pointer | x | x | x | x | x | x |
-foptimize-register-move | x | x | o | o | o | o |
-foptimize-sibling-calls | x | x | o | o | o | o |
-foptimize-strlen | x | x | o | o | x | o |
-fpack-struct | x | x | x | x | x | x |
-fpeel-loops | x | x | x | x | x | x |
-fpeephole | o | o | o | o | o | o |
-fpeephole2 | x | x | o | o | o | o |
-fpredictive-commoning | x | x | x | o | x | o |
-fprefetch-loop-arrays | o | o | o | o | o | o |
-freg-struct-return | x | x | x | x | x | x |
-fregmove | x | x | o | o | o | o |
-frename-registers | o | o | o | o | o | o |
-freorder-blocks | x | x | o | o | o | o |
-freorder-blocks-and-partition | x | x | x | x | x | x |
-freorder-functions | x | x | o | o | o | o |
-frerun-cse-after-loop | x | x | o | o | o | o |
-freschedule-modulo-scheduled-loops | x | x | x | x | x | x |
-frounding-math | x | x | x | x | x | x |
-frtti | o | o | o | o | o | o |
-fsched-critical-path-heuristic | o | o | o | o | o | o |
-fsched-dep-count-heuristic | o | o | o | o | o | o |
-fsched-group-heuristic | o | o | o | o | o | o |
-fsched-interblock | o | o | o | o | o | o |
-fsched-last-insn-heuristic | o | o | o | o | o | o |
-fsched-pressure | x | x | x | x | x | x |
-fsched-rank-heuristic | o | o | o | o | o | o |
-fsched-spec | o | o | o | o | o | o |
-fsched-spec-insn-heuristic | o | o | o | o | o | o |
-fsched-spec-load | x | x | x | x | x | x |
-fsched-spec-load-dangerous | x | x | x | x | x | x |
-fsched-stalled-insns | x | x | x | x | x | x |
-fsched-stalled-insns-dep | o | o | o | o | o | o |
-fsched2-use-superblocks | x | x | x | x | x | x |
-fschedule-insns | x | x | x | x | x | x |
-fschedule-insns2 | x | x | o | o | o | o |
-fsection-anchors | x | x | x | x | x | x |
-fsel-sched-pipelining | x | x | x | x | x | x |
-fsel-sched-pipelining-outer-loops | x | x | x | x | x | x |
-fsel-sched-reschedule-pipelined | x | x | x | x | x | x |
-fselective-scheduling | x | x | x | x | x | x |
-fselective-scheduling2 | x | x | x | x | x | x |
-fshort-double | x | x | x | x | x | x |
-fshort-enums | o | o | o | o | o | o |
-fshort-wchar | x | x | x | x | x | x |
-fshrink-wrap | x | o | o | o | o | o |
-fsignaling-nans | x | x | x | x | x | x |
-fsigned-zeros | o | o | o | o | o | x |
-fsingle-precision-constant | x | x | x | x | x | x |
-fsplit-ivs-in-unroller | o | o | o | o | o | o |
-fsplit-wide-types | x | o | o | o | o | o |
-fstrict-aliasing | x | x | o | o | o | o |
-fstrict-enums | x | x | x | x | x | x |
-fthread-jumps | x | x | o | o | o | o |
-ftoplevel-reorder | o | o | o | o | o | o |
-ftrapping-math | o | o | o | o | o | x |
-ftrapv | x | x | x | x | x | x |
-ftree-bit-ccp | x | o | o | o | o | o |
-ftree-builtin-call-dce | x | x | o | o | o | o |
-ftree-ccp | x | o | o | o | o | o |
-ftree-ch | x | o | o | o | o | o |
-ftree-copy-prop | x | o | o | o | o | o |
-ftree-copyrename | x | o | o | o | o | o |
-ftree-cselim | o | o | o | o | o | o |
-ftree-dce | x | o | o | o | o | o |
-ftree-dominator-opts | x | o | o | o | o | o |
-ftree-dse | x | o | o | o | o | o |
-ftree-forwprop | o | o | o | o | o | o |
-ftree-fre | x | o | o | o | o | o |
-ftree-loop-distribute-patterns | x | x | x | o | x | o |
-ftree-loop-distribution | x | x | x | x | x | x |
-ftree-loop-if-convert | o | o | o | o | o | o |
-ftree-loop-if-convert-stores | x | x | x | x | x | x |
-ftree-loop-im | o | o | o | o | o | o |
-ftree-loop-ivcanon | o | o | o | o | o | o |
-ftree-loop-optimize | o | o | o | o | o | o |
-ftree-lrs | x | x | x | x | x | x |
-ftree-partial-pre | x | x | x | o | x | o |
-ftree-phiprop | o | o | o | o | o | o |
-ftree-pre | x | x | o | o | o | o |
-ftree-pta | o | o | o | o | o | o |
-ftree-reassoc | o | o | o | o | o | o |
-ftree-scev-cprop | o | o | o | o | o | o |
-ftree-sink | x | o | o | o | o | o |
-ftree-slp-vectorize | o | o | o | o | o | o |
-ftree-sra | x | o | o | o | o | o |
-ftree-switch-conversion | x | x | o | o | o | o |
-ftree-tail-merge | x | x | o | o | o | o |
-ftree-ter | x | o | o | o | o | o |
-ftree-vect-loop-version | o | o | o | o | o | o |
-ftree-vectorize | x | x | x | o | x | o |
-ftree-vrp | x | x | o | o | o | o |
-funit-at-a-time | o | o | o | o | o | o |
-funroll-all-loops | x | x | x | x | x | x |
-funroll-loops | x | x | x | x | x | x |
-funsafe-loop-optimizations | x | x | x | x | x | x |
-funsafe-math-optimizations | x | x | x | x | x | o |
-funswitch-loops | x | x | x | o | x | o |
-funwind-tables | x | x | x | x | x | x |
-fvar-tracking | o | o | o | o | o | o |
-fvar-tracking-assignments | o | o | o | o | o | o |
-fvar-tracking-assignments-toggle | x | x | x | x | x | x |
-fvar-tracking-uninit | x | x | x | x | x | x |
-fvariable-expansion-in-unroller | x | x | x | x | x | x |
-fvect-cost-model | o | o | o | o | o | o |
-fvpt | x | x | x | x | x | x |
-fweb | o | o | o | o | o | o |
-fwhole-program | x | x | x | x | x | x |
-fwrapv | x | x | x | x | x | x |