ユーザー定義型で計測
まずはこんなコードで試してみました。
' ユーザー定義型の定義と宣言Private Type AB As Long: C As Long: D As Long: E As Long: F As LongG As Long: H As Long: I As Long: J As Long: K As LongL As Long: M As Long: O As Long: P As Long: Q As LongR As Long: S As Long: T As Long: U As Long: V As LongEnd Type ' Nがないのはただの入力ミスですDim Z As A | |
' Withあり計測For I = 1 To NWith Z.B = 1...End WithNext | ' Withなし計測For I = 1 To NZ.B = 1...Next |
回数 | 速い方 | 倍率 | 左の表の読み方ですが、回数はZの要素に値を代入した回数で、5回ならFまで代入したということで、速い方・倍率はそのままです。 念のため言っておけば、あり・なしというのは、Withあり・Withなしの意味ですよ。 なんなのでしょうか、この結果は。 |
---|---|---|---|
1回 | なし | 2.24 | |
2回 | なし | 1.83 | |
3回 | なし | 1.57 | |
4回 | なし | 1.36 | |
5回 | なし | 1.29 | |
6回 | なし | 1.21 | |
7回 | なし | 1.16 | |
8回 | なし | 1.12 | |
9回 | なし | 1.06 | |
10回 | なし | 1.06 | |
11回 | なし | 1.02 | |
12回 | - | 1.00 | |
13回 | あり | 1.02 | |
14回 | あり | 1.03 | |
15回 | あり | 1.05 | |
16回 | あり | 1.07 | |
17回 | あり | 1.06 | |
18回 | あり | 1.09 | |
19回 | あり | 1.10 | |
20回 | あり | 1.10 |
納得がいかないのでWithを外に出して計測。
' Withあり計測With ZFor I = 1 To N.B = 1...NextEnd With | ' Withなし計測For I = 1 To NZ.B = 1...Next |
回数 | 速い方 | 倍率 | ほぼ期待通りの結果が出ました。 このような使い方の時には3割程度の高速化が期待できるようです。 少ない回数で効果が落ちているのは、恐らく関係ない変数Iにアクセスする割合が増えているからなのでしょう。 |
---|---|---|---|
1回 | あり | 1.20 | |
2回 | あり | 1.18 | |
3回 | あり | 1.21 | |
4回 | あり | 1.25 | |
5回 | あり | 1.25 | |
6回 | あり | 1.27 | |
7回 | あり | 1.24 | |
8回 | あり | 1.27 | |
9回 | あり | 1.27 | |
10回 | あり | 1.28 | |
11回 | あり | 1.27 | |
12回 | あり | 1.29 | |
13回 | あり | 1.29 | |
14回 | あり | 1.30 | |
15回 | あり | 1.29 | |
16回 | あり | 1.30 | |
17回 | あり | 1.29 | |
18回 | あり | 1.30 | |
19回 | あり | 1.29 | |
20回 | あり | 1.30 |
コントロールで計測
今度はHScrollBarコントロールで試してみました。
「I And 16383」の影響で数%遅くなっていますが大きな影響はないと思います。
' Withあり計測For I = 1 To NWith HScroll1.Value = I And 16383...End WithNext | ' Withなし計測For I = 1 To NHScroll1.Value = I And 16383...Next |
回数 | 速い方 | 倍率 | 今度は2回目で早くも効果が現れましたが、その効果の大きさそのものはごくわずかです。 「I And 16383」で5%ほど遅くなっていることを考えると、この違いはほぼ誤差の範囲内と考えても構わないくらい小さなものだと思われます。 |
---|---|---|---|
1回 | なし | 1.03 | |
2回 | あり | 1.02 | |
3回 | あり | 1.02 | |
4回 | あり | 1.02 | |
5回 | あり | 1.02 | |
6回 | あり | 1.04 | |
7回 | あり | 1.04 | |
8回 | あり | 1.03 | |
9回 | あり | 1.04 | |
10回 | あり | 1.04 |
やはりWithを外に出してみます。
' Withあり計測With HScroll1For I = 1 To N.Value = I And 16383...NextEnd With | ' Withなし計測For I = 1 To NHScroll1.Value = I And 16383...Next |
回数 | 速い方 | 倍率 | 先程ほとんど効果が現れなかった理由が分かる気がします。 速くなるには速くなるのですが、たったの4%です。 多分Valueをいちいち変更している影響でしょうが、コントロールの場合、もっともっと重たい処理はいくらでもあるので、他の場合では効果はもっと薄いと考えてもよさそうです。 |
---|---|---|---|
1回 | あり | 1.04 | |
2回 | あり | 1.04 | |
3回 | あり | 1.05 | |
4回 | あり | 1.04 | |
5回 | あり | 1.03 | |
6回 | あり | 1.04 | |
7回 | あり | 1.03 | |
8回 | あり | 1.03 | |
9回 | あり | 1.03 | |
10回 | あり | 1.04 |
総合して
これらの結果を見ると、どうやらよほどたくさんの処理を行わない限り、Withステートメントそのものの実行時間のため、効果が帳消しにされてしまうようです。
だから、ループを使って何十回も何百回も繰り返し使うケースなどでは処理速度のために使う価値があるにしても、通常の処理の中で使う分にはコードを見やすくして量を減らすくらいに認識しておいたほうがよいでしょう。