タグ

最適化とプログラムに関するiwwのブックマーク (4)

  • プログラム高速化の禁術 - Qiita

    はじめに これは昔(2010年頃)自分が使っていた高速化技法について書いたものです. 今となってはレガシーだったり,通用しないものもあるかもしれませんが,こういう知識も無くなってしまったり,自分も忘れてしまう気がしたので,メモ代わりに書いておきます. ただ言えることは,「最適化はするな」ということです.最適化すると,保守性が大幅に失われる危険性があります.そして,これから書く項目を1つ1つ行って,高速化できたとしても,せいぜい2倍程度です.ただその2倍程度の速度も欲しい!そのためには悪魔に魂と保守性を売る!という方はご覧ください.これらの高速化は割といろいろな言語に当てはまることも多いですが,大体C++で書くことを念頭に置いていただければ,幸いです.あと,個人的には競技プログラミングだったり,計算科学をやっていた時期に見つけた経験則なので間違ってる場合もあります. コンパイルオプションをこ

    プログラム高速化の禁術 - Qiita
    iww
    iww 2018/06/27
    「newするな」と「deleteするな」はバグを減らす効果もあるので良いと思う。
  • 軽い気持ちでLinkedListを使ったら休出する羽目になった話 - Qiita

    ざっくり言うと リスト構造のデータに対してランダムアクセスはしちゃだめだぞ。お兄さんとの約束だ! 発端 数年前に他部署の支援で作ったJavaのシステムに、ちょっとデカめのデータを突っ込んだらありえないほど遅いので助けてくれ、と連絡が入った。 まぁクエリとかインデックスをちょっと見れば直るっしょ・・・と鼻をほじりながら支援に向かった。 処理内容 遅い部分の処理は以下のようなものであった。 処理対象のデータをListで受け取る。 それをforループで1件ずつ前処理する。 処理結果をオブジェクトに格納し、ORマッパーでDBにINSERTする。 これだけ? そう、これだけだ。並列処理なんて高級なことはもちろんやってない。 インフラ調査 処理中のサーバのようすを調査する。今回のインフラは典型的な3層3サーバ構成。 WEBサーバはなにもかもが余裕。 APサーバではCPUを1つ使い切っている。 14コア

    軽い気持ちでLinkedListを使ったら休出する羽目になった話 - Qiita
  • C++の未定義の挙動で呼ばれないはずの関数が呼ばれる場合

    Krister Walfridsson’s blog: Why undefined behavior may call a never-called function 以下のようなコードをClangでコンパイルすると、 #include <cstdlib> typedef int (*Function)(); static Function Do; static int EraseAll() { return system("rm -rf /"); } void NeverCalled() { Do = EraseAll; } int main() { return Do(); } Clangは以下のような最適化されたコードを吐く。 main: movl $.L.str, %edi jmp system .L.str: .asciz "rm -rf /" これは以下のようなコードと同じだ。

    iww
    iww 2017/09/26
    CやC++は未定義や不定が多いので、きちんと定義してほしい。
  • KMC Staff Blog:比較を 0 と行うという最適化は有効なのか ?

    2009年11月13日 比較を 0 と行うという最適化は有効なのか ? 多くの CPU の命令セットでは、0 との比較を特別扱いしています。 そのため、ループを書く際には、なるべく 0 と比較するように書いた方が速いので良い、という主張をたまに聞きます。 しかし、一般的な for 文のイディオム for (i = 0; i < N; i++) を崩してまで、0 と比較するように書く意味が、当にあるのでしょうか ? それぐらいは、現代のコンパイラならば勝手に最適化してくれそうな気もします。 というわけで、x86、ARM、SH、MIPS、PPC で検証してみました。 x86 は、手元の MinGW の gcc 4.4.0 です。 それ以外の CPU は、弊社の exeGCC 4 (GCC 4.3.3 ベース) を使用しました。最適化レベルは、全て一般的な -O2 です。(FPU は無関係だと

  • 1