<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>5年目プログラマーのC＃入門？</title>
<link>https://ameblo.jp/beginning-blogram/</link>
<atom:link href="https://rssblog.ameba.jp/beginning-blogram/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>将来性がありそうなC#を一から勉強してみる。</description>
<language>ja</language>
<item>
<title>簡単な速度比較4 文字列連結</title>
<description>
<![CDATA[ <p>今日は今読んでいる本に書いてあった内容が気になったのでテストしてみました。</p><br><p>その内容とは</p><br><p>String型の変数A,B,Cがあったとします。</p><br><p>A = B + C</p><br><p>とした場合、AはBとCの参照を持ちます。</p><br><p>その状態でB(もしくはC)の値を変更するとB(もしくはC)は新しく領域を確保し、</p><br><p>そこに変更した値が入ります。</p><br><p>※かなり自分の言葉に直してしまいましたがだいたいこんな事が書いてあったと思います。</p><br><p>そこで気になった事は</p><br><p>Aは参照を持つわけだから単純に文字列の結合、代入は非常に高速である。</p><br><p>しかし代入後、元の変数に変更がかかると新たに領域を確保する必要がある為、</p><br><p>パフォーマンスが低下するのでは無いかと。</p><br><p><br>まぁ基本的に代入した元の変数をあれやこれやと変更するシチュエーションなんて</p><br><p>あまり無いわけで、思い浮かぶシチュエーションはバグの温床になる様な使い方なので</p><br><p>この検証自体あまり意味の無いものの様な気がしますが、一応試してみました。</p><br><p><br>/** ソース */</p><br><p>using System;<br>using System.Runtime.InteropServices;</p><p>class sampleClass1{</p><p> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</p><p> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   String a = "";<br>   String a1 = "";<br>   String a2 = "";<br>   for (long i=0; i&lt;1000000; i++){<br>    String b = "a1";<br>    String c = "a2";<br>    a = b + c;<br>    a1 = "b";<br>    a2 = "c";<br>    if( i == 0 ) Console.WriteLine( a + "," + b + "," + c );<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</p><br><p>class sampleClass2{</p><p> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</p><p> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   String a = "";<br>   for (long i=0; i&lt;1000000; i++){<br>    String b = "a1";<br>    String c = "a2";<br>    a = b + c;<br>    b = "b";<br>    c = "c";<br>    if( i == 0 ) Console.WriteLine( a + "," + b + "," + c );<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</p><br><p>/* ソース **/</p><br><p>/** 実行結果 */</p><br><p>d:\プログラム&gt;sampleChain1<br>a1a2,a1,a2<br>開始値: 15389500331030<br>終了値: 15389681236464<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒。<br>時間: 0.180852986633876 秒。</p><br><p>d:\プログラム&gt;sampleChain2<br>a1a2,b,c<br>開始値: 15391185512763<br>終了値: 15391382638861<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒。<br>時間: 0.197068948005079 秒。</p><br><p>/* 実行結果 **/</p><br><p>/** ildasm */</p><br><p>// sampleClass1</p><p>  IL_0039:  ldstr      "a1"<br>  IL_003e:  stloc.s    V_7<br>  IL_0040:  ldstr      "a2"<br>  IL_0045:  stloc.s    V_8<br>  IL_0047:  ldloc.s    V_7<br>  IL_0049:  ldloc.s    V_8<br>  IL_004b:  call       string [mscorlib]System.String::Concat(string,<br>                                                              string)<br>  IL_0050:  stloc.3<br>  IL_0051:  ldstr      "b"<br>  IL_0056:  stloc.s    V_4<br>  IL_0058:  ldstr      "c"<br>  IL_005d:  stloc.s    V_5<br>  IL_005f:  ldloc.s    V_6<br>  IL_0061:  ldc.i4.0<br>  IL_0062:  conv.i8</p><p><br>// sampleClass2</p><p>  IL_002b:  ldstr      "a1"<br>  IL_0030:  stloc.s    V_5<br>  IL_0032:  ldstr      "a2"<br>  IL_0037:  stloc.s    V_6<br>  IL_0039:  ldloc.s    V_5<br>  IL_003b:  ldloc.s    V_6<br>  IL_003d:  call       string [mscorlib]System.String::Concat(string,<br>                                                              string)<br>  IL_0042:  stloc.3<br>  IL_0043:  ldstr      "b"<br>  IL_0048:  stloc.s    V_5<br>  IL_004a:  ldstr      "c"<br>  IL_004f:  stloc.s    V_6<br>  IL_0051:  ldloc.s    V_4<br>  IL_0053:  ldc.i4.0<br>  IL_0054:  conv.i8</p><p><br>/* ildasm **/</p><br><p>この結論から確かに代入の対象になった変数の書き換えが遅い事が判明しました。</p><br><p>ただIntの時は常に実行結果は同じ時間がかかっていたのにStringの比較になってから</p><br><p>プログラムの計測した時間が微妙にぶれるようになりました。</p><br><p>原因はわかりませんが、一応速度差はこの様になりました。</p><br><p>ただこの速度差を重視するかどうかは人それぞれの様な気もします。</p><br><p>故意にこの様なコードを書く人はあまりいないと思うし、普通にプログラムを</p><br><p>組む分には誤差程度かもしれません。</p><br><p>とは言ったものの、私はこういうコードを極力減らすようにしてしまうと思いますが。</p><br><p>プログラマーにとってこういう取捨選択案外あってそれでソースコードや開発手法等に</p><br><p>個性が出てくるものです。</p><br><p>ただ一つ言える事はチームで開発する場合は自分の個性は極力潜める事。</p><br><p>協調性のある行動を取れる人になれる事が大事かと思います。</p><p><br>タイトルと結論が全く関係無いのは愛嬌と言う事で(*゜▽゜ノノ゛☆</p>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014328047.html</link>
<pubDate>Tue, 04 Jul 2006 22:08:24 +0900</pubDate>
</item>
<item>
<title>簡単な速度比較３</title>
<description>
<![CDATA[ <p>日曜はお休みしてしまいました。</p><br><p>さて速度比較の続きですが、今日はStringで試してみたいと思います。</p><br><p>さっそくソースです。</p><br><p>/** ソース */</p><br><p>using System;<br>using System.Runtime.InteropServices;</p><br><p>// Stringをnullで初期化<br>class sampleClass1{</p><p> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</p><p> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    String a = null;<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</p><br><p>// Stringを""で初期化<br>class sampleClass2{</p><p> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</p><p> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    String a = "";<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</p><br><p>// Stringを"abcdefghijklmnopqrstuvwxyz"で初期化<br>class sampleClass3{</p><p> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</p><p> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    String a = "abcdefghijklmnopqrstuvwxyz";<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}<br></p><p>/* ソース **/</p><br><p>/** 実行結果 */ </p><br><p>d:\プログラム&gt;sampleString1<br>開始値: 12065979907598<br>終了値: 12066688345410<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒。<br>時間: 0.708232424596867 秒。</p><br><p>d:\プログラム&gt;sampleString2<br>開始値: 12068098674440<br>終了値: 12068807330977<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒。<br>時間: 0.708451086185006 秒。</p><br><p>d:\プログラム&gt;sampleString3<br>開始値: 12070231692938<br>終了値: 12070940903640<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒。<br>時間: 0.709005090523748 秒。</p><br><p>/* 実行結果 **/</p><br><p>結論としてはなにで初期化しようがあんまり速度的には変わらないと言う事でしょうか。</p><br><p>ildasmでそれぞれを比較してみます。</p><br>// Stringをnullで初期化<br><p>  IL_0023:  nop<br>  IL_0024:  ldnull<br>  IL_0025:  stloc.s    V_4<br></p><p>// Stringを""で初期化<br>  IL_0023:  nop<br>  IL_0024:  ldstr      ""<br>  IL_0029:  stloc.s    V_4<br></p><p>// Stringを"abcdefghijklmnopqrstuvwxyz"で初期化<br>  IL_0023:  nop<br>  IL_0024:  ldstr      "abcdefghijklmnopqrstuvwxyz"<br>  IL_0029:  stloc.s    V_4<br></p><p>上記結果を見てもこの3種類の命令はどれも似たようなスピードで実行されるのがわかりました。</p><br><p>ただ厳密には上から順に早いみたいなのでその差が気になる人はnullで初期化する事をお勧めします。</p><br>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014303081.html</link>
<pubDate>Tue, 04 Jul 2006 00:55:32 +0900</pubDate>
</item>
<item>
<title>簡単な速度比較2</title>
<description>
<![CDATA[ <p>前回に続きnullをセットする方がなぜ遅いかについて説明したいと思います。</p><br><p>(かなり予想のレベルなので間違えているかもしれませんが）</p><br><br><p>※ildasmを使った結果です。</p><br><p>.method public hidebysig static int32  Main() cil managed<br>{<br>  .entrypoint<br>  // コード サイズ       204 (0xcc)<br>  .maxstack  3<br>  .locals init (int64 V_0,<br>           int64 V_1,<br>           int64 V_2,<br>           int64 V_3,<br>           valuetype [mscorlib]System.Nullable`1&lt;int32&gt; V_4,<br>           int32 V_5,<br>           bool V_6)<br>  IL_0000:  nop<br>  IL_0001:  ldc.i4.0<br>  IL_0002:  conv.i8<br>  IL_0003:  stloc.0<br>  IL_0004:  ldc.i4.0<br>  IL_0005:  conv.i8<br>  IL_0006:  stloc.1<br>  IL_0007:  ldc.i4.0<br>  IL_0008:  conv.i8<br>  IL_0009:  stloc.2<br>  IL_000a:  ldloca.s   V_0<br>  IL_000c:  call       int16 sampleClass1::QueryPerformanceCounter(int64&amp;)<br>  IL_0011:  ldc.i4.0<br>  IL_0012:  ceq<br>  IL_0014:  stloc.s    V_6<br>  IL_0016:  ldloc.s    V_6<br>  IL_0018:  brtrue     IL_00c4<br>  IL_001d:  nop<br>  IL_001e:  ldc.i4.0<br>  IL_001f:  conv.i8<br>  IL_0020:  stloc.3<br>  IL_0021:  br.s       IL_0032<br>  IL_0023:  nop<br>  IL_0024:  ldloca.s   V_4<br>  IL_0026:  initobj    valuetype [mscorlib]System.Nullable`1&lt;int32&gt;<br>  IL_002c:  nop<br>  IL_002d:  ldloc.3<br>  IL_002e:  ldc.i4.1<br>  IL_002f:  conv.i8<br>  IL_0030:  add<br>  IL_0031:  stloc.3<br>  IL_0032:  ldloc.3<br>  IL_0033:  ldc.i4     0x5f5e100<br>  IL_0038:  conv.i8<br>  IL_0039:  clt<br>  IL_003b:  stloc.s    V_6<br>  IL_003d:  ldloc.s    V_6<br>  IL_003f:  brtrue.s   IL_0023<br>  IL_0041:  ldloca.s   V_1<br>  IL_0043:  call       int16 sampleClass1::QueryPerformanceCounter(int64&amp;)<br>  IL_0048:  pop<br>  IL_0049:  ldstr      bytearray (8B 95 CB 59 24 50 3A 00 20 00 )                   // ...Y$P:. .<br>  IL_004e:  ldloc.0<br>  IL_004f:  box        [mscorlib]System.Int64<br>  IL_0054:  call       string [mscorlib]System.String::Concat(object,<br>                                                              object)<br>  IL_0059:  call       void [mscorlib]System.Console::WriteLine(string)<br>  IL_005e:  nop<br>  IL_005f:  ldstr      bytearray (42 7D 86 4E 24 50 3A 00 20 00 )                   // B}.N$P:. .<br>  IL_0064:  ldloc.1<br>  IL_0065:  box        [mscorlib]System.Int64<br>  IL_006a:  call       string [mscorlib]System.String::Concat(object,<br>                                                              object)<br>  IL_006f:  call       void [mscorlib]System.Console::WriteLine(string)<br>  IL_0074:  nop<br>  IL_0075:  ldloca.s   V_2<br>  IL_0077:  call       int16 sampleClass1::QueryPerformanceFrequency(int64&amp;)<br>  IL_007c:  pop<br>  IL_007d:  ldstr      bytearray (51 00 75 00 65 00 72 00 79 00 50 00 65 00 72 00   // Q.u.e.r.y.P.e.r.<br>                                  66 00 6F 00 72 00 6D 00 61 00 6E 00 63 00 65 00   // f.o.r.m.a.n.c.e.<br>                                  43 00 6F 00 75 00 6E 00 74 00 65 00 72 00 20 00   // C.o.u.n.t.e.r. .<br>                                  6E 30 00 67 0F 5C 06 52 E3 89 FD 80 3A 00 20 00   // n0.g.\.R....:. .<br>                                  31 00 2F 00 )                                     // 1./.<br>  IL_0082:  ldloc.2<br>  IL_0083:  box        [mscorlib]System.Int64<br>  IL_0088:  ldstr      bytearray (20 00 D2 79 02 30 )                               //  ..y.0<br>  IL_008d:  call       string [mscorlib]System.String::Concat(object,<br>                                                              object,<br>                                                              object)<br>  IL_0092:  call       void [mscorlib]System.Console::WriteLine(string)<br>  IL_0097:  nop<br>  IL_0098:  ldstr      bytearray (42 66 93 95 3A 00 20 00 )                         // Bf..:. .<br>  IL_009d:  ldloc.1<br>  IL_009e:  ldloc.0<br>  IL_009f:  sub<br>  IL_00a0:  conv.r8<br>  IL_00a1:  ldc.r8     1.<br>  IL_00aa:  mul<br>  IL_00ab:  ldloc.2<br>  IL_00ac:  conv.r8<br>  IL_00ad:  div<br>  IL_00ae:  box        [mscorlib]System.Double<br>  IL_00b3:  ldstr      bytearray (20 00 D2 79 02 30 )                               //  ..y.0<br>  IL_00b8:  call       string [mscorlib]System.String::Concat(object,<br>                                                              object,<br>                                                              object)<br>  IL_00bd:  call       void [mscorlib]System.Console::WriteLine(string)<br>  IL_00c2:  nop<br>  IL_00c3:  nop<br>  IL_00c4:  ldc.i4.0<br>  IL_00c5:  stloc.s    V_5<br>  IL_00c7:  br.s       IL_00c9<br>  IL_00c9:  ldloc.s    V_5<br>  IL_00cb:  ret<br>} // end of method sampleClass1::Main</p><br><p>これはsampleInt1.exeの結果です。</p><br><p>基本的にsampleInt2、sampleInt3、sampleInt4共にプログラムはほぼ同じなので</p><br><p>sampleInt2、3，4に関しては差分のみ記します。</p><br><p>※sampleInt2</p><br><p>  IL_0020:  stloc.3<br>  IL_0021:  br.s       IL_002d<br>  IL_0023:  nop<br>  IL_0024:  ldc.i4.0<br>  IL_0025:  stloc.s    V_4<br>  IL_0027:  nop</p><br><p>※sampleInt3</p><p> </p><p>  IL_0020:  stloc.3<br>  IL_0021:  br.s       IL_0032<br>  IL_0023:  nop<br>  IL_0024:  ldloca.s   V_4<br>  IL_0026:  initobj    valuetype [mscorlib]System.Nullable`1&lt;int32&gt;<br>  IL_002c:  nop<br></p><p> </p><p>※sampleInt4</p><p> </p><p>  IL_0020:  stloc.3<br>  IL_0021:  br.s       IL_0033<br>  IL_0023:  nop<br>  IL_0024:  ldloca.s   V_4<br>  IL_0026:  ldc.i4.0<br>  IL_0027:  call       instance void valuetype [mscorlib]System.Nullable`1&lt;int32&gt;::.ctor(!0)<br>  IL_002c:  nop</p><p> </p><p>これを見るとわかりますが、int?、Nullable&lt;int&gt;は普通のintではなく、System.Nullable</p><br><p>と言う型を使っている事がわかります。</p><br><p>この様な理由で単純にintに0を設定するよりnullableにnullを設定する方が時間がかかる</p><br><p>事になります。</p><br><p>あと一つ問題としてはnullableにはnullを設定するより0を設定する方が早いと言う結論ですが、</p><br><p>たぶんnullableが内部で持つ値は初期値が0の為、0で初期化する場合はインスタンスを生成</p><br><p>するだけでよく、nullで初期化する場合はインスタンス生成後にnullで初期化をしてあげる必要が</p><br><p>あるのでは無いかと思います。</p><br><p>そこで試しにnullableの初期化を0ではなく、2や100を設定してプログラムを実行したところ</p><br><p>d:\プログラム&gt;test<br>開始値: 11831667877930<br>終了値: 11832678501496<br>QueryPerformanceCounter の最小分解能: 1/1000290000 秒<br>時間: 1.01033057013466 秒。</p><br><p>この様な結果を得る事が出来ました。</p><br><p>つまり0以外はインスタンス生成後に初期化処理をする必要がある為、少し時間がかかる</p><br><p>ものと思われます。</p><br><p>この結果からnullableで初期化する場合は特別な理由が無い限り、0で初期化する事が</p><br><p>望ましいのでは無いかと言う結論になると思います。</p><br><br><p>と、まぁ今回はint型の速度比較のつもりがそもそも違う型を同じ型だと思って比較してしまった</p><br><p>時点でイタタタタ(x_x；)な感じがしました。</p><br><p>今回の様な事が無いように次回はString型で比較してみたいと思います。</p><br>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014226015.html</link>
<pubDate>Sat, 01 Jul 2006 23:15:28 +0900</pubDate>
</item>
<item>
<title>コンパイル色々</title>
<description>
<![CDATA[ <p>前回はコンパイラがどこにあるのかを説明しましたが</p><br><p>今回はそのコンパイラを使うにあたってやっておいた方が</p><br><p>良いと思える事について書きたいと思います。</p><br><br><p>前回csc.exeと言うコンパイラについて説明しました、</p><br><p>c:\winnt\microsoft.net\frameworkの中になるので</p><br><p>コマンドラインから実行する為にはそのディレクトリまで移動する</p><br><p>必要があります。</p><br><p>しかしわざわざそこまで移動するのもめんどくさいし、もしコンパイラが</p><br><p>ある場所にexeが作成されてしまったら大変です。</p><br><p>これを改善するためには環境変数を変更します。</p><br><p>(Windows2000環境でのお話です。)</p><br><p>マイコンピュータを右クリックしてプロパティを選択します。</p><br><p>(Windows2000ではシステムのプロパティと言う画面が開きます)</p><br><p>「詳細」タブを選択して「環境変数」ボタンをクリックします。</p><br><p>システムの環境変数と書かれた下にあるリストボックスに</p><br><p>変数　　　　　　　　　　　値</p><p>Path　　　　　　　　　　　ほにゃらら</p><br><p>と書かれていると思うのでそのPathの行をダブルクリックしてください。</p><br><p>たぶん編集画面が表示されるのでそこにcsc.exeのあるパスを追記してください。</p><br><p>(すでにパスが入っている場合はセミコロンで区切ってください）</p><br><p>追記したらOKボタンで閉じてください。</p><br><p>そしてコマンドプロンプトを開きcscを打ち込んでください。</p><br><p>カレントディレクトリがどこであってもC#コンパイラを実行できると思います。</p><br><p>また「csc ソースファイル名」と入力するとexeは現在いるディレクトリに作成されます。</p><br><p>まぁexeを作りたい場所でコンパイルすれば良い話ですが</p><br><p>ソースとexeのフォルダをわけたい事もあると思うのでそういう場合は</p><br><p>csc /out:出力パス ソースファイル名</p><br><p>と、する事でexeの出力場所を変える事が出来ます。(ついでにexe名も指定できるようになります）</p><br><p>コンパイラ実行時のパラメータは色々あるので試してみるのも面白いかもしれません。</p><br><br><br>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014201203.html</link>
<pubDate>Sat, 01 Jul 2006 07:29:27 +0900</pubDate>
</item>
<item>
<title>0から始めるC#</title>
<description>
<![CDATA[ <dl><dt></dt><dt></dt><dt>「C#　番外編」では本編の方で説明しきれない細かい内容等を </dt></dl><p>載せていきたいと思います。</p><br><p>まず一回目の今回はどうやったらC#を使えるの？から説明したいと思います。</p><br><p>私も先週からC#を勉強し始めた人なんですが、その前の週に</p><br><p>某(大きい)カメラ屋さんに行ってきました。</p><br><p>まぁC#やるならVisual Studio買わないといけないだろうなぁと思っていったわけですが。。。</p><br><p>そこで見た光景は</p><br><p>Visual Studio 2005</p><br><p>3万～30万　也　ヽ(`Д´)ノ(たけぇ～よ）</p><br><p>もちろん見るだけで帰りました。</p><br><br><p>次の週、同僚からコンパイラならただで配っているとの朗報を聞き、</p><br><p>さっそく調べてみることに。</p><br><p><font size="5">な～んと！(￣□￣;)!!</font></p><dl><dt></dt><dt>よくよく調べたら自分のPCに入ってるじゃないですか。 </dt></dl><p>OSのバージョンとWindows Updateをちゃんとやっているかどうかにも変わってきますが</p><br><p>c:\Winnt\Microsoft.net\framework\の下に</p><br><p>ｖ1.0.○○○</p><p>や</p><p>v1.1.○○○</p><p>や</p><p>v2.0.○○○</p><br><p>と言うフォルダがあればそれが.Netです。</p><br><p>各フォルダの中にはcsc.exeというものが含まれていますが、</p><br><p>これがC#のコンパイラになります。</p><br><p>試しに実行してみて下さい。</p><br><p></p><table width="100%" align="left" bgcolor="#000000"><tbody><tr><td><font color="#ffffff"><p>d:\プログラム&gt;csc<br>Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.42<br>for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727<br>Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.</p><p>fatal error CS2008: 入力が指定されていません。</p></font></td></tr></tbody></table><p></p><br><br><br><br><br><br><br><br><br><br><br><br><br><br><p>こんな感じに出るはずです、 Compiler version 8.00.50727.42となっていますが <br></p><p>自分の環境で見た限りだと バージョン８以降が巷で言われているC#2.0に相当する様です。</p><br><p>これさえあればただでC#使いたい放題です。</p><br><p>お試しでやってみたい方には最適な方法かもしれません。(Visuaｌ Studio高いしね）</p><br><br><br><br><br><dl><dt></dt><dt><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000062TE6/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank"><img height="150" src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fimages-jp.amazon.com%2Fimages%2FP%2FB000062TE6.09.MZZZZZZZ.jpg" width="121" border="0"></a> </dt><dt>マイクロソフト </dt><dt><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000062TE6/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank">Visual Studio .NET Enterprise Developer MSDN DX</a> </dt></dl>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014200961.html</link>
<pubDate>Sat, 01 Jul 2006 07:03:48 +0900</pubDate>
</item>
<item>
<title>簡単な速度比較1</title>
<description>
<![CDATA[ <p><a href="http://blog.ameba.jp/user_images/d9/e7/10007775800.png" target="_blank"></a>さっそく三日坊主になりそうな感じです。</p><br><p>前回予告した通り今回は簡単な速度比較をしてみたいと思います。</p><br><p>某掲示板で見かけた内容ですがとある方が</p><br><p>「インスタンスの生成時の初期化でnewをするなんてコストが高い事をするべきで</p><br><p>ない。初期化はnullでするべきだ」</p><br><p>と、語っていた方がいました。</p><br><p>C#ではどうなのか興味があったので試してみました。</p><br><p>※ソース</p><br><p><font size="1">using System.Runtime.InteropServices;</font></p><p><font size="1">// Nullableにnullで初期化<br>class sampleClass1{</font></p><p><font size="1"> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</font></p><p><font size="1"> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    Nullable&lt;int&gt; a = null;<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</font></p><p><font size="1">// intに0で初期化<br>class sampleClass2{</font></p><p><font size="1"> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</font></p><p><font size="1"> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    int a = 0;<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</font></p><p><font size="1">// int?にnullで初期化<br>class sampleClass3{</font></p><p><font size="1"> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</font></p><p><font size="1"> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    int? a = null;<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</font></p><p><font size="1">// int?に0で初期化<br>class sampleClass4{</font></p><p><font size="1"> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceCounter(ref long x);<br> [DllImport("kernel32.dll")]<br> extern static short QueryPerformanceFrequency(ref long x);</font></p><p><font size="1"> public static int Main(){<br>  <br>  long ctr1 = 0, ctr2 = 0, freq = 0;<br>  if (QueryPerformanceCounter(ref ctr1)!=0){<br>   for (long i=0; i&lt;100000000; i++){<br>    int? a = 0;<br>   }<br>   QueryPerformanceCounter(ref ctr2); // 時間の計測を終了します。<br>   Console.WriteLine("開始値: " + ctr1);<br>   Console.WriteLine("終了値: " + ctr2);<br>   QueryPerformanceFrequency(ref freq);<br>   Console.WriteLine("QueryPerformanceCounter の最小分解能: 1/" + freq + " 秒。");<br>   Console.WriteLine("時間: " + (ctr2 - ctr1) * 1.0 / freq + " 秒。");<br>  }<br>  return 0;<br> }<br>}</font></p><br><p>※結果</p><p>d:\プログラム&gt;sampleInt1<br>開始値: 2524982841724<br>終了値: 2525985623567<br>QueryPerformanceCounter の最小分解能: 1/1000310000 秒。<br>時間: 1.00247107696614 秒。</p><br><p>d:\プログラム&gt;sampleInt2<br>開始値: 2528005937504<br>終了値: 2528708171601<br>QueryPerformanceCounter の最小分解能: 1/1000310000 秒。<br>時間: 0.702016471893713 秒。</p><br><p>d:\プログラム&gt;sampleInt3<br>開始値: 2530182871156<br>終了値: 2531185940354<br>QueryPerformanceCounter の最小分解能: 1/1000310000 秒。<br>時間: 1.0027583429137 秒。</p><br><p>d:\プログラム&gt;sampleInt4<br>開始値: 2532427548899<br>終了値: 2533329863481<br>QueryPerformanceCounter の最小分解能: 1/1000310000 秒。<br>時間: 0.902034951165139 秒。</p><br><p>それぞれ</p><p>sampleClass1がsampleInt1.exe</p><p>sampleClass2がsampleInt2.exe</p><p>sampleClass3がsampleInt3.exe</p><p>sampleClass4がsampleInt4.exe</p><p>に対応しています。</p><br><p>この結果からC#ではnullで初期化する方が遅い事がわかります。(結論)</p><br><br><p>＼(*｀∧´)／んなわけあるはずが無く、これにはわけがあります。</p><br><p>まぁプリミティブにnullを設定している時点でC#を知らない人でも「おや？」と</p><br><p>思うはずです。</p><br><p>この様になってしまう理由については次回説明したいと思います。</p><p><br><br>※2006.7.1　修正</p><p>インスタンスの精製時　→　インスタンスの生成時</p>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014195090.html</link>
<pubDate>Sat, 01 Jul 2006 00:20:05 +0900</pubDate>
</item>
<item>
<title>C#でHello World</title>
<description>
<![CDATA[ <p>毎度お決まりのあれです。</p><br><p>プログラムの本を読んだ事がある人はまたあれかと思うその一文</p><br><p>「Hello World」</p><br><p>以下ソースコードです。</p><br><p>using System;</p><p>class sampleClass{</p><p> public static int Main(){<br>  Console.WriteLine("Hello World!");<br>  return 0;<br> }<br>}</p><p><br>まぁなんて言うかそのまんまですね。</p><br><p>結果はこんな感じです。</p><br><p>#コンパイル</p><table align="left" bgcolor="#000000"><tbody><tr><td><font color="#ffffff">d:\プログラム&gt;csc sample1.cs<br>Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.42<br>for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727<br>Copyright (C) Microsoft Corporation 2001-2005. All rights reserved</font> <br></td></tr></tbody></table><br><br><br><br><br><br><br><p>#実行</p><table align="left" bgcolor="#000000"><tbody><tr><td><font color="#ffffff">d:\プログラム&gt;sample1<br>Hello World! <br></font></td></tr></tbody></table><br><br><br><br><br><br><p>そして今気付きました！</p><br><p>プログラムは簡単だけどこのブログにそれっぽく載せるのは非常に大変！ヽ(`Д´)ノ</p><br><p>最悪画像で載せた方が楽かもしれないなぁ。</p><br><br><p>今日は時間が無いのでこのくらいで、</p><br><p>次回はちょっとしたスピード比較を考えています。</p><br><p>でわでわ。</p>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014124291.html</link>
<pubDate>Wed, 28 Jun 2006 23:01:01 +0900</pubDate>
</item>
<item>
<title>当面の予定</title>
<description>
<![CDATA[ <p>「プロフェッショナル　C#　上」<br></p><p>は3章まで読みました。</p><br><p>感想としてはC#はVC++を起点とし、使いやすさでJAVAに歩み寄り</p><br><p>危険なコードを隠すと言う行為でVBに歩み寄った言語な印象でした。</p><br><p>ただVBに近づいた分使いづらいくなった箇所を新しい機能で補完している</p><br><p>その為、switchステートメントやoutキーワード等にちょっと違和感を感じました。</p><br><p>あとJAVADOCのまねっこのようなXMLですが、これは前々から欲しいなと思って</p><br><p>いた機能なのでまねっこでも歓迎です。</p><br><p>ただXML形式だと閉じタグとか書くのがめんどくさいですね。</p><br><p>Visual Studioだとそこらへんを自動的に作ってくれるそうですが、メモ帳ベースな</p><br><p>私には辛い感じがしました。(マクロで対応するかな）</p><br><br><br><p>当面の予定ですが、どんなシステムでも必ず使う機能。</p><br><p>「ログ」</p><br><p>これから手をつけようと思います。</p><br><p>ただ、まだ勉強中の身なので作り始めるのはもうちょっと先になりそうです。</p><br><p>次回から今読んでいる</p><br><p>「プロフェッショナル　C#　上」<br></p><p>のコードを実際に試してみた結果等も少し載せてみようと思います。</p><br><p>でわでわ。(^-^)ノ~~</p><br><dl><dt><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844316222/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank"><img height="60" src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fimages-jp.amazon.com%2Fimages%2FP%2F4844316222.09.THUMBZZZ.jpg" width="47" border="0"></a></dt><dt>シモン ロビンソン, ジャイ グリン, クレイグ マックイーン, オリー コーン, バートン ハーヴェイ, Simon Robinson, Jay Glynn, Craig McQueen, Ollie Cornes, Burton Harvey</dt><dt><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844316222/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank">プロフェッショナルC#〈上〉基本編</a></dt></dl>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014088554.html</link>
<pubDate>Tue, 27 Jun 2006 23:03:23 +0900</pubDate>
</item>
<item>
<title>ブログ始めました。</title>
<description>
<![CDATA[ <p>今日からブログを始めます。(〃∇〃)</p><br><p>ブログと同時にC＃の勉強も始めました。</p><br><p>今参考にしている本は</p><br><p>「プロフェッショナル　C#　上」<br></p><p>と言う本です。</p><br><p>まだ読み初めで２章まで読んだけれど、C#と.Netがどれだけすごいかと言う事を</p><br><p>大雑把に説明しているけれども、Windows Meを賞賛している所を見るとあんまり</p><br><p>真に受けちゃいけないのかもしれないと思った。</p><br><p>しかしこの本をプログラムを始める初心者が読んだら.Netってすごいなぁとか</p><br><p>思っちゃうんだろうな。ヽ(ﾟ◇ﾟ )ﾉ</p><br><p>まぁ唯一心に残った事は.Netは実行時に実行する部分だけコンパイルされるって事と</p><br><p>DLLはアセンブリと呼ばれるものにパワーアップしたと言う事かな。</p><br><p>C#はソースコード自体まったく見た事無いし、本当に初めてだから今本を読んで</p><br><p>さらっと流している部分も実は重要だったりしちゃうかもしれないけど、それはその時</p><br><p>考えるとしよう。</p><br><p>一応次回は当面の予定について書こうと思う。</p><br><p>それじゃ、また明日～。</p><br><p>※不定期更新です。</p><br><p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844316222/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank"><img height="60" src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fimages-jp.amazon.com%2Fimages%2FP%2F4844316222.09.THUMBZZZ.jpg" width="47" border="0"></a> </p><dl><dt>シモン ロビンソン, ジャイ グリン, クレイグ マックイーン, オリー コーン, バートン ハーヴェイ, Simon Robinson, Jay Glynn, Craig McQueen, Ollie Cornes, Burton Harvey </dt><dt><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4844316222/amebablog-22?dev-t=D3A0EVSPCPV0FK%26camp=2025%26link_code=sp1" target="_blank">プロフェッショナルC#〈上〉基本編</a> </dt></dl>
]]>
</description>
<link>https://ameblo.jp/beginning-blogram/entry-10014053591.html</link>
<pubDate>Mon, 26 Jun 2006 22:44:42 +0900</pubDate>
</item>
</channel>
</rss>
