時折耳にする「年々CPUは高速になるのでコードの最適化は不要」と言うのは全くの見当違いです。
しかし、十分な速度で動いている部分を最適化する為に余分な労力を使うのは時間の無駄であり、単なる自己満足に過ぎません。
本書は小手先の技巧的なコーディングテクニックを紹介する本ではありません。
本書の第3章のコラムにもあるように、性能のボトルネックになっている1ヶ所を最適化する事で性能が7%向上した。
しかし、別の部分は最適化しても効果が無いので最適化を見送った。本書はそう言う見極めとメリハリが重要だと説いています。
もちろん、C++の言語的な、或いは付属のライブラリの特性を意識した最適化の為のテクニックの紹介は多々ありますが、それは本書の全てではありません。
むしろ本書は、適切なアルゴリズムやデータ構造を使う事の重要性を説いています。そして並行処理の最適化についても紹介されています。
例えば1989年に初版発行の「アルゴリズムとデータ構造」ですら、いわゆるビックオー表記の性能評価の目安であるO(n2)やO(log2 n)などが紹介されています。
そして当時でさえ、データ数が十分に少なければO(n2)の方がO(log2 n)よりも早くなる場合がある事も記されています。
これは一般的に繰り返しの回数を少なくするアルゴリズムは複雑になる傾向があるので、定数・係数であるビックオー部分が大きくなるからです。
例えて言えば、10m先に行くのに徒歩と自動車どちらが早いかと言う事です。
長距離であれば当然自動車の方が遙かに早いのですが、たったの10m程度の距離であれば車に乗り込んでシートベルトを着用してエンジン掛けて・・・とやってる暇があるなら歩いた方が早い。当たり前の話ですね。
本書では近年の研究の成果を踏まえて、理論的な計算量(時間コスト)とCPUのキャッシュ、データの特性を考慮したアルゴリズムの選択について紹介されています。
時折挟まれるコラムには最適化に関する著者の体験談なども載っており、「ああ、あるある」と楽しめます。
第3章の先述とは別のコラムで、線形探索と二分探索の性能測定でデータ数を増やしても常に線形探索の方が早いのでおかしいと思ってコードを調べたら、線形探索のバグで最初の1回目で常に「成功」を返していたと言うのがありますが、実は私も全く同じミスを犯した事があります。
まあ、筆者の場合と異なり、単体テストの段階でミスに気づきましたが。
本書の購入を考えている、或いは本書に興味を持つような方なら大丈夫だと思いますが、本書は内容の特性上、C++はもとよりCPUやメモリアクセス及びキャッシュの仕組みと特性、OSの構造や動作、CPUの進化の歴史などの知識がそれなりに必要です。
もちろんそれらの知識がなくても読めない訳ではありませんが、「なぜそうするのか?」と言う一番重要なポイントが腑に落ちないと思います。
コンパイラの最適化オプションによってソースコードがどう変化するかを、アセンブラのソースを出力させて確認する。そう言う経験をして来た人達だと著者が言いたい事が伝わりやすいと思います。
本書には(恐らく原文からしてそうなのでしょうが)比喩的な表現が多く見られます。特に第2章の「~の真実」関係の記述は、分かっている人でないと誤解を招く表現も多々見うけられます。
例えばP.14ではZ80などの昔のCPUと違い、最近のCPUではマルチコアだったり各種の高速化技法を使っているので一筋縄では行かないと言う事を読者に伝えたいようです。
が、それを表現するのに「C++プログラムは、先ほど述べたコンピュータの単純モデルを信じているように振るまう」と書かれています。
これは前後の文章の流れからするとCPUの投機実行(分岐した先の処理をあらかじめ実行しておくこと。分岐しなかった場合の結果は破棄される)やHTやアウトオブオーダー実行(命令の実行順をプログラムと矛盾しない範囲で入れ替えて実行する)、或いはMMUを使った仮想記憶などを意識した記述だと思われるのですが・・・
これはCPUの内部で行われている話であり、外部に対してはプログラムの記述通りの結果になる事が保障されています。
つまり、「振るまっている」のはCPUであって、C++ではありません。
とは言え、それらが全く無関係かと言うとそうでもなく、C++コンパイラ自身の最適化機能においてもソースコードのコンパイル時に結果に影響がない範囲で順番を変えてコードを生成する場合があります。
もっともその場合でも、「振るまっている」のはC++のコンパイラ(の最適化機能)であって、(ユーザーが作成した)プログラムではありませんが。
もしかすると「C++プログラム」とはC++コンパイラの事を言いたいのかとも思いましたが、その後に「C++ コンパイラ」と言う文言が出てくるので、恐らく「C++プログラム」はユーザーが作ったプログラムの事を示しているのだと思います。
他にも用語的には「C++」「コンパイラ」が使われていますが、「C++」はC++の言語仕様を示す時に使われているようです。
まあ勿論、CPUやコンパイラがどの様に振るまうかと言う事は(プログラマ自身が)コーディングの際に常に意識しておく必要はあります。
例えば副作用を伴う関数を引数に渡す場合がそれに該当します。
仮に次の様な(推奨されない)記述があったとします。
int a = 0;
func(a++, a++);
関数の引数の評価順序はC++の仕様で規定されてないので、コンパイラは「振るまう」必要がありません。
つまりこの場合、func(0, 1)で呼び出されるか、それともfunc(1, 0)で呼び出されるかはコンパイラに依存し、さらに同じコンパイラを使っても最適化機能のON/OFFで結果が異なる可能性があると言う事です。
つまり、コンパイラの振るまいを理解しておかないと、(最適化機能OFFの)Debug環境では正常に動くのに(最適化機能ONの)Release環境では間違った動作をするやっかいなプログラムを作ってしまう事になります。
そう言うプログラムは当然ですが、作った本人にはバグが見つけられず、無駄にデバッグに時間を費やす事になります。
「引数に渡す前に別のローカル変数に入れる」と言う、わずかな手間、わずかな行数、わずかな実行時間を惜しんだがために、分かりづらいバグを生み出す。
もちろん使っているC++によっては問題なく動く場合もありますが、潜在バグの一つなので他の処理系に移植された時に問題が出るパターンもあります。自己満足の最適化パターンが生み出すバグの一種なのですが、意外とありがちです。
話を戻すと、この様に(文章的に)やや気になる点は幾つかありますが、より高速なC++プログラムを作る必要がある場合、本書は座右の書となるでしょう。
尚、第1章の冒頭に明記されていますが、本書の最適化の技法はC++の特徴を意識した物なので、他の言語で同じ技法を使っても同様の効果が得られる保証はありません。
また、特定のCPUやハードウェア、OS固有のAPI等に依存した最適化の技法についても(軽く触れられる程度で)基本的には対象外です。
本書で紹介されるのはあくまでもC++一般で適用されるであろう最適化の技法であり、その為の知識です。
プライム無料体験をお試しいただけます
プライム無料体験で、この注文から無料配送特典をご利用いただけます。
非会員 | プライム会員 | |
---|---|---|
通常配送 | ¥410 - ¥450* | 無料 |
お急ぎ便 | ¥510 - ¥550 | |
お届け日時指定便 | ¥510 - ¥650 |
*Amazon.co.jp発送商品の注文額 ¥3,500以上は非会員も無料
無料体験はいつでもキャンセルできます。30日のプライム無料体験をぜひお試しください。

無料のKindleアプリをダウンロードして、スマートフォン、タブレット、またはコンピューターで今すぐKindle本を読むことができます。Kindleデバイスは必要ありません。
ウェブ版Kindleなら、お使いのブラウザですぐにお読みいただけます。
携帯電話のカメラを使用する - 以下のコードをスキャンし、Kindleアプリをダウンロードしてください。
Optimized C++ ―最適化、高速化のためのプログラミングテクニック 単行本(ソフトカバー) – 2017/2/22
{"desktop_buybox_group_1":[{"displayPrice":"¥4,400","priceAmount":4400.00,"currencySymbol":"¥","integerValue":"4,400","decimalSeparator":null,"fractionalValue":null,"symbolPosition":"left","hasSpace":false,"showFractionalPartIfEmpty":true,"offerListingId":"MAjLZzxPW5btfJPWLEFUpb8T4WGu%2FiB572pZ100TET4R9A0Y7JwFr4jf2mIgQNnwgGVZ4lkN31wxnE9aHlbAE7r3%2FrEf25iu66s4Wkg7DRDFfO0E8XMDrTKaUdbq49%2B5RWx0hf4HeGw%3D","locale":"ja-JP","buyingOptionType":"NEW","aapiBuyingOptionIndex":0}]}
購入オプションとあわせ買い
C++プログラムの性能には、ハードウェア、コンパイラ、データ構造、アルゴリズム、ライブラリといったさまざまな要因が関係します。
本書は性能に影響する要因の特性をしっかり理解し、正しく測定することによって性能上の問題を引き起こしている「ホットスポット」を特定し、どのような最適化が可能であり、採用すべきなのかを詳しく解説します。
従来の文や式の最適化、コンパイラオプションだけでなく、性能チューニングの原則と、文字列、アルゴリズム、動的変数割り当て、カスタムライブラリ、探索と整列、データ構造、入出力、並列処理、メモリ管理といったあらゆる角度からの最適化テクニックを、「コード中毒」の著者が実際に直面したエピソードを交え紹介します。
より高速なプログラムを必要とするプログラマに不可欠な内容です。C++11/C++14対応。
本書は性能に影響する要因の特性をしっかり理解し、正しく測定することによって性能上の問題を引き起こしている「ホットスポット」を特定し、どのような最適化が可能であり、採用すべきなのかを詳しく解説します。
従来の文や式の最適化、コンパイラオプションだけでなく、性能チューニングの原則と、文字列、アルゴリズム、動的変数割り当て、カスタムライブラリ、探索と整列、データ構造、入出力、並列処理、メモリ管理といったあらゆる角度からの最適化テクニックを、「コード中毒」の著者が実際に直面したエピソードを交え紹介します。
より高速なプログラムを必要とするプログラマに不可欠な内容です。C++11/C++14対応。
- 本の長さ368ページ
- 言語日本語
- 出版社オライリージャパン
- 発売日2017/2/22
- 寸法24 x 19 x 2 cm
- ISBN-104873117925
- ISBN-13978-4873117928
よく一緒に購入されている商品

対象商品: Optimized C++ ―最適化、高速化のためのプログラミングテクニック
¥4,400¥4,400
最短で3月31日 日曜日のお届け予定です
残り7点(入荷予定あり)
¥4,180¥4,180
最短で3月31日 日曜日のお届け予定です
残り18点(入荷予定あり)
¥4,180¥4,180
最短で3月31日 日曜日のお届け予定です
残り17点(入荷予定あり)
総額:
当社の価格を見るには、これら商品をカートに追加してください。
ポイントの合計:
pt
もう一度お試しください
追加されました
一緒に購入する商品を選択してください。
この商品を見た後に買っているのは?
ページ 1 以下のうち 1 最初から観るページ 1 以下のうち 1
商品の説明
著者について
Kurt Guntheroth(カート・ガンセロス):25年以上の経験あるソフトウェア開発者。四半世紀にわたってC++のシステムコードを書いてきた。Windows、Linux、組み込みシステムでの開発経験がある。ワシントン州シアトル在住。
登録情報
- 出版社 : オライリージャパン (2017/2/22)
- 発売日 : 2017/2/22
- 言語 : 日本語
- 単行本(ソフトカバー) : 368ページ
- ISBN-10 : 4873117925
- ISBN-13 : 978-4873117928
- 寸法 : 24 x 19 x 2 cm
- Amazon 売れ筋ランキング: - 123,384位本 (本の売れ筋ランキングを見る)
- - 7,340位コンピュータ・IT (本)
- カスタマーレビュー:
-
トップレビュー
上位レビュー、対象国: 日本
レビューのフィルタリング中に問題が発生しました。後でもう一度試してください。
2017年10月4日に日本でレビュー済み
Amazonで購入
2018年1月14日に日本でレビュー済み
Amazonで購入
C++の最適化について、文レベルからアルゴリズムレベルまで幅広く解説している。コンパイラやCPUアーキテクチャまで立ち入っている部分も一部ある。かといって最適化のトレードオフを忘れることもなく、また常に測定結果に立脚した話のしかたで、バランスがとれているのがよいと思う。
あえて言うなら測定結果がVisualStudio/x86-64環境メインなのが気になるが、なんにせよ開発者は自分の環境で適切に測定する必要があるはずだし、例はなんでもよいはずだ。
あえて言うなら測定結果がVisualStudio/x86-64環境メインなのが気になるが、なんにせよ開発者は自分の環境で適切に測定する必要があるはずだし、例はなんでもよいはずだ。
2017年3月20日に日本でレビュー済み
Amazonで購入
まずは、翻訳ですが、何の心配することなく、読み進めることができるほど、洗練されています。語感の違いで、助詞を使った日本語の形容で、若干違和感を感じる箇所はありますが、間違いなく許容範囲です。
次に、内容ですが、久しぶりに、心を揺さ振るものにであった感じです。誤解を恐れず言えば、一気に読めます。4章以降から徐々にエキサイティングになってきますが、最適化に対する筆者の哲学的背景を理解するためにも、是非1章からきちんと読んで頂きたいと思います。
次に、内容ですが、久しぶりに、心を揺さ振るものにであった感じです。誤解を恐れず言えば、一気に読めます。4章以降から徐々にエキサイティングになってきますが、最適化に対する筆者の哲学的背景を理解するためにも、是非1章からきちんと読んで頂きたいと思います。
2017年12月1日に日本でレビュー済み
原書や内容は良いと思いますが、誤訳が酷いです。
難しいのは、プログラム言語(予約語や専門用語)と英語を正しく
理解して翻訳する必要があると思いますが、
この書籍に関しては機械翻訳された様にプログラム言語などが
変な日本語やカタカナに訳されている部分があって、更に、
その部分だけ見ると逆の意味にとられかねない記述も
あったりします(訳者もC++に不慣れ?)。
それ故、初心者~中級者は間違った内容を理解させるかも
知れませんし、中級~上級者にとっては間違い探しの旅に
なってしまいそうです。
改訂版で修正される事を期待します。
難しいのは、プログラム言語(予約語や専門用語)と英語を正しく
理解して翻訳する必要があると思いますが、
この書籍に関しては機械翻訳された様にプログラム言語などが
変な日本語やカタカナに訳されている部分があって、更に、
その部分だけ見ると逆の意味にとられかねない記述も
あったりします(訳者もC++に不慣れ?)。
それ故、初心者~中級者は間違った内容を理解させるかも
知れませんし、中級~上級者にとっては間違い探しの旅に
なってしまいそうです。
改訂版で修正される事を期待します。
2017年6月2日に日本でレビュー済み
この本には最適化に関する様々な知識が詰め込まれています。よくあるアルゴリズム変更による改善でも、普通の本では「無視」される定数項がどれぐらい効いてくるのかのように概念だけでなく実測による説明がされています。一通り読んでおくことで、いざ自分のプログラムで性能問題が発生したときに解決の手段を考えられるようになると思います。
個人的には最新のC++仕様で導入されたムーブセマンティクスや並行処理機能などについて学べたことがよかったです。こういう最新仕様の話は雑誌の記事やネットには載っていても、書籍としてまとめられることはあまりないのではないでしょうか。
個人的には最新のC++仕様で導入されたムーブセマンティクスや並行処理機能などについて学べたことがよかったです。こういう最新仕様の話は雑誌の記事やネットには載っていても、書籍としてまとめられることはあまりないのではないでしょうか。