ようこそ。睡眠不足なプログラマのチラ裏です。

ソフトウェアの品質要因 その6「効率性」

効率性(efficiency)

■定義:効率性(efficiency)
「効率性」とは、処理時間、内部記憶および外部記憶上の空間、通信装置で使用する帯域幅などの
ハードウェア資源を出来る限り必要としないソフトウェアシステムの能力である。


ソフトウェア業界の人々における、性能(効率性)に対する2つの態度
効率性に対するソフトウェア業界の人々の態度は大きく分けて、2つある。

1つ目は、処理の効率性(性能)の問題に固執し、最適化と思われることに多大な努力を費やす方向に邁進する人々。
もう1つは、逆にソフトウェア性能の問題を軽視する人々である。
効率性を軽視する背景には、「処理を速くするなどの効率性を考える前に、まずは正しいものを作れ」だとか、
「いずれにしろ、来年になれば、速いコンピュータが出るのだから」といった、業界の教訓がある。
また、状況によって同じ人に2つの態度が現れることも珍しいことではない。


効率性はトレードオフでバランスを
開発者はしばしば、ミクロな最適化に異様な関心を抱きたがるものだが、品質要因その1「正確さ」で述べたように、
ソフトウェアにとって、最も重視される品質要因である「正確さ」を失っていては、「効率性」など無意味である。


一般に、ソフトウェアの効率性について考える場合、拡張性や再利用性、あるいはソースコードの可読性など、
他の目標とのバランスをとることを考えなければならない。さらに、現代ではハードウェア能力の進歩が著しいので、
1Byteだの1μsだのについてそれほど神経質にならなければならない場面が少なくなっているのは事実である。
しかし、逆にコンピュータの処理能力が進歩すると、悪いアルゴリズムに対する、
良いアルゴリズムの優位性が際立ってくるのも、また事実である。


効率性を軽視してはいけない
確かに時代は変わり、ハードウェアの性能が向上して、昔ほど効率性に対して神経質になる必要はなくなった。
しかし、だからといって効率性の重要さが減るというわけではない。対話型システムで応答時間が遅くなったり、
プログラムを実行するためにメモリを増設しなければならなくなるのが嬉い人はいない。
したがって、効率性に対して無関心な態度でいるためには、それなりの覚悟が必要である。


最終的にリリースしたソフトウェアシステムが、遅すぎたり大きすぎたりして、
システムの運用に差し支えるような場合、「速さはそれほど重要ではない。」と豪語していた人であっても、
「速さ(効率性)」も決して無視することはできないソフトウェア品質要因であることを認めざるをえない。


効率性は品質要因の1つに過ぎないし、効率性にとらわれるばかりで、
他の品質要因を軽視することになってしまっては、本末転倒である。
しかし、効率性は品質要因の1つであり、ソフトウェアシステムの構築であれ、
プログラミング言語の設計であれ、必ず考慮にいれなければならない。
性能を無視すれば、性能に無視される結果となるだろう。


効率性とオブジェクト指向プログラミング
効率性を重視する場合、しばしばオブジェクト指向プログラミング手法は無視される。
オブジェクト指向プログラミングによる実装は、複雑な処理を単純化して要求を実現することに
長けてはいるが、処理の記述が冗長化してしまう傾向が強いため、速度を重視するには不向きである。
したがって、極限まで実行速度などの効率性を重視しなければならない場合、
オブジェクト指向プログラミングを用いた実装を無視せざるをえない場合もある。
かといって、オブジェクト指向プログラミングをすると、すべてが冗長化してしまうわけではない。
逆に、オブジェクト指向プログラミングを用いることで効率性を高められるケースもある。