memo:C#と反復(昨日の続き)

http://neue.cc/2009/09/25_204.html
また一つ学んだ。ありがとうございます。
Linqすてきだ。。これがDB/XMLでも使えるのか。。。
Linqのパフォーマンスってどうなんだろうかねぇ?
こう言うのはトレードオフだと思いますし
EnumerableとEnumeratorの当たりが理解できて無くて気持ち悪い。。
まぁ、いいや。

//データ側
    //名前かえた。すてき。
    public IEnumerable<Stamp> GetEnumerable()
    {
        return stamps.Values;
    }
//利用側
        //Linqいいですね。にやにやするlambda式の世界
        stamps.GetEnumerable().Where(s => (s.Year >= 1999)).ToList()
                    .ForEach(s => { 
                        Console.WriteLine("{0}:{1}",s.Year,s.Name); 
                    });

んで、にやにやする。

//jquery
                   .each(function(){
                      alert(this.html());
                  });
#組み込み
                  .each{|s|
                      puts s
                  }
;;MzScheme
                  (map (lambda (s)
                             (display s)
                           list)

いまやすっかりlambdaの時代ですね。
C#は今日も麗しい。

http://www.ailight.jp/blog/kazuk/archive/2008/02/06/14441.aspx
を読んでいて

                    for (int i = 0; i < loopCount; i++)
                    {
                        foreach (var x in v)
                        {
                            total += x;
                         }
                    }

                    var enu = v.ToList();
                    for (int i = 0; i < loopCount; i++)
                    {
                        foreach (var x in enu)
                        {
                            total += x;
                        }
                    }

にしたらcacheなんだよなぁ、と素朴に思ったりした。cacheを「処理を途中で止めておくこと」
って考えたらこの方法で十分で、後はどれだけうまく「途中」をハンドリングできるか、ってことなんだよなぁ、とか、嘘ですけど。
気合いで実装したcacheは自作クラスを挟むのでインスタンス生成に時間がかかる。(自分の環境だと15倍じゃなくて5倍速だった。)
ある程度繰り返すところからからcacheは処理時間が頭うつようになり速度があがったと評価できる。さりとてそこまでは生の方が速い、となるとちょっとこれはどうだ、となってしまった。
上の方法だと当たり前のようにいつも同じ時間。
要するにforeachの度にlinqの反復子生成が走るのだからそれをやめさせればいいのでしょう?
メモリとかとも関わってくるのだろうけど適宜メンバ変数にでも突っ込む仕組みの方がすてきな気がします。
ただ、foreachを使ってる以上反復子の遅さがあるんでしょう?ってところでFA.
foreachよりfor文が速いとかfor(int i =0; i < hoge.size(); i++){}はjavaだとだめとか、
その辺と同じ構図なのかな?
かといってこんなもの到底自分じゃ書けないんですけどね!