『BeginUpdate』を使えば『AddRange』を使用した場合と処理速度は変わらない - C#

ListBoxやComboBoxにアイテムを追加する場合、追加する値を配列で持っているなら『AddRange』を使えば1発で済むのだが、そうでない場合もある。

『AddRange』に比べ『Add』メソッドを使用すると処理に時間が掛かってしまうような気になるが、処理速度にどれ程の差があるのか、実際に調べてみた。

『Add』メソッドを使用する場合、再描画に時間が掛かること、コントロールがチラつくことを回避するために『BeginUpdate,EndUpdate』を使用するものとする。

前設定として『ListBoxに文字列(Item)を追加する処理』のみを計測するため、ListBoxに追加する文字列は予め配列に持っているものとしている。

配列の要素数は100000(10万)。

AddRangeメソッドを使用した処理

lst.Items.AddRange(sArr);


Addメソッドを使用した処理
lst.BeginUpdate();
for (int i = 0 ; i < sArr.GetLength(0) ; i++)
{
    lst.Items.Add(sArr[i]);
}
lst.EndUpdate();

上記の処理を100回繰り返し、平均値を求めた。


結果:
  • 『AddRange』を使用した場合 = 753ms
  • 『Add』を使用した場合 = 756ms

3msという差は誤差の範囲と捉えられるだろう。

この結果から『BeginUpdate,EndUpdate』を使用すれば『AddRange』と『Add』は処理速度に差はない

『AddRange』の優位性は可読性のみか。

Operaは日本語でフォント指定しないとダメみたい

最近単なる興味本位で Opera を使用しているのだが、気になったことがあったのでちょっと調べた。

このブログのフォントは『メイリオ』を指定しているが Opera で表示したらメイリオにならない。最初は設定の問題かといろいろ触っていたがどうやらそうではないらしい。

どうもアルファベットでフォントを指定していることがマズイようだ。つまり、フォント指定に『Meiryo』と書いていたのだが、Operaの場合『メイリオ』と書かなければ認識しない

しかし、Safari では日本語での指定は無効になるらしい。
ということで、どちらにも対応するために日本語とアルファベットを併記するのが妥当な対処だろう。

Macユーザーはメイリオが入ってない可能性が高いので代用として、ヒラギノを指定するときにアルファベットでの指定と、Operaを使用しているMacユーザー用に日本語での指定も必要になる。

問題はXP & IE6ユーザーか。

メイリオは『Visual Studio 2008』をインストールすれば自動的にメイリオもインストールされる。
OSがVistaではなく、Visual Studioとも無縁な方はMicroSoftからダウンロード出来ますよ。


Operaの使用感

動作速度はFirefox2ぐらいなのだが、頻繁にぐるぐる(VistaのWait Cursor)が止まらない。

これがOperaのウリなのか、最初からいろいろな機能が組み込まれているのだが、使いこなさないと(覚えないと)メリットはないワケで、それがワザワザ他のブラウザから乗り換えるメリットになるのか?といった感じ。
必要な機能だけをアドオンで追加できる方が使う側にとっては混乱しなくてすむのだが。

ブラウザのデザインはイイ(私見)。


Century Gothic

Operaとは直接関係ない話ですが、このブログで使用しているもう一つのフォントである『Century Gothic』について。

個人的に好きな字体で本当はメインで使用したいのだが、たまにコードを書くので慣れないフォントが使われていると読みづらいことを実感しているのでここは控えて、サイドバーで使用しているが、これもデフォルトで入っているわけではなく、『Microsoft Office』とともにインストールされる。

こうして見ると、改めて不自由ですな。

JavaScriptの配列は摩訶不思議

JavaScriptの配列を扱うコードを書いていて、間違えて宣言した要素数より多く値を代入してしまった。しかし、何事もなく値が返されることに驚いた。なぜ?といろいろ試してみることにした。

まず、配列の要素数を宣言する。

strNum = new Array(2);//要素数を宣言する
strNum[2] = "弐";
宣言した要素数は『2』なので、以下の二つしかないはず。
  1. strNum[0]
  2. strNum[1]
つまり『strNum[2]』はない。

なので
『strNum[2] = "弐";』
の時点でコンパイル時にエラーとなる。

しかし、JavaScriptなので、そこは百歩譲ってヨシとしよう。

が、このまま『strNum[2]』を使用出来てしまうのはどういうこと?
document.write(strNum[2]);
これで『弐』と表示されるのが理解不能。

さらにもっと理解不能なのが要素数を宣言しなくても配列に代入出来てしまうこと。
strNum = new Array();//要素数を宣言しない。
strNum[2] = "弐";
こんなことも可能でしかも、
document.write(strNum[2]);
これで『弐』とちゃんと表示されるのがまたまた理解不能。

結論:
JavaScriptは配列数を宣言してもしなくても何も変わらない

こんなユルユルな仕様でイイのか?

『StringBuilder』は速い - C#

ループで何度も文字列を加えていく処理を行う場合、『+=』を使うのではなくて、『StringBuilder』クラスを使うと格段に処理が速い。VBもフレームワークは同じなのでVBユーザーも。

どれだけ処理速度に違いがあるのか、サンプルとして100000回繰り返す処理をしてみた。

サンプルコード:

static void Main(string[] args)
{
    string addWord = "abc";
    int loopCnt = 100000;
    DateTime beginTime = new DateTime();

    //::::::::::::::::::::::::::::::::::::::::::::::::::::://

    StringBuilder tmpSB = new StringBuilder();

    beginTime = DateTime.Now;

    for (int i = 0; i < loopCnt ; i++)
    {
        tmpSB.Append(addWord);
    }
    Console.WriteLine("StringBuilderを使用した場合:" + (DateTime.Now - beginTime).TotalMilliseconds + "ms");

    //::::::::::::::::::::::::::::::::::::::::::::::::::::://

    string tmp = "";

    beginTime = DateTime.Now;

    for (int i = 0; i < loopCnt; i++)
    {
        tmp += addWord;
    }
    Console.WriteLine("+= で処理した場合:" + (DateTime.Now - beginTime).TotalMilliseconds +"ms");
}


結果)
  • StringBuilderを使用した場合:6ms
  • += で処理した場合:19700ms


上記では加えていく文字列は3文字だが、これを倍の6文字にすると結果は
  • StringBuilderを使用した場合:6ms
  • += で処理した場合:50290ms

StringBuilderでの処理時間に差はないが、+=はやはり加える文字列の長さが処理時間に影響するようだ。


参考)PCスペック
OS: Win Vista
CPU: Core 2 Duo 2.66GHz

これだけ違うなら使う気にもなるだろう。
でも、実際はこんなに文字列を加える処理ってあまり行う機会はないんですけど…

急上昇検索ワード & etc フィード一覧

『Google Feed API』のサンプルを作成する際に、取得するフィードをあちこち探していたときに蓄えたものを整理も兼ねてここに挙げておきます。


急上昇ワードランキングのフィード

Yahoo - 急上昇ワードランキング
さすが大手というべきか、実際にフィードを見ると、どんな情報を知るためにそのワードで検索されているのかが分かるような内容となっている。
http://searchranking.yahoo.co.jp/burst_ranking/


BIGLOBEサーチ
急上昇ワードランキングのフィードは過去1週間の統計しか取得できないし、フィードの内容にも不満。
http://search.biglobe.ne.jp/ranking/


goo - キーワードランキング
独自に算出したポイントでランキングされている。他にも様々(独自のアンケート結果など)なランキングのフィードを取得できるようだ。
http://ranking.goo.ne.jp/keyword/


excite - トレンドトラッカー
『話題の人』『話題のゲーム』などといったカテゴリー別にランキングされている。フィードもそのカテゴリー別に取得できる。
http://tt.excite.co.jp/


[nifty - 瞬!ワード]
RSSフィードは一応あるのだが内容は良く言えば質素です。
http://www.nifty.com/shun/ranking.htm


YouTube - トレンド
YouTubeでもを配信していた。20位までの急上昇ワード、『上昇』『下降』『新規』という情報まで分かる。
http://jp.youtube.com/hottrends


その他のサイト:
MSN(Windows Liveも含めて)は(苦笑いしか…)、フィードの有無以前にこの手の情報は一切ない。
Googleは探してもこれくらいしか出てこなかった。相変わらず自身の情報は出さないようですね。

オリコンのランキングを取得できないかと調べたがダメでした。オリコンのサイトで配布している単体アプリ『ORICONティッカー』とやらでなら閲覧出来るようだ。今どきガジェットでもない単体アプリを使用させるとは如何なものか。




ポータルサイト、SBMサービスのフィード一覧


[Google - News]
Googleが公にフィードを公開しているのはここぐらいでした。

RSS and Atom Feeds : Terms of Use - Google News Help

これによると、日本のニュースのフィードはまだサポートしていないということですが、『話題のニュース』だけはフィードを取得出来ました。いろいろ試したのですが、例えばトップニュースに関しては『topic=h』では取得出来ないようです。


Yahoo - News
ニュースフィードの種類も充実。お好みでどぞ。
http://public.news.yahoo.co.jp/rss/



はてな - 最近の人気エントリー
はてなのエントリーの場合、RSSリーダーを使わずともガジェットからこれをチェックしている人は多いだろう。
http://b.hatena.ne.jp/hotentry

その他にも、下記にその一部を挙げたが様々なフィードを提供している。


newsing
サクッと見つかったんで挙げときます。
http://newsing.jp/about/feedlist


イザ!
特に…
http://www.iza.ne.jp/help/rss.html


livedoor - 注目度ランキング
注目度ランキングの他、おすすめフィードなどをOPMLで提供。
http://reader.livedoor.com/ranking/hot.html


livedoor - RSS一覧
livedoorのフィードはこちらからの方が早いか。
http://docs.livedoor.com/rss/


Digg RSS Feeds
http://digg.com/about-rss


delicious - Recent Bookmarks
フィード登録ボタンはページ左下にあるのだが、『Recent』のリンクを押すたびに内容が変わる仕組みになっているのが意味不明。
http://delicious.com/recent/;_ylt=A0wNBqDgiqJItnYB15FVRh54;_ylv=3

delicious - Popular Bookmarks
トップページ左下にフィード登録ボタン有り
http://delicious.com/


Tecchnorati - 人気のキーワード
トップページのやや左上辺りに「人気のキーワード」のフィード登録ボタンがある。下の画像でも確認できるがメニューらしき「エンタメ」「テクノロジー」「経済・社会」「スポーツ」といったボタンを押すとフィードを取得できる。(この作りには正直参った。どう見てもメニューにしか見えない)
http://feeds.technorati.jp/


[YouTube]
ここから「おすすめ」「話題の動画」「新着動画」などのフィードを登録できる。
http://jp.youtube.com/browse?s=rf&c=0&l=&b=0


iTunes Store RSS Feed Generator
これはイイ。みんな真似すればイイのに。
http://phobos.apple.com/WebObjects/MZStoreServices.woa/wa/MRSS/rssGenerator

Sony Style(ソニースタイル)
デル株式会社

Recent Posts