- ベストアンサー
ReDim PreserveとReDimの違いについて
- ReDim Preserveとしたときは9.5秒ぐらいですが、ReDimの時は30秒以上かかっています。
- 普通に値を保持するReDim Preserveの方が遅いと思うのですが、なぜこのような結果になるのでしょうか?
- ここで、ReDim PreserveのPreserveをとって、ReDimだけにすると、数字の増え方が目に見えて遅くなります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、 > ここで、ReDim PreserveのPreserveをとって、ReDimだけにすると、数字の増え方が目に見えて遅くなります。 > ReDim Preserveとしたときは9.5秒ぐらいですが > ReDim の時は 30秒以上かかっています ReDim は 新築 ReDim Preserve は 増築 という喩で説明になっているかと思います。 実際には、Eraseして、メモリの再割り当てをしつつ、配列のサイズ(ディメンション)を再定義するのがReDim 既存のメモリを維持しつつ、メモリを拡張、サイズを再定義するのがReDim Preserve ということになります。 必然的にReDimを繰り返したら遅くなります。 ご提示のコードでPreserve キーワードを抜くと、 kankakuごとに、ReDimしている訳ですから、 せっかく格納したそれまでの値を消去していることになります。 可変長のString型変数の場合は特殊で、割り当てられるメモリサイズが固定ではありませんから 格納したり消去(長さ0の文字列を格納)したりするのに特に時間が掛かります。 ご提示のコードでPreserve キーワードを抜くと、 それまでに格納した文字長に比例したメモリサイズ、は無視されてしまいます。 本来の目的から外れたテストになってしまいます。 可変長の変数なのですから、要素数、だけではなくて、 要素数と文字長、の2点について、色々パラメータを変えながら テストしてみた方がより有意義なものになるのではないかと思います。 Dim ans() As String のように一旦、文字列型として、動的配列変数を予め定義しておいた方が テストの精度が高まりますし、ReDimに掛かる時間も短くなります。 以上です。
お礼
詳しい解説をありがとうございます >>可変長のString型変数の場合は特殊で、割り当てられるメモリサイズが固定ではありませんから 格納したり消去(長さ0の文字列を格納)したりするのに特に時間が掛かります。 ここで納得できました。試しにstringでlongにしてみると、普通のredimでも高速になりましたし、string型のときに要素数が増えれば増えるほどだんだん遅くなっていったのも、redimする度にすべての要素に長さ0の文字列を格納していたせいだと考えると、つじつまがあいます。 >>可変長の変数なのですから、要素数、だけではなくて、 要素数と文字長、の2点について、色々パラメータを変えながら テストしてみた方がより有意義なものになるのではないかと思います。 その通りですね。ただ、実際にパラメータを変えてトライしてみたら、新たな疑問が発生してしまったんですが、この質問自体はもう答えてもらってるので、新しい質問として載せることにします。 ありがとうございました