̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2012/5/7 通巻569号 縮小版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ >>> 商業主義に走らない Twitter。 * The others Last week watched News  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ◇ TwitterのコストロCEO。IPOを検討する必要性も緊急性も感じない。 http://japan.cnet.com/news/business/35016735/ … 強い信念があるからできる。 ◇ 新日鉄ソリューションズがHTML5スマホアプリ開発基盤 hifive をOSSとして公開。 http://itpro.nikkeibp.co.jp/article/NEWS/20120501/394361/ … チュートリアルが充実して学びやすい。 ◇ iOSアプリがAndroidよりクールな理由。 http://pc.nikkeibp.co.jp/article/news/20120502/1048043/ … iOSの方が、部品が充実している。 ◇ Ubuntu 12.04 LTSの日本語版が公開。 http://itpro.nikkeibp.co.jp/article/NEWS/20120504/394561/ … 日本語化してくれた開発者の方々に感謝。 ◇ エルピーダ買収、米マイクロンに内定。 http://www.asahi.com/business/update/0505/TKY201205050490.html … 韓国企業独占によるDRAM価格の急騰はまぬがれたようだ。 ◇ ソフトウェアも大幅に進化。写真で見る GALAXY S III の外観と新機能。 http://plusd.itmedia.co.jp/mobile/articles/1205/04/news010.html … LTE高速通信は、iPhone より先行か。                      Snap Note 3 開発BLOG  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  [ VBScript の配列要素を追加する処理の高速化 ] VBScript で集合(コレクション)を扱いたいときは、配列を使うことが 1つの方法です。 要素を1つずつ追加するときは、次のようにコーディング することになると思います。 ReDim arr(-1) For i=0 To n  ReDim Preserve arr( UBound( arr ) + 1 )  arr( UBound( arr ) ) = i Next このソースコード(以後は「コード」)は、集合に要素を追加したいときに、 配列の要素を+1してから、要素を代入する処理をしています。 このコードは、要素数が大きくなると、非常に処理が遅くなります。 n=10万(10万要素)の場合、0.766秒 もかかります。 1秒未満ですが、 使っていると引っ掛かりを感じる時間であり、何度も実行するとかなり イライラすることでしょう。 時間がかかっているのは、配列の要素を追加している ReDim Preserve の処理 です。 つまり、ReDim Preserve を実行する回数を減らせば、高速化できます。 最初に n=10万 の要素を作成して、ReDim Preserve を1回だけ実行するように 改良したコードは、次のようになります。 ReDim arr(-1) ReDim Preserve arr( n ) For i=0 To n arr( i ) = i Next この場合、0.031秒 で済みます。 25倍も高速になりました。 ただ、このコードは制限事項があります。 最初に全ての要素数が分かっている ときだけしか使えないことです。 しかも、ほとんどのケースでこの制限に 引っかかってしまいます。 この制限事項がなく、ReDim Preserve を実行する回数を減らすには、必要な 要素数がいくつになるか、ある程度、予測することです。 とは言っても、 正確に要素数を予測することは不可能です。 そこで、ReDim Preserve を 実行する回数がなるべく少なくなるような予測をします。 経験則では、 多くのケースで、要素数は100個以下です。 しかし、要素数が何万個になる 場合もなくはありません。 それを踏まえたコードは、次のようになります。 ReDim arr(-1) arr_fast_ubound = UBound( arr ) For i=0 To n  If UBound(arr) <= arr_fast_ubound Then _   ReDim Preserve arr( ( arr_fast_ubound + 100 ) * 4 )  arr_fast_ubound = arr_fast_ubound + 1  arr( arr_fast_ubound ) = i Next ReDim Preserve arr( arr_fast_ubound ) 予測をしているのは、( ( arr_fast_ubound + 100 ) * 4 ) の部分です。 この計算式が、要素数の予測をしています。 そして、最後の ReDim Preserve で正確な要素数を設定しています。 ポイントは、( ( arr_fast_ubound + 100 ) * 4 ) の「 * 4 」の部分です。 ReDim Preserve を実行する回数を減らすなら、1個ずつ要素を増やすのではなく、 100個ずつ要素を増やすこと ( arr_fast_ubound + 100 ) が考えられます。 その場合、ReDim Preserve を実行する回数は、1000回です。 1000個ずつ 要素を増やしても、100回です。 それが、 * 4 を入れるだけで、 要素数を級数的に増やすことができ、実行する回数は、たったの 6回です。 この場合、0.125秒 になります。 6倍の高速になりました。 25倍ほどのインパクトはありませんが、制限事項のために使えなくなることが ありません。 ところで、実行回数が 10万回から 6回に劇的に減ったのに、 6倍しか高速にならないのは、If 文と加算が 10万回実行されることが増えた こともありますが、それほど重い処理ではないため、それよりも、ReDim Preserve を実行するときに増える要素数が大きいほど、速度が遅いことを示しています。 それでも、1ずつ増やす処理を 10万回実行する場合よりも 6倍速いのです。 最初に1度だけ要素数をかなり大きくとって、最後に正確な要素数を設定する ことも考えられます。 つまり、ReDim Preserve を実行する回数が必ず 2回に なります。 そのコードは、次のようになります。 ReDim arr(-1) ReDim Preserve arr( 100000*15 ) For i=0 To n  arr( i ) = i Next ReDim Preserve arr( n ) このコードは、予測した最大要素数が、実際の要素数の 15倍であったケースに 相当します。 この場合、0.125秒 になり、( ( arr_fast_ubound + 100 ) * 4 ) と同じ時間になります。 もし、予測した最大要素数が、実際の要素数の 2倍の場合、 0.047秒 になり、かなり高速になります。 しかし、15倍以上なら遅くなります。 つまり、このコードは、あらかじめ予想される最大要素数が、実際の要素数の15倍 以内という制限事項が付くコードということになります。 しかも、予想される 要素数が「最大」であることが結構キツイです。 また、多くのケースでは、 要素数が 100以下なので、どんなケースでも 20万要素を確保してしまうと、 返って遅くなるでしょう。         ソフトウェアデザイン館 Sage Plaisir 21 について  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ホームページ  >>> http://www.sage-p.com/ メルマガ    >>> http://www.mag2.com/m/0000083983.html ブログ     >>> http://blog.livedoor.jp/sage_p/ ツイッター   >>> http://twitter.com/Ts_Neko ダウンロード  >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災  >>> http://www.sage-p.com/saigai.html メール   >>> ts-neko◇sage-p.com ←◇を@に変えてください          緊急メールは件名に「うどんメール」を付けてください。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このメルマガの登録・解除をするときは… >>> http://www.mag2.com/m/0000083983.htm  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ News & Column are composed by T's-Neko 2012  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄