2009/05/14

Function対決-VBA編

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

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

(1)

  1. Private Function IsTestTrue01(ByVal a As LongAs Boolean  
  2. If (a Mod 2 = 0) Then  
  3.     IsTestTrue01 = True  
  4. Else  
  5.     IsTestTrue01 = False  
  6. End If  
  7. End Function  

(2)

  1. Private Function IsTestTrue02(ByVal a As LongAs Boolean  
  2. IsTestTrue02 = (a Mod 2 = 0)  
  3. End Function  

結果

(1):1756 ミリ秒

(2):1588 ミリ秒

※Access2003で実験

サンプルソース

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

  1. Dim clsTimerMM As clsTimerMM  
  2. Dim i As Long  
  3. Dim lngMax As Long  
  4. Dim strMsg As String  
  5.   
  6. Set clsTimerMM = New clsTimerMM  
  7. lngMax = 10000000  
  8.   
  9. '************************  
  10. clsTimerMM.SetStartDate  
  11. For i = 0 To lngMax  
  12.     Call IsTestTrue01(i)  
  13. Next  
  14. strMsg = "(1):" & clsTimerMM.ElapsedTime & vbCrLf  
  15. '************************  
  16. clsTimerMM.SetStartDate  
  17. For i = 0 To lngMax  
  18.     Call IsTestTrue02(i)  
  19. Next  
  20. strMsg = strMsg & "(2):" & clsTimerMM.ElapsedTime & vbCrLf  
  21.   
  22. '************************  
  23. Me.txtDATA.Value = strMsg  
  24. Set clsTimerMM = Nothing  

2 件のコメント:

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

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

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

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

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

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