FC2ブログ

Excelじゆうちょう

Excelのお絵描きツール『りっぷ2(りっぷつぅ)』のサポートページ、まずは「はじめに」をご覧ください。 [NewEntry] [Admin]

記事更新カレンダー

04 « 2019-05 « 06
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

拍手コメント一覧(拍手はしない)

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

pxivもやってます
リンクの一番上からのぞきに来てください
※閲覧にはユーザー登録が必要です

RSSってなんぞ?

広告は消せないらしい

FC2Ad

        --------       スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

        2010-03-27       速度比較、整数を取得

割り算の結果を整数で取得すること、よくありますよね?
私はよくあります、特にりっぷ2(りっぷつぅ)で。

その方法もいろいろありますが、どれを使えば早く処理されるのでしょうか。
そこで、Long型変数に 3 ÷ 4 の結果を代入する場合について比較してみました。
以下の4つを例にします。

(1)そのまま代入
小数部は丸められます。

(2)CLng関数
小数部は丸められます。

(3)Int関数、Fix関数
小数部は切り捨てられます。

(4)\演算子
小数部は切り捨てられます。

小数部の扱いについて、丸めと切り捨ての違いは考慮しないことにします。
Int関数、Fix関数は引数が負の値の場合で動作が異なりますが、代表してInt関数で比較します。
それでは、結果を示します。


'【コードウインドウ】
Private Sub test() '(1)そのまま代入
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long, a As Long
a = 1
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000000
    a = 3 / 4
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
Debug.Print "test、a = " & a
End Sub

'【イミディエイトウインドウ】
1回目 4602 ミリ秒
2回目 4602 ミリ秒
3回目 4602 ミリ秒
4回目 4617 ミリ秒
test、a = 1

'【コードウインドウ】
Private Sub testCLng() '(2)CLng関数
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long, a As Long
a = 1
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000000
    a = CLng(3 / 4)
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
Debug.Print "testCLng、a = " & a
End Sub

'【イミディエイトウインドウ】
1回目 4587 ミリ秒
2回目 4586 ミリ秒
3回目 4602 ミリ秒
4回目 4587 ミリ秒
testCLng、a = 1

'【コードウインドウ】
Private Sub testInt() '(3)Int関数
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long, a As Long
a = 1
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000000
    a = Int(3 / 4)
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
Debug.Print "testInt、a = " & a
End Sub

'【イミディエイトウインドウ】
1回目 6786 ミリ秒
2回目 6802 ミリ秒
3回目 6786 ミリ秒
4回目 6786 ミリ秒
testInt、a = 0

'【コードウインドウ】
Private Sub testYen() '(4)\演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long, a As Long
a = 1
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000000
    a = 3 \ 4
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
Debug.Print "testYen、a = " & a
End Sub

'【イミディエイトウインドウ】
1回目 1684 ミリ秒
2回目 1685 ミリ秒
3回目 1700 ミリ秒
4回目 1685 ミリ秒
testYen、a = 0


(4)の\演算子が飛び抜けて早いことがわかります。
当然ですね、他のものは一度割り算で小数の値を計算してから、それを変数に代入するために変換しています。
\演算子は割り算の商だけを返しますので、二度手間がないわけですね。
もし小数部の丸めを気にしなくていいのなら、ぜひとも\演算子を使いたいものです。

で、この結果はりっぷ2(りっぷつぅ)に反映させていただきました。
恥ずかしい話likePの時には\演算子を知りませんでしたので、数ある改良点の中で一番のスピードアップに貢献してくれました。

【追記】
(1)と(2)の結果自体は大差ありませんが、変数のデータ型を意識するという意味で明示的にCLng関数を使用した方がいいでしょう。

(1)と(2)の小数部を丸めるとは、四捨五入ではありません。
CLng関数のヘルプにあるように、0.5は近い方の偶数に丸められます。

ヘルプより引用
 小数部分がちょうど0.5の時、CInt関数およびCLng関数は常にもっとも近い偶数に値を丸めます。
 たとえば0.5を0に、1.5を2にそれぞれ丸めます。

うっかりしそうな設定です、お気をつけください。
スポンサーサイト

コメント

コメントの投稿

管理者にだけ表示を許可  

トラックバック

http://likep.blog63.fc2.com/tb.php/80-5f5d5744

 | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。