ホーム > プログラミング > .NET Framework

.NET Frameworkのアーカイブ

GUI Toolkit

おはようじむし
最近linuxメインなので、GUI Toolkitに何使うか悩み中です。
C#使いなのでMonoから呼べるラッパーがあると嬉しくて、ライセンスの緩いのがいいんだけど、そうするとwxWidgetしかない。
でもドキュメント少ないし、とりあえずLGPLなGDI+使い中。
なんか良いのないかなー。。。

マルチプラットフォームで.NET

最近Monoをいじっています。
http://www.mono-project.com/Main_Page
Visual Studioは高いのでMonoDevelopを使って、なんとなく書けるようになってきました。
Gtk#のGUIがまだよくわからない状況。

画像処理関係の処理をOpenCVSharpから使ってみて遊んでました。
USBカメラからの取得とか顔認識とか、一通り遊んでみました。

.NETで画像を扱う時って、画像フォーマットに悩む。特に動画として扱うとき。
GDI+だとBitmapDataいちいち作るのめんどいし、リソース食う割に遅い気がする。
Cで直にポインタ使えば処理は速いけど、できればManaged使いたいし、ManagedとUnmanageとのやりとりがややこしいから嫌。
Managedな配列を使うと一番バランスいいかな。。
でもOpenCVとかはIplImage.ImageDataでポインタ返してくるから、いちいちMarshal.Copyしなきゃいけなくなっちゃう気がする。
WPFはGDI+より使いやすくて速いみたいだけど、勉強するのめんどくさい。
うーん

グラフ描画

学生時代は特に、.NET Framework上で作ってるソフトでちょっとしたグラフを表示したい事がたまにあった。Office Web Componentsとかを使ったり、他のグラフ描画ソフトやExcelで楽なようなCSVを吐いて誤魔化したりしていたけど、どうも巧い方法が無かった。
最近はもう自分である程度のものは作って持っとこうかと思い始めていたけど、久しぶりに調べてみると、なんかMicrosoftがコントロール作ってた!

チャート・コントロールを使うには? − @IT

まだドキュメント少ないけど、プロパティ名見ればいろいろわかるし、OWCでできていた事はたいていできそう。機能を端折って描画を速くした散布図(FastPoints)とかあるっぽい。

3軸の3D散布図とか、ベクトルが描けるといいんだけどなー。まだいじってないからわからん。
あとWPFで同じような機能欲しいな。。探せば有るかな。。なさそうだな。。
この辺必要な人種はMicrosoftのFrameworkなんか使わないんだろうね、きっと。

Stopwatchって普通ラップタイム計測できるよね

でも、.NET FrameworkのSystem.Diagnostics.Stopwatchはちょっと不便。

  • ラップタイムが計測できない。
  • ElapsedMillisecondsプロパティがlong型で、精度が悪い。
  • 精度よく計測するために毎回ElapsedTicksとStopwatch.Frequencyを使ってごにょごにょしないといけない。

というわけで、最初にNewしてStartして、プログラム上のいろんな位置でLapTimeを測って、後で全部をミリ秒単位のdouble配列で取り出すサンプル。
実行速度検証にどうぞ。

public class k2kLapStopwatch : Stopwatch
{
    private long[] LapTicks;
    private int LapCounter;
 
    public k2kLapStopwatch(int MaxLapCount)
    {
        LapTicks = new long[MaxLapCount];
        LapCounter = 0;
    }
 
    public void StoreLap()
    {
        LapTicks[LapCounter] = base.ElapsedTicks;
        LapCounter++;
    }
 
    public double[] GetLapElapsedMilliseconds()
    {
        int i;
        double[] ret = new double[LapCounter];
 
        ret[0] = TicksToMilliseconds(LapTicks[0]);
        for (i = 1; i < LapCounter; i++)
        {
            ret[i] = TicksToMilliseconds(LapTicks[i] - LapTicks[i - 1]);
        }
        return ret;
    }
    private double TicksToMilliseconds(long Ticks)
    {
        return (double)Ticks / Stopwatch.Frequency * 1000.0;
    }
}

目的上速さが重要なので、System.Collections.Generic.Listとかは使わないし、オーバーフローしても無視ってことで。
早速↑が正しいか検証するために、List、容量指定のList、ふつうの配列の速度測ってみると、やっぱり配列が容量未指定のListの2倍ぐらい速い。

細かいことだとLapTicksはpublicでもいいかも。あとStartNewをオーバーライドしたりして使おうかな。。

private void button1_Click(object sender, EventArgs e)
{
    const int n = 1000000;
    int i;
 
    k2kLapStopwatch sw = new k2kLapStopwatch(5);
 
    List<long> list1 = new List<long>();
    List<long> list2 = new List<long>(n);
    long[] array1 = new long[n];
 
    sw.Start();
    for (i = 0; i < n; i++) list1.Add(i);
    sw.StoreLap();
    for (i = 0; i < n; i++) list2.Add(i);
    sw.StoreLap();
    for (i = 0; i < n; i++) array1[i] = i;
    sw.StoreLap();
    for (i = 0; i < n; i++) ;
    sw.StoreLap();
 
    sw.Stop();
 
    double[] ret = sw.GetLapElapsedMilliseconds();
    Console.WriteLine(string.Join(",", Array.ConvertAll<double, string>(ret, d => d.ToString())));
}
1 2

ホーム > プログラミング > .NET Framework

カレンダー
« 2018 年 4月 »
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
最近の反応
メタ情報

ページの上部に戻る