2014年05月23日

データを圧縮する時にはまること

何度もはまっていて自分の記憶力に絶望しているのでブログに残しておくことにしました。

やりたいこと
データ(DATA)をシリアライズして適当に圧縮したbyte[]がほしい
シリアライザーは今回はProtoBuf-net使ってます。

ダメな例



なんとなくデータが出来上がるんですが、デシリアライズで失敗します。
調べてみるとDeflateStreamを閉じないとちゃんとしたデータが取れないみたいです。

ということで


{}(ブレース?)を省略したいがためにはまる悲劇でした。


posted by ぷにお at 16:44 | Comment(0) | C# | このブログの読者になる | 更新情報をチェックする

2014年04月25日

ループ処理の速度を測ってみた

R#をtrialで使って遊んでいるんですが、R#先生はループ処理をLINQに変えたがるんですね。

リスト(List)のループ処理はfor文が速い(配列のforeachのがさらに速い)ってどこかのサイトで見た気がするので、要素数が多いループはfor文を使いまくっていたりするので、R#先生に指摘されまくりです。


ということでループ処理の速度を測ってみました。

測定方法は
・Windows 8.1 Update、Core i7-3770K、メモリ32GBな環境(処理時間を書くので一応)
・コンソールアプリ
・同期
・intをメンバに持つクラスを1,000,000個用意(値はランダム)
・上記データをList<>に突っ込んでToArray()で配列にもしておく
・ループの処理は偶数を加算して最後に出力
・Listと配列に対してforeach、for、LINQで測定
・100回測定して平均処理時間を出力



結果(速い順)
1.配列のfor 平均:11.01秒
2.配列のforeach 平均:12.06秒
3.Listのfor 平均:15.49秒
4.Listのforeach 平均:16.77秒
5.配列のLINQ 平均:19.21秒
6.ListのLINQ 平均:24.35秒


こんな結果になりました。
配列でいいじゃん、ってところは配列で持っておくのが正解ですかね。


最後にテストで作ったソース貼っておきます。
問題点あったら指摘していただけると嬉しいです。


posted by ぷにお at 16:50 | Comment(0) | C# | このブログの読者になる | 更新情報をチェックする

2014年01月10日

今更だけどGDI+で描画

本当に今更ですみません。
今回はGDI+(Graphicsクラス)で長方形を回転させて描画する、というお話。
普段XAMLにまかせっきりなのでたまにGDI+で描こうとするといつもはまってしまう、自分向けのメモです。

使うのは[Graphics.TranslateTransform]と[Graphics.RotateTransform]です。[Graphics.MultiplyTransform]は私が行列苦手なので使いません。キリッ

今回のサンプルソースはこちら。
GDI10.jpg
画像ですみません。ソースコードをうまく載せる方法が思いつかなかったので。
サムネイルをクリックすると別ウィンドウが開くので、ソースを見ながら以下を見ることができますよ。
ちなみにA〜C部分は独立していると思ってください。

まず@の部分だけでどうなるか、というと
GDI1.jpgこうなります。

やりたいのは
GDI2.jpgこんなこと。

そこでRotateTransformを呼びます。(A部分)
GDI3.jpgデスヨネー。

RotateTransformは(0,0)を中心に回転するからですね。
GDI4.jpg

ということでTranslateTransformで回転中心を(0,0)に移動して回転して移動した分を元に戻す、って処理が必要です。
GDI5.jpg

そんな処理を書いてみたのがBです。
結果はこちら
GDI6.jpgデスヨネー。

どうなっているかというと、
GDI11.jpgこうなってます。

ここにいつも引っかかるんですよ。(涙

Bを逆に書けばいけると思いますが、そうするとソースとやっている(つもりな)ことが逆になって気持ち悪い、っていうか後で見て絶対私は混乱する!!

ということでCです。
結果はこちら
GDI7.jpg


TranslateTransformとRotateTransformの引数にMatrixOrder.Appendを追加しています。
MSDNみると
Append 新しい操作が、古い操作の後に適用されます。
Prepend 新しい操作が、古い操作の前に適用されます。
と書いてあります。

デフォルトだとPrependってことなんですね、そんな記述みつかりませんが・・・。
posted by ぷにお at 11:43 | Comment(0) | C# | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。