<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/sklab/">
    <title>sklab @ ウィキ</title>
    <link>http://w.atwiki.jp/sklab/</link>
    <atom:link href="https://w.atwiki.jp/sklab/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>sklab @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2015-08-23T21:40:28+09:00</dc:date>
    <utime>1440333628</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/54.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/53.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/52.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/51.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/50.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/49.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/48.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/47.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/46.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/45.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/54.html">
    <title>キャッシュ</title>
    <link>https://w.atwiki.jp/sklab/pages/54.html</link>
    <description>
      #contents  

** Generic Type Caching
generic &amp; static なクラスをキャッシュとして使うことである。~
型引数が key、static メンバが value に相当する。~
静的コンストラクタは、クラスの呼び出し時に1回だけ実行され、スレッドセーフである。~
そして、型引数はコンパイル時に解決されるため、Dictionary などの動的な key ルックアップと比べて、圧倒的に早い。
new { 変数名 }.GetType().GetProperties()[0].Nameで変数名を文字列で取得できる。

  private static class GenericCache&lt;T&gt;
    {
        public static string GetName&lt;T&gt;(this T source) where T : class
        {
            return GenericCache&lt;T&gt;.Name;
        }

        static GenericCache()
        {
            var properties = typeof(T).GetProperties();
            Name = properties[0].Name;
        }

        public static readonly string Name;
        
    }
**MyCacheを作ってみる。
-Dictionaryでkeyにオブジェクトなんかを入れている場合、そのkeyがGC対象になったときにvalueもGC対象にする
-変数（フィールドやらローカル変数やら）に格納されている参照のことを「強い参照」と言う。~
「アクセス可能なオブジェクト」とは、強い参照が存在するオブジェクトのことを言う。~
ただし、その強い参照を所持しているオブジェクトもアクセス可能なオブジェクトである必要がある。~
つまり、強い参照を所持しているオブジェクトを辿って行くとアクセス不可能なオブジェクトに辿り着く場合、~
それらは全てアクセス不可能なオブジェクトである。~
また、実際にアク    </description>
    <dc:date>2015-08-23T21:40:28+09:00</dc:date>
    <utime>1440333628</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/53.html">
    <title>スレッド</title>
    <link>https://w.atwiki.jp/sklab/pages/53.html</link>
    <description>
      #contents


**専用スレッドを使用して非同期の計算量依存の処理を実行する

-下記に当てはまる場合は専用スレッドを使用したほうがよい
--通常とは異なる優先度で動作するスレッドが必要な場合
--スレッドをフォアグラウンドスレッドとして動作させ、そのスレッドのタスクが完了するまでアプリケーションが終了しない
--計算量依存のタスクに非常に長い時間がかかる
--スレッドを開始した後で、完了する前にThreadのAbortメソッドを呼び出してスレッドを中止する場合

***専用スレッド作成
Thread dedicatedThread = new Thread(MethodName);~
dedicatedThread.Start(5);

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述

**memo

-最適なスレッド数はCPUの数と同じ。コンテキストスイッチが発生しないため    </description>
    <dc:date>2015-08-20T21:22:10+09:00</dc:date>
    <utime>1440073330</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/52.html">
    <title>Effective  C</title>
    <link>https://w.atwiki.jp/sklab/pages/52.html</link>
    <description>
      #contents

**#1.publicなデータメンバではなく、プロパティを使う
-publicならばプロパティを使う
-全てのデータメンバは例外なくprivateにするべき
-インデクサを使用することでdictionary機能を付加することもできる

**#2.constよりもreadonlyを使う
-パフォーマンスはconstが優位
-constはリビルドしないと値が更新されない

**#3.キャスト時にはisあるいはas演算子を使う
-as演算子は型変換を行うが、is演算子は型変換が可能かを返すのみ
-as演算子とキャストではas演算子の方が高速に動作する
-as演算子は参照型のみに有効(値型はnullを取れない)

**#4.#ifの代わりにConditional属性を使用する
-実行の有無が切り替えられる。
-例：[Conditional(&quot;DEBUG&quot;)]
-voidのみ適用可能
-#if/#endifよりも最適なコードが記述される

**#5.ToString()を常に実装する
-独自にクラスを定義する場合、そのクラスを利用する全てのコードに意味のあるToString()を実装するべき
-複雑な情報を持つ型を作成する場合にはIFormattable.ToString()    </description>
    <dc:date>2015-08-19T22:14:54+09:00</dc:date>
    <utime>1439990094</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/51.html">
    <title>スレッド処理</title>
    <link>https://w.atwiki.jp/sklab/pages/51.html</link>
    <description>
      #contents

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述    </description>
    <dc:date>2015-08-11T18:52:58+09:00</dc:date>
    <utime>1439286778</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/50.html">
    <title>スレッドの基礎</title>
    <link>https://w.atwiki.jp/sklab/pages/50.html</link>
    <description>
      #contents

**専用スレッドを使用して非同期の計算量依存の処理を実行する

-下記に当てはまる場合は専用スレッドを使用したほうがよい
--通常とは異なる優先度で動作するスレッドが必要な場合
--スレッドをフォアグラウンドスレッドとして動作させ、そのスレッドのタスクが完了するまでアプリケーションが終了しない
--計算量依存のタスクに非常に長い時間がかかる
--スレッドを開始した後で、完了する前にThreadのAbortメソッドを呼び出してスレッドを中止する場合

***専用スレッド作成
Thread dedicatedThread = new Thread(MethodName);~
dedicatedThread.Start(5);

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述

**memo

-最適なスレッド数はCPUの数と同じ。コンテキストスイッチが発生しないため    </description>
    <dc:date>2015-08-20T21:20:25+09:00</dc:date>
    <utime>1440073225</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/49.html">
    <title>アプリケーションドメインとCLRのホスティング</title>
    <link>https://w.atwiki.jp/sklab/pages/49.html</link>
    <description>
      -memo
--MSCorEE.dllはどのCLRバージョンを生成するか決める際に際に使用される。
--マーシャリングとは、プロセスのオブジェクトを境界越しに処理できるようにする過程のことです。例えば、Word のオブジェクトを Excel のスプレッドシート上に貼り付ける場合、プロセスの境界を越える必要があります。
--すべてのプロセスは、アプリケーションドメインを持ち、さらに新規のアプリケーションドメインを作成することができます。アプリケーションドメインは、独立して開始、停止させることができます。これを利用して、例えば、別のプログラマが書いたライブラリを実行する場合、２番目のアプリケーションドメインに隔離することで、このライブラリがクラッシュしても、プログラム全体を停止させてしまわないようにすることができます。    </description>
    <dc:date>2015-08-10T11:55:40+09:00</dc:date>
    <utime>1439175340</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/48.html">
    <title>マネージヒープとガベージコレクション</title>
    <link>https://w.atwiki.jp/sklab/pages/48.html</link>
    <description>
      #contents 

*マネージヒープの基本
-CLRではすべてのリソースはマネージヒープから割り当てられる。
-ヒープ内で次にオブジェクトを割り当てる場所を示すポインター(NextObjPtr)を管理する
-CLRはプロセスのアドレス空間が満杯になるまで領域を割り当てる(32bitでは1.5GB)

**マネージヒープからリソースを割り当てる
-型のフィールドに必要なバイト数を計算する。
-オブジェクトのオーバヘッドフィールドに必要なバイト数を計算する(32bitでは8byte,64bitでは16byte)。
-使用可能かどうかをCLRにて検査し、可能であればNextObjPtrにオブジェクトを格納する。ない場合はGCを呼ぶ
--マネージヒープではオブジェクトの割り当てはポインターへの加算のみであり、非常に高速

**GCのアルゴリズム
-オブジェクトの生存期間を管理するために参照カウントを行う(参照カウントALG=循環参照時に問題あり)
-参照追跡型のアルゴリズムを使用する。
-GCを開始すると、CLRはプロセス内のすべてのスレッドを停止する
--ステートが変更されるのを防ぐためである
-マーキングフェーズを開始する
--参照型の変数root(クラスの静的インスタンスフィールド、メソッドの引数などの総称)
--rootがnullであるならばそのルートを無視し、次を検査する
-コンパクションフェーズ
--どのオブジェクトが生き残るか、削除するかを前フェーズで完了している
--すべての生き残りオブジェクトをコンパクションしてメモリ上で連続するようにする =参照の局所性が上がる
--このフェーズではオブジェクトのポインタが変わるため、アプリケーションがオブジェクトを参照できなくなる。
---参照先のオブジェクトがメモリ内で移動したバイト数を各ルートから引き算している
-重要
--静的フィールドは永久にまたは型がロードアプリケーションドメインがアンロードされるまで参照先のオブジェクトを保持する。
--メモリリークが発生する主な原因はコレクションオブジェクトを参照する静的フィールドであり、コレクションオブジェクトに項目を追加したままになっていることである。

-世代別ガーベジコレクション

*memo
-    </description>
    <dc:date>2015-08-10T11:17:20+09:00</dc:date>
    <utime>1439173040</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/47.html">
    <title>ショートコードプログラミング</title>
    <link>https://w.atwiki.jp/sklab/pages/47.html</link>
    <description>
      #contents

*TryParseを使用する
string src = &quot;123&quot;; ~
int result; ~
Console.WriteLine(int.TryParse(src,out result) ? result : -1); ~
処理の重い例外を避けることができる。定石は if(int.Tryparse(xxx, out yyy)){処理}

*null合体演算子
string a = &quot;We are the Hello World!!&quot;; ~
Console.WriteLine(a ?? &quot;(null)&quot;); ~
nullポインタ参照を劇的に減らす事ができる。~
WindowsフォームアプリケーションのNullチェックにも適用可能。~
string str = (string)listBox1.SelectedItem ?? &quot;not selected&quot;;

*引数にラムダ式
大事

*名前を指定したメソッド呼出
dynamicが一番

*列挙可能なオブジェクトを作ってみる
class Sample : IEnumerable&lt;int&gt;{ ~
&amp;nbsp; public IEnumerator&lt;int&gt; GetEnumerator(){ ~
&amp;nbsp; &amp;nbsp; for(int i=0,i&lt;10; i++) yield return i;~
&amp;nbsp;}

IEnumerator IEnumerator.GetEnumerator(){~
&amp;nbsp; return GetEnumerator(); ~
}~
yield returnが本当に便利。foreachが使える。

*連番の生成
Enumerable.Range(1,10)

*配列まとめ
var found = a.FindAll((c)=&gt;c&gt;0); // 0よりも大きい数値を返す ~ 
foreach(var n in a.Where((c)=&gt; c &gt; 0) //ループなしで塊をさばく1 ~
a.Where((c)=&gt;c&gt;0).Count() //ループなしで塊をさばく2 ~ 
foreach(var n in a.SkipWhile(c,i)=&gt;i &lt;= 0)) // 先頭行を飛ばす。C    </description>
    <dc:date>2015-08-18T21:47:16+09:00</dc:date>
    <utime>1439902036</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/46.html">
    <title>.NETアプリケーション最適化技法</title>
    <link>https://w.atwiki.jp/sklab/pages/46.html</link>
    <description>
      #contents

*型の内部
-1000万個の点の配列をメモリに格納することを考える。
--参照型
---1000万個の点の配列に含まれるのは同じ数の参照(約40MB)
---オブジェクト自体の使用量も含むとおよそ160MBにもなる。
---ヒープに格納されるとメモリ内で連続する保証はなく、アプリケーションの実行時間が遅くなる。
--値型
---無駄なく1000万個の点が収容され、合計40MBとなる。メモリ密度が大幅に異なる。

**.NETの参照型
クラス、デリゲート、インターフェイス、配列、string

**ストレージ、割り当て、解放
-参照型は常にマネージヒープ領域に割り当てられる(ポインタ操作)。
-ポインタ操作によりパフォーマンスが著しく低下する。    </description>
    <dc:date>2015-05-07T22:43:25+09:00</dc:date>
    <utime>1431006205</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/45.html">
    <title>オライリー</title>
    <link>https://w.atwiki.jp/sklab/pages/45.html</link>
    <description>
      -FindAllやFindAllIndexなどは便利
-stringのTrimなどはコピーを返している
-匿名型であっても裏ではクラスが作成されている
-一度作成された文字列は不変    </description>
    <dc:date>2015-04-07T23:08:58+09:00</dc:date>
    <utime>1428415738</utime>
  </item>
  </rdf:RDF>
