■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#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
匿名4482001-10-24(水) 10:56
プロパティを直接参照すると時間がかかると聞きました。 そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? 通常なら Text1.Enabled = False とするのをどうやったら間接的にFalseを設定できますか?
LESIA2001-10-24(水) 12:24
> プロパティを直接参照すると時間がかかると聞きました。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? 変数に代入して使います。 例えば、 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を設定できますか? これは参照じゃなくて設定なので、こうする以外には方法は ありません
よねKEN2001-10-24(水) 12:39
> プロパティを直接参照すると時間がかかると聞きました。 その通りです。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? > 通常なら > 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 のようにするとよいということです。 質問にある例では参照、及び、設定の回数を減らしようがありません。
LESIA2001-10-24(水) 21:24
> プロパティを直接参照すると時間がかかると聞きました。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? 変数に代入して使います。 例えば、 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を設定できますか? これは参照じゃなくて設定なので、こうする以外には方法は ありません
よねKEN2001-10-24(水) 21:39
> プロパティを直接参照すると時間がかかると聞きました。 その通りです。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? > 通常なら > 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 のようにするとよいということです。 質問にある例では参照、及び、設定の回数を減らしようがありません。
ろってんまいあ2001-10-25(木) 00:36
> プロパティを直接参照すると時間がかかると聞きました。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? > 通常なら > Text1.Enabled = False > とするのをどうやったら間接的にFalseを設定できますか? Text1.Enabled = False の時に False を設定しているようなプログラムですと If Text1.Enabled = True Then Text1.Enabled = False とすると微笑ながら速度は改善されます。 では、頑張ってくださいね
ゆう(U)2001-10-25(木) 01:04
> 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)で「実行速度の最適化」を読んで 実験してみてください。
匿名4742001-10-25(木) 01:55
たくさんのご解答ありがとうございます。 しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。 参考までに処理の流れを見ていただきたいと思います。 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が実行されず使用不可になってくれません。 特に変な処理とかも無いので、コントロールのプロパティ値設定に時間がかかって 処理が追いついていないのではないかと考えました。当たってますか? 上記の処理での高速化は不可能なのでしょうか?
魔界の仮面弁士2001-10-25(木) 02:05
> しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。 これは、再帰処理のネストが深すぎる場合や、イベントが連鎖してしまった場合に発生します。 極端な例で言えば、 Private Sub Text1_Change() Text1.Text = Text1.Text & "W" End Sub とした場合、Changeイベントが無限に呼び出され続けるので、最終的には スタック領域不足となります。 このような時は、「スタック領域が不足しています」のメッセージが 表示されたときに、デバッグモードに切り替えて「Ctrl + L」を押してみましょう。 そうすると、「呼び出し履歴」画面が表示され、どのプロシージャからどのプロシージャが 呼び出されているのかがわかります。
ろってんまいあ2001-10-25(木) 09:36
> プロパティを直接参照すると時間がかかると聞きました。 > そこで、プロパティを直接見ないようにするにはどうしたら良いのでしょう? > 通常なら > Text1.Enabled = False > とするのをどうやったら間接的にFalseを設定できますか? Text1.Enabled = False の時に False を設定しているようなプログラムですと If Text1.Enabled = True Then Text1.Enabled = False とすると微笑ながら速度は改善されます。 では、頑張ってくださいね
ゆう(U)2001-10-25(木) 10:04
> 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)で「実行速度の最適化」を読んで 実験してみてください。
匿名4742001-10-25(木) 10:55
たくさんのご解答ありがとうございます。 しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。 参考までに処理の流れを見ていただきたいと思います。 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が実行されず使用不可になってくれません。 特に変な処理とかも無いので、コントロールのプロパティ値設定に時間がかかって 処理が追いついていないのではないかと考えました。当たってますか? 上記の処理での高速化は不可能なのでしょうか?
魔界の仮面弁士2001-10-25(木) 11:05
> しかし、なかなかうまくいきません。終いには"スタック領域が不足"のメッセージが出てしまいます。 これは、再帰処理のネストが深すぎる場合や、イベントが連鎖してしまった場合に発生します。 極端な例で言えば、 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