2009/05/14

Function対決-VBA編

うーん、これも道理といば道理。さらに言えばC#を書きはじめるまで、ファンクションの返り値にこういう条件式をつっこむ、という書き方はしなかったんですけれど(なぜならVBで書くと、なんでも「=」で不気味だから)。

わざわざif文で評価してから返すよりも、ダイレクトに評価してしまった方が、当然処理は速いですものネ。…ま、Functionの中身はかなり短いロジックにならざるをえませんので需要があるかどうかはビミョーですが。とりあえず、速度対決。

(1)

Private Function IsTestTrue01(ByVal a As Long) As Boolean
If (a Mod 2 = 0) Then
    IsTestTrue01 = True
Else
    IsTestTrue01 = False
End If
End Function

(2)

Private Function IsTestTrue02(ByVal a As Long) As Boolean
IsTestTrue02 = (a Mod 2 = 0)
End Function

結果

(1):1756 ミリ秒

(2):1588 ミリ秒

※Access2003で実験

サンプルソース

フォームにtxtDATAという名前のテキストボックスを作って、そこにタイムを表示する。clsTimerMMクラスは「時間経過計測クラス‐VBA編」参照。

Dim clsTimerMM As clsTimerMM
Dim i As Long
Dim lngMax As Long
Dim strMsg As String

Set clsTimerMM = New clsTimerMM
lngMax = 10000000

'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    Call IsTestTrue01(i)
Next
strMsg = "(1):" & clsTimerMM.ElapsedTime & vbCrLf
'************************
clsTimerMM.SetStartDate
For i = 0 To lngMax
    Call IsTestTrue02(i)
Next
strMsg = strMsg & "(2):" & clsTimerMM.ElapsedTime & vbCrLf

'************************
Me.txtDATA.Value = strMsg
Set clsTimerMM = Nothing

2 件のコメント:

イシカワ さんのコメント...

不気味って表現に笑っちゃいました。代入と比較が同じ「=」なんて
おかしいですよね。だからってPHPみたいに代入と比較があわせて
「=」、「==」、「===」の3つあるってのも不気味ですよね。

じょに さんのコメント...

むーー!!(・ε・ )
い、け、ず!!
「不気味」は「ファンクションの返り値にこういう条件式をつっこむ」って
トコにかかっているんですヨ!(たぶんね・笑)

VB一色だったときは等値と代入共に「=」だったので、
自然と「IsTestTrue02 = (a Mod 2 = 0)」なんて書き方は、
避けていたねぇ。
それが「return (a Mod 2 == 0);」だと、
胸にストンと落ちちゃうんだから、面白いよね。
現在C#を勉強中だけど、
言語の仕様に思考もひっぱられて、
.NETを改めて別の視点で捉えなおしているような感じで、
かなり毎日、楽しいです。

PHPの話は懐かしいね!!!
「===」とかは、
「それ、なんのネタ?」って思ったものだよ。(^^;