■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#448-2プロパティ参照の高速化匿名4482001-10-24(水) 10:56
     #453-2RE#448:プロパティ参照の高速化LESIA2001-10-24(水) 12:24
     #454-2RE#448:プロパティ参照の高速化よねKEN2001-10-24(水) 12:39
     #453-0RE#448:プロパティ参照の高速化LESIA2001-10-24(水) 21:24
     #454-0RE#448:プロパティ参照の高速化よねKEN2001-10-24(水) 21:39
     #466-2RE#448:プロパティ参照の高速化ろってんまいあ2001-10-25(木) 00:36
     #468-2RE#466:プロパティ参照の高速化ゆう(U)2001-10-25(木) 01:04
     #474-2RE#468:プロパティ参照の高速化匿名4742001-10-25(木) 01:55
     #475-2RE#474:プロパティ参照の高速化魔界の仮面弁士2001-10-25(木) 02:05
     #466-0RE#448:プロパティ参照の高速化ろってんまいあ2001-10-25(木) 09:36
     #468-0RE#466:プロパティ参照の高速化ゆう(U)2001-10-25(木) 10:04
     #474-0RE#468:プロパティ参照の高速化匿名4742001-10-25(木) 10:55
     #475-0RE#474:プロパティ参照の高速化魔界の仮面弁士2001-10-25(木) 11:05
#448-2
プロパティ参照の高速化
プロパティを直接参照すると時間がかかると聞きました。
そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?
通常なら
Text1.Enabled = False
とするのをどうやったら間接的にFalseを設定できますか?
#453-2
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?

変数に代入して使います。

例えば、

Dim i As Integer
Dim s As Integer

s = 0
For i = 1 To 100
   s = s + Text1.Text
Next i
とするより、

Dim i As Integer
Dim a As Integer
Dim s As Integer

s = 0
a = Text1.Text
For i = 1 To 100
   s = s + a
Next i
とした方が早くなるという事です。

> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

これは参照じゃなくて設定なので、こうする以外には方法は
ありません
#454-2
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
その通りです。

> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?
> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

プロパティの参照、及び、設定の回数を減らすとは例えば、

For i = 0 To 100
    Text1.Text = Text1.Text & "あいう"
Next

のようになっているのなら、

For i = 0 To 100
    s = s & "あいう"
Next
Text1.Text = s

のようにするとよいということです。
質問にある例では参照、及び、設定の回数を減らしようがありません。
#453-0
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?

変数に代入して使います。

例えば、

Dim i As Integer
Dim s As Integer

s = 0
For i = 1 To 100
   s = s + Text1.Text
Next i
とするより、

Dim i As Integer
Dim a As Integer
Dim s As Integer

s = 0
a = Text1.Text
For i = 1 To 100
   s = s + a
Next i
とした方が早くなるという事です。

> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

これは参照じゃなくて設定なので、こうする以外には方法は
ありません
#454-0
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
その通りです。

> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?
> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

プロパティの参照、及び、設定の回数を減らすとは例えば、

For i = 0 To 100
    Text1.Text = Text1.Text & "あいう"
Next

のようになっているのなら、

For i = 0 To 100
    s = s & "あいう"
Next
Text1.Text = s

のようにするとよいということです。
質問にある例では参照、及び、設定の回数を減らしようがありません。
#466-2
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?
> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

Text1.Enabled = False の時に False を設定しているようなプログラムですと
If Text1.Enabled = True Then Text1.Enabled = False
とすると微笑ながら速度は改善されます。

では、頑張ってくださいね
#468-2
RE#466:プロパティ参照の高速化
> Text1.Enabled = False の時に False を設定しているようなプログラムですと
> If Text1.Enabled = True Then Text1.Enabled = False
> とすると微笑ながら速度は改善されます。
ただし・・・

極端な例では、Falseの状態が数万回に1回等であれば
全体的には速度低下につながります。
※ほとんどがThenなら

オブジェクトの参照を含めてであれば、With 〜 End Withで
幾らか速度Upになります。
※この場合も
 With Text1
    .Enabled = False
  End With
 の様に1回のプロパティ設定だけなら速度低下に
 つながりますので、全体的な流れを読み最適な
 方法を選択するといいです。

 プロパティ別に参照速度が何個から速度が改善
 されるか試してみてください。

 ループとの関連使用での特性も考えてください。

最近の機械では、ループ等がらみでないのであれば
それほど体感する速度アップはないですね・・・
※数年前の機械なら幾らか効果はあります


詳しくはヘルプ(MSDN)で「実行速度の最適化」を読んで
実験してみてください。
#474-2
RE#468:プロパティ参照の高速化
たくさんのご解答ありがとうございます。
しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。
参考までに処理の流れを見ていただきたいと思います。

Private Sub Cmd_追加_Click()
    Dim i       As Long

    '各項目のクリア・有効・無効設定(60項目 × 4のコントロール配列になっています)
    For i = 0 To 3
        Call 出荷情報クリア(i)     'ここでテキストを初期化しています。項目数は60です。
        Call 出荷情報有効無効(True, i) 'ここでコントロールを使用可にしています。
                     '同じく項目数は60です。
    Next

    Lbl_PAGE = "" 'この処理は実行されます。
    Cmd_次へ.Enabled = False
    Cmd_前へ.Enabled = False '※この処理が実行されません。
    TxtNO(0).SetFocus  'この処理は実行されます。
End Sub

この処理でCmd_前へ.Enabled = Falseが実行されず使用不可になってくれません。
特に変な処理とかも無いので、コントロールのプロパティ値設定に時間がかかって
処理が追いついていないのではないかと考えました。当たってますか?
上記の処理での高速化は不可能なのでしょうか?
#475-2
RE#474:プロパティ参照の高速化
> しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。
これは、再帰処理のネストが深すぎる場合や、イベントが連鎖してしまった場合に発生します。

極端な例で言えば、
Private Sub Text1_Change()
    Text1.Text = Text1.Text & "W"
End Sub
とした場合、Changeイベントが無限に呼び出され続けるので、最終的には
スタック領域不足となります。

このような時は、「スタック領域が不足しています」のメッセージが
表示されたときに、デバッグモードに切り替えて「Ctrl + L」を押してみましょう。

そうすると、「呼び出し履歴」画面が表示され、どのプロシージャからどのプロシージャが
呼び出されているのかがわかります。
#466-0
RE#448:プロパティ参照の高速化
> プロパティを直接参照すると時間がかかると聞きました。
> そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう?
> 通常なら
> Text1.Enabled = False
> とするのをどうやったら間接的にFalseを設定できますか?

Text1.Enabled = False の時に False を設定しているようなプログラムですと
If Text1.Enabled = True Then Text1.Enabled = False
とすると微笑ながら速度は改善されます。

では、頑張ってくださいね
#468-0
RE#466:プロパティ参照の高速化
> Text1.Enabled = False の時に False を設定しているようなプログラムですと
> If Text1.Enabled = True Then Text1.Enabled = False
> とすると微笑ながら速度は改善されます。
ただし・・・

極端な例では、Falseの状態が数万回に1回等であれば
全体的には速度低下につながります。
※ほとんどがThenなら

オブジェクトの参照を含めてであれば、With 〜 End Withで
幾らか速度Upになります。
※この場合も
 With Text1
    .Enabled = False
  End With
 の様に1回のプロパティ設定だけなら速度低下に
 つながりますので、全体的な流れを読み最適な
 方法を選択するといいです。

 プロパティ別に参照速度が何個から速度が改善
 されるか試してみてください。

 ループとの関連使用での特性も考えてください。

最近の機械では、ループ等がらみでないのであれば
それほど体感する速度アップはないですね・・・
※数年前の機械なら幾らか効果はあります


詳しくはヘルプ(MSDN)で「実行速度の最適化」を読んで
実験してみてください。
#474-0
RE#468:プロパティ参照の高速化
たくさんのご解答ありがとうございます。
しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。
参考までに処理の流れを見ていただきたいと思います。

Private Sub Cmd_追加_Click()
    Dim i       As Long

    '各項目のクリア・有効・無効設定(60項目 × 4のコントロール配列になっています)
    For i = 0 To 3
        Call 出荷情報クリア(i)     'ここでテキストを初期化しています。項目数は60です。
        Call 出荷情報有効無効(True, i) 'ここでコントロールを使用可にしています。
                     '同じく項目数は60です。
    Next

    Lbl_PAGE = "" 'この処理は実行されます。
    Cmd_次へ.Enabled = False
    Cmd_前へ.Enabled = False '※この処理が実行されません。
    TxtNO(0).SetFocus  'この処理は実行されます。
End Sub

この処理でCmd_前へ.Enabled = Falseが実行されず使用不可になってくれません。
特に変な処理とかも無いので、コントロールのプロパティ値設定に時間がかかって
処理が追いついていないのではないかと考えました。当たってますか?
上記の処理での高速化は不可能なのでしょうか?
#475-0
RE#474:プロパティ参照の高速化
> しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。
これは、再帰処理のネストが深すぎる場合や、イベントが連鎖してしまった場合に発生します。

極端な例で言えば、
Private Sub Text1_Change()
    Text1.Text = Text1.Text & "W"
End Sub
とした場合、Changeイベントが無限に呼び出され続けるので、最終的には
スタック領域不足となります。

このような時は、「スタック領域が不足しています」のメッセージが
表示されたときに、デバッグモードに切り替えて「Ctrl + L」を押してみましょう。

そうすると、「呼び出し履歴」画面が表示され、どのプロシージャからどのプロシージャが
呼び出されているのかがわかります。
このページと関連する記事:
#1587-1スタック領域について。1999-07-17(土) 18:44
#448-0プロパティ参照の高速化2001-10-24(水) 19:56
#21732-0大雑把すぎてすみません2002-07-25(木) 13:52
#2480-3スタック領域不足を解消するには?2002-08-26(月) 01:50
#39525-0Changeイヴェントでのテキスト値の変更について2001-02-26(月) 20:08
#12580-0メモリの中で処理するには2000-01-02(日) 17:55
#99-2RE#98:スタックエラーについて2003-04-23(水) 17:39
#21053-0無限ループを抜ける方法2001-05-24(木) 15:57
#38115-0スタック領域の計測のしかたについて2001-02-02(金) 09:18
#3658-0オブジェクトの参照回数を減らしたら、速度が落ちたのはナゼ?1999-11-05(金) 13:30
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)