ソフトウェア技術者のためのバグ百科事典(12)デスマーチを呼ぶ処理時間のバグ:山浦恒央の“くみこみ”な話(133)(3/3 ページ)
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第12回は、開発のデスマーチを呼び起こしかねない、処理時間のバグを取り上げます。
7.対策
処理時間のバグへの対策を以下に示します。
7.1 仕様書の規定値を現実的な値に設定する
要求仕様で処理時間を記載する場合、無理のない現実的な値を定義しましょう。この値によっては、プロジェクトの進行が大きな影響を受ける可能性があります。また、応答性能を実現できなかった場合、どのように対処するか、事前に考えておきましょう。
7.2 プロトタイプを作る
応答性能がクリティカルなソフトウェアでは、要求仕様定義の段階で、コアになる部分を2、3日でコーディングして実行し、目標とする応答性能が可能であることを事前に確認しましょう。「この応答性能を出すには、東京−大阪間の通信を120nsで終了しなければならない」といったような「物理的に不可能な桁違いの処理要求」を検出できます。
7.3 ボトルネックの把握
パフォーマンス解析ツールを使用し、ボトルネック(プログラムのどこに時間を取られているか)のランキングを作成しておきましょう。あらかじめ調べておけば、応答性能系のバグ発生時に慌てることなく対処できます。
7.4 プログラムの記述方法に注意する
処理時間が重要なプログラムの場合、以下の記述方法に気を付けましょう。
- より高速なプログラミング言語(アセンブラ、C/C++言語など)を採用することを検討する
- 部分的にアセンブラで記述する
- 除算は処理時間がかかるため、乗算に変更する
- べき乗をシフト演算に変更する
- 速度が速い標準関数を使用する
- より高速なアルゴリズムを探す
- 無駄なデータにアクセスしていないか確認する
上記は、昔ながらの処理高速化の手法ですが、少しでも改善したい場合は効果があります。また、シニアエンジニアに聞くと、マニアックな改善手法を提案してもらえるかもしれません。
8.まとめ
今回のまとめを以下に示します。
- 処理時間のバグとは、想定した処理時間をオーバーするバグのことである
- 処理時間は、プログラムの完成後に測定するため、開発の終盤で見つかり、プロジェクトの進行に大きな影響を与える
- 処理時間のバグは、プログラムを動作して確認したり、負荷などでプログラムが停止したりする場合に発生する
- 対策案は、「仕様定義での応答性能を現実的な値にする」「ツールでボトルネックを把握しておく」「より効率的なプログラムを記述し、処理時間を短くする」などがある
9.終わりに
ハードウェアの能力は昔と比べて格段に向上しましたが、性能要求を満たせず慌てることが少なくありません。今回は、その中でも、処理時間のバグを紹介しました。
処理時間のバグが発生すると、どうやって目標の応答時間内に収めるか、対処法をキチンと考えねばなりません。また、実機でやってみないと確かめられませんので、未然防止が非常に難しいバグです。処理時間が求められる製品を開発しているエンジニアは、常に頭に置いておくべきバグです。
今回でシリーズの12回目となり、いろいろなバグの知識や、バグを見つける嗅覚が身に付いたことと思います。他のバグを知りたい方は、本連載の過去記事や、前シリーズの「バグ検出ドリル」、以下に紹介する書籍版の「ソフトウェア技術者のためのバグ検出ドリル」をご参照ください。
山浦先生執筆の書籍「ソフトウェア技術者のためのバグ検出ドリル」が発売中!
山浦恒央先生が執筆した書籍「ソフトウェア技術者のためのバグ検出ドリル」が日科技連出版から発売中です。本連載「山浦恒央の“くみこみ”な話」とTechFactoryの連載「組み込みエンジニアの現場力養成演習ドリル」をベースに、大幅加筆、改訂した内容になっています。
内容は、「デバッグの詰将棋」で、要求仕様定義、設計、コーディング、テスト、保守の5フェーズでの「バグを埋め込んだ仕様記述やソースコード」を読んで、バグをピンポイントで見つける問題集になっています。全部で31問あり、難易度は初級から上級まで、いろいろです。興味のある方は、Amazon.comや書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- ソフトウェア技術者のためのバグ百科事典(11)「数値演算」のバグは奥が深い
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第11回は、意外と奥が深い、数値演算のバグを取り上げます。 - ソフトウェア技術者のためのバグ百科事典(10)デバッグの強力な手掛かり「ログ」のバグ
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第10回は、デバッグの強力な手掛かりとなる「ログ」にまつわるバグを取り上げます。 - ソフトウェア技術者のためのバグ百科事典(9)境界値のバグ
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第9回は、常連バグの代表格である、境界値に関する仕様の不良や勘違いのバグ「境界値のバグ」を取り上げます。 - ソフトウェア技術者のためのバグ百科事典(8)バグを見つけるテストがバグってる
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第7回は、プログラムのバグを見つける作業である「テスト」がテーマです。テストの作業次第では逆にバグを作り込むこともあり、「テストのテストのテスト」のように無限ループに陥りかねません。 - ソフトウェア技術者のためのバグ百科事典(7)要求仕様書がバグってる
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第7回は、ソフトウェアのライフサイクルで最も重要な要求仕様に焦点を当てます。要求仕様書をしっかり作成しないと、その後のフェーズでさまざまな問題が発生し、プロジェクトの進行に大きく影響するのです。