プログラム分かれ道

 ここでは、harg がプログラミングで気付いたちょっとしたことを掲載していきます。したがって、更新頻度は低いです。また、信憑性も低いですw
反論、間違いの報告はこちら


数値の正負判定。絶対値はスマート?

 harg はプログラムに無駄に数学の知識を利用しようと試みることが多々あるのですが、今回は正負の判定についてです。

 変数 A の値がプラスの整数なら変数 B の値を10増やし、変数 A の値がマイナスの整数なら変数 B の値を10減らす、というプログラムを作成するとします。絶対値 ( VB.NET では Math.Abs ) を利用すると、次のようにかけます。

Dim A as Integer = 0
Dim B as Integer = 3

A = A + 10 * (B / Math.Abs(B))

Debug.WriteLine("A is " & A.ToString)

---出力結果---
A is 10

 絶対値とは、上の例で言うと B がプラスなら B を、B がマイナスなら B からマイナスをとった数を返すので、B / Math.Abs( B ) は B がプラスなら 1 、B がマイナスなら -1 になります。つまり、B がプラス → A = A + 10、B がマイナス → A = A - 10 となります。

一方、これを IF をつかって書くとこんな感じになります

Dim A as Integer = 0
Dim B as Integer = 3

If B > 0 Then
    A = A + 10
ElseIf B < 0 Then
    A = A - 10
End If

Debug.WriteLine("A is " & A.ToString)

---出力結果---
A is 10

 絶対値を用いたときよりちょっと長くなりました。

 さて、この2つですが、一見絶対値を用いたほうがすっきりとして速度が速そうです。見えない人もそう思ってくださいw
しかし、実際は違いました。IF分岐のほうが速いです。10万回ほどループさせて計測したところ、処理時間に明らかな差がみられました。なぜだろうと考えてみましたが、もしかしたら Math.Abs も内部で分岐処理をしているのではないか、という結論に至りました。また、クラスのメソッドの呼び出しで若干時間がかかっているかもしれません。

 つまり、絶対値は見た目はすっきりしますが、速度を要求するようなソフトでは使用を避けたほうがよいようです。

BACK

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!