2010年10月26日火曜日

[Android]ちょっとホサレタ感じかも

えー、持ち前のガッツを変われて、短納期のキツイ系プロジェクト配置転換されました。
そのプロジェクトは今、ちょっと話題のAndroid系スマートフォン携帯コンテンツの開発です。
窓際でおとなしくしていたつもりなんですが、Javaなら昔とったキネズカ的なことをえらい人から言われた感がありました。なんとなくですが、断ったらアレ(黒)かなって感じがしました。

というわけで、当座、MS系技術からJava系の技術に変わります。ということでAndroid系の話題も少々織り交ぜていきます。
で、配属から1週間くらいたちましたが、やってみると結構面白い。なんと言えばいいか、懐かしさと新しさをかねそろえたような感じです。んーいってみればJava AppletとXML系技術の融合といいますか。。。

で早速基本ですが、Activityというクラスがあります。このクラスはJApplet相当のクラスで、画面の制御など一式を操作するプログラムのエントリーポイントです。
ViewがXMLで定義できるところとイベントの分離ぷりが、すっきりしたデザインになっている感じですね。

2010年10月1日金曜日

[.NET]いまさら?Parallel.Forを使ってみた(その2)

先日実験していました、マルチスレッドの件で、いかにして高速化するかを検討してみたんですが、同期化するオブジェクトを分けるというアイデアを思いつきついたので、実行してみました。
で実験の結果、5回計測で14.420秒となり、約13%の性能向上しました。しかしメモリは画像サイズ分増加します(がいまどきのH/Wであれば知れていますね)。

プログラム言語であるC#にも簡単にマルチスレッドを扱うような機構が用意されており、便利になった反面、マルチスレッドに関する知識もある程度必要と実感しました。
これからのCPUはMoreからManyになる。そういわれています。もっと勉強していかないとね。

で、コードはこんな感じ。

private void btnGlay2_Click(object sender, EventArgs e)
{
    textBox1.Text = "グレースケール化(2)";

    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();

    Bitmap bmp = new Bitmap(ctlPicture.Image);
    int h = bmp.Height;
    int w = bmp.Width;
    Parallel.For(0, w, delegate(int i)
    {
        for (int j = 0; j < h; j++)
        {
            Color color;
            lock (bmp)
            {
                color = bmp.GetPixel(i, j);
                // 計算式にて、値を算出してセットする
                //int col = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
                //int col = (int)((color.R + color.G + color.B) / 3);
                int col = (int)Math.Round((color.R + color.G + color.B) / 3.0d);
                Color pix = Color.FromArgb(col, col, col);
                bmp.SetPixel(i, j, pix);
            }
        }
    });
    ctlPicture.Image = bmp;

    sw.Stop();
    textBox1.Text = String.Format(textBox1.Text + " 完了{0:#,##0}ms", sw.ElapsedMilliseconds);
}