C言語編 目次

 関数設計

 

・関数名の命名規則
・プログラミングに出る!英単語

 ポインタ

 

・データ型とポインタ

 データ型

 

・char *とconst char *は違う
・符号付きと符号なし

 演算子

 

・三項演算子とデータ型の問題

 制御構文

 

・条件式で代入する
・三項演算子を使ったswitch

 構造体

 

・構造体のサイズとアライメント
・構造体メンバのサイズを知る

 配列

 

・配列使用時の注意
・配列の要素数を知る

 メモリ管理

 

・メモリスタック
・動的メモリ確保とメモリリーク

 モジュール設計

 

・モジュール分割
・汎用モジュールとアプリ依存モジュール

 パフォーマンス
  徹底チューニング

 


・どんな処理に時間がかかるのか
・ファイル入出力の効率化
・アルゴリズムを考える1
・アルゴリズムを考える2

 プリプロセッサの便利機能


・2重インクルード防止

 


トップページへ戻る

どんな処理に時間がかかるのか

 今回からパフォーマンスチューニングについて取り上げたいと思います。プログラムはただ作ればそれで終わりというものではありません。より効率的に、高速に動作するように改良したいですよね。

 パフォーマンスを改良するのにも方法論があります。ただなんとなくやっても効果は出たり出なかったりということになるでしょう。

 まず、チューニングを始める前に、どこまでチューニングするのかという問題がありますね。本当は「このレベルまで改良する」という目標をたてます。例えば、「ユーザがボタンを押してから2秒以内に反応が返ってくる」みたいな数値的な目標です。

 これは工数との兼ね合いを考えた場合ですね。チューニングは際限なくやったらきりがないので、ある程度かかる工数と出せる効果のバランスをみて、ちょうどいいところで切り上げるというやりかたをします。

 でもこれは、仕事的なプログラミングの話です。このページはあくまで趣味的なプログラミングで考えていますので、言えることは、「気のすむまでやってください」です(笑)

 では、実際のチューニングに入りましょう。まず、プログラムの実行に時間がかかっているとしたら、何に時間がかかっているのかを冷静に分析します。ここで注目するのは「実行時間」です。プログラムの作りのまずさや、コードサイズなどはこの際無視して、実行時間が速いか遅いかだけに注目します。

 例えば、処理A→処理B→処理Cという順番で処理を実行していくプログラムがあるとします。このプログラムが遅い場合、それぞれの処理にかかる実行時間を測定します。

 処理A〜Cがほぼ同じ処理時間である場合は、さらに細かく分析していきます。Aの中のこの処理が遅い、Bの中のこの処理が遅いなんてことがいくつか分かってきたら、それらに関連性がないか、共通な処理はないかを追求していき、遅い部分を特定していきます。

 プログラムの様々な処理が、平均的に時間がかかっているなんてことはまずありません。ほとんどの場合は、処理A〜Cのなかで突出して時間のかかっている処理があります。

 この時間のかかっている処理が"パフォーマンスクリティカルな"処理になります。パフォーマンスチューニングでは、この部分を徹底的に改良していきます。他の部分はどんなに下手なつくりであっても、パフォーマンスには影響しないので、改良の対象にはしません。

 このように、改良の対象とする領域を明確にすることが最初の作業です。

 次回はパフォーマンスのネックになりがちな、「ファイル入出力」の効率化を取り上げたいと思います。