ラベル VisualStudio の投稿を表示しています。 すべての投稿を表示
ラベル VisualStudio の投稿を表示しています。 すべての投稿を表示

2017年11月19日日曜日

C#でStringBuilderと+= 演算子の速度比較をしてみた


概要

StringBuilderと+= 演算子の速度差が気になったので、実験してみました。
方法としては、以下のテストコードを5回繰り返し、結果を確認しています。

テストコード

static void TestAppendText()
{
    var count = 100000;
    Console.WriteLine("---------------------------------");
    Console.WriteLine($"ループ回数:{count:d}");
    var time = Stopwatch.StartNew();
    var message = string.Empty;
    var append = @"append";
    for (var i = 0; i < count; i++)
    {
        message += append;
    }
    time.Stop();
    Console.WriteLine($"String += : {time.ElapsedMilliseconds}ms");
    time.Restart();
    var builderMessage = new StringBuilder();
    for (int i = 0; i < count; i++)
    {
        builderMessage.Append(append);
    }
    time.Stop();
    Console.WriteLine($"StringBuilder: {time.ElapsedMilliseconds}ms");
}

結果

---------------------------------
ループ回数:100000
String += : 23382ms
StringBuilder: 1ms
---------------------------------
ループ回数:100000
String += : 22175ms
StringBuilder: 1ms
---------------------------------
ループ回数:100000
String += : 23060ms
StringBuilder: 1ms
---------------------------------
ループ回数:100000
String += : 23978ms
StringBuilder: 1ms
---------------------------------
ループ回数:100000
String += : 22435ms
StringBuilder: 2ms

結論

明らかに、StringBuilderを使用したほうが早いという結果になりました。
やっぱり、StringBuilderのほうが早くていいよね。+=はだめだね。っていう結論にしてもいいのですが、
試しにループ回数を100回にした場合には、以下の結果になっています。

---------------------------------
ループ回数:100
String += : 0ms
StringBuilder: 0ms

ms単位での差が分かりません。
なので100回程度の文字列の連結であれば、どちらも気にならないと思います。
そもそも、文字列を10万回も結合しなければいけないコードを書く人が悪いと思います。

結論としては、StringBuilderをお勧めはするけど、強要はしないって感じでしょうかねぇ。

2017年11月15日水曜日

VisualStudioのプロジェクトウィザードでgoogleが見れる




最近、VisualStudioのプロジェクトウィザードを実装していて、大発見。

VisualStudioのプロジェクトウィザードってhtmlで記載しているんですが、
標準のショートカットが使えてしまうらしい。。。

なので、上のキャプチャーんみたいに、ファイルも開く(Ctrl+O)ことができてしまうんです。
ってことは、、、、



なぜか、プロジェクト作成中に、googleが開けてしまうという結果に。。。
ちなみに、ウィザードには戻せません。
ついでに、Ctrl+マウスホイールのスクロールで拡縮も!!(老眼には、優しい仕様です。)



どうしたら、標準のショートカットを抑制できるのか、調べてみたけど、
これに関しての記事が見つからない。。。

そもそも、これが仕様なのか、バグなのか。。。
どう対処したらいいのか。。。
だれか、助けてくれ。。。



2017年11月8日水曜日

ビルドイベントでの複数コマンドの実行



VisualStudioのビルドイベントで、ビルド前や、ビルド後にコマンドを実行することができます。
その際に、複数のツールを実行したい場合には、ツールの戻り値を見たいケースが出てきます。
単純に
consoleApp.exe
consoleApp2.exe
と記載すると、1つ目が失敗しても、2つ目のアプリで正常な戻り値が返ってしまうと、ビルドが継続してしまいます。
errorlevelの変数を記載することで、1つ目が失敗した場合にビルドエラーにすることができます。


consoleApp.exe
if %errorlevel% == 0 consoleApp2.exe

2017年7月4日火曜日

C#でのBitmapクラスへのデータの設定方法

Bitmapクラスへのデータの設定方法

入力データが、TopDownでもBottomUpでも、変換可能な関数を作成したので、メモ。

void CopyBitmapData( Byte[] pixelData, Boolean isTopDown,Int32 bitCount, Bitmap bmp )
{
    BitmapData bmpData = bmp.LockBits(
                new Rectangle(0, 0, bmp.Width, bmp.Height),
                ImageLockMode.ReadWrite,
                bmp.PixelFormat);

    var stride = (bmp.Width * bitCount + 31) / 32*4;

    int pos = bmpData.Scan0.ToInt32();
    Parallel.For( 0, bmp.Height, ( hpos ) =>
    {
        var destPtr = IntPtr.Zero;
        if( isTopDown )
        {
            destPtr = new IntPtr( pos + hpos * stride );
        }
        else
        {
            destPtr = new IntPtr( pos + ( bmp.Height - hpos - 1 ) * stride );
        }
        Marshal.Copy( pixelData, hpos * stride, destPtr, stride );
    } );
    bmp.UnlockBits( bmpData );
}

2016年9月22日木曜日

タブ VS 半角スペース(インデント対決)

皆さんは、プログラムを書くときのインデントは、タブでしょうか。それともインデント?
基本的には、プロジェクト内で統一されていれば、どちらでもよいと思うのですが、、、

私は、もちろん タブ派です。

と言いつつ、今までのサンプルは、半角スペースですが、、、
(仕事では、タブが好きです。)


やっぱり、行の位置を揃えるなら、タブのほうが便利な気がするんです。

まぁ、どちらが良いと言い合って、結論が出るものでもないですが、
GitHubのコードで、割合の表示が出ていました。



http://sideeffect.kr/popularconvention/#c#

はい、わたくしマイノリティです。性格通り、人と違うことに喜びを感じるMです。
(ストレス時は、バリバリのSですが、、、)

タブVSスペースは、スペースの勝利のようです。

でもね、よくよく見ていると、
インデントだったり、if文の半角スペースだったり、みんな、VisualStudioのデフォルトでやってるだけな気がしません。

誰か、タブVSスペースのほんとの勝者を教えておくれ。


ということで、タブ派の方のために、インデントの変更方法です。

[ツール]-[オプション]で、[テキストエディター]-[C#]-[タブ]のページで、「空白の保持」に変更すれば、Tabがタブになります。


2016年9月6日火曜日

C#7.0の新機能:桁区切り記号(数字セパレータ)


VisualStudio15で追加される予定のC#7.0 をVisualStudio15 Preview4で確認してみました。

C#7.0 では、数値に桁区切り記号を追加して、記載できるようになるみたいです。


Int32 val1 = 1_010_010;
Console.WriteLine($"{val1}");


では、どこまで対応しているか、試してみたいと思います。

ノーマル

Int32 val1 = 10_101_010;
Console.WriteLine($"{val1}");

3桁以外の区切り位置

Int32 val2 = 10_1010_10;
Console.WriteLine($"{val2}");

区切り文字いっぱい

Int32 val3 = 10_101___010;
Console.WriteLine($"{val3}");

16進数で区切り文字

Int32 val4 = 0x9a21_12;
Console.WriteLine($"{val4}");

2進数で区切り文字

Int32 val5 = 0b100_110_100_010_000_100_010_010;
Console.WriteLine($"{val5}");


小数点で区切り文字

double val6 = 0.12_34;
Console.WriteLine($"{val6}");

ここまでは大丈夫でした。
10101010
10101010
10101010
10101010
10101010
0.1234


ここからは、コンパイラで怒られてしまった例:

バイナリリテラルのbの直後

Int32 val7 = 0b_100_110_100_010_000_100_010_010;
Console.WriteLine($"{val7}");

数値の最初または最後

Int32 val8 = 123_;
Int32 val9 = _123;
Console.WriteLine($"{val8}");
Console.WriteLine($"{val9}");

考察

とりあえず、すぐに思いつく限りはやってみました。
基本的な箇所には、使えるようです。(当たり前ですが・・・)

これで、桁数が大きい場合のコードミスが減りそうですね。
(でも、コードミスするような人は、使ってくれないんですよね(T_T))


2016年9月4日日曜日

C#7.0の新機能:文字列の書式(String.Format)


文字列の書式(String.Format)に変数を直接記入


VisualStudio15で追加される予定のC#7.0 をVisualStudio15 Preview4で確認してみました。

C#7.0 では、文字列の書式(String.Format)に変数を直接記入できるようになるようです。
今までは、{0},{1},{2}のようにして記載していましたが、その部分に直接変数名が入れられます。
記載するには、$マークが必須です。

var val1 = 1;
var val2 = 0x02;
var val3 = 0b011;
Console.WriteLine("{0},{1},{2}",val1,val2,val3);
Console.WriteLine($"{val1},{val2},{val3}");

結果
1,2,3
1,2,3