製作・改造なんでもやっちゃう広くて浅い活動日誌

2017/051234567891011121314151617181920212223242526272829302017/07

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
C#でプログラムを書いていたのですが、配列の範囲外をアクセスしないように条件付けするのが面倒だったので、覚えたての例外処理でまとめて済ませてしまいました。

しかし、いざ実行と思ってみると速度がかな~り遅くなってしまったので、例外処理そのものがどれくらい遅いのかを実験してみました。

コードはこんなのです。
using System;
namespace Exception_Test
{
class Program
{
static void Main(string[] args)
{
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int a;
DateTime dt;
System.Threading.Thread.Sleep(1000);

//if-else文で条件付け
dt = DateTime.Now;
for (int i=0; i<1000; i++)
{
if (i < array.Length) { a = array[i]; }
else { a = 0; }
}
Console.WriteLine("if-else: " +
(DateTime.Now - dt).Milliseconds.ToString() + "ms");

System.Threading.Thread.Sleep(1000);

//try-catch文で例外処理
dt = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
try { a = array[i]; }
catch { a = 0; }
}
Console.WriteLine("try-catch: " +
(DateTime.Now - dt).Milliseconds.ToString() + "ms");
}
}
}


要素が10個しかない配列に対して、for文を使って0~1000までの値でアクセスしようとします。
if-else文では配列の長さと比較してから処理、try-catch文ではまずは配列にアクセスしてみるという形になりますが、後は同じような処理をしているはずです。
最終的には、それぞれの処理にかかった時間をミリ秒で出力します。
結果はこんな感じでした。

if-else: 1ms
try-catch: 155ms

PCのスペックや諸々の状況によって変わるんでしょうが、例外処理の方が100倍以上遅いんですね。
便利ですが、状況に応じて使い方を気をつけなければいけないようです。


[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング
[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング川俣 晶

Amazonで詳しく見る
スポンサーサイト
C#でOpenCVを扱えるようにするためのラッパーライブラリであるEmguCVについて
なんとなく動けばいいやという感じの使い方。

EmguCVの公式のwikiはこちらです。
http://www.emgu.com/wiki/index.php/Main_Page
wikiを見る限り、他のラッパーよりも使える機能が多そうですね。

ダウンロードはこちら辺りから、新しそうなものを落としましょう。
http://sourceforge.net/projects/emgucv/files/emgucv/
インストールもしくは解凍すると、最新のOpenCVのdll等も入っているので、
本家のOpenCVはインストールしなくてもいいと思います。


私の場合、開発環境としてVS2010を使っていますので、
以下はその使い方に沿って説明します。
必要なのは、EmguCVのインストール先、
もしくは解凍したフォルダにあるbinというフォルダの中身です。

1. ひとまず、Emguではじまるdllファイルを全部、プロジェクトの中に入れてしまいます。
(全部必要という訳ではないですが、どのdllがどの機能かよくわからないので……)
Emgu.*.dllをプロジェクトに追加


2. プロジェクトの参照設定で、今入れたdllファイルを指定します。
(Emgu.Cv.dll、 Emgu.Util.dllだけでもプログラムによっては動きます。必要に応じて指定して下さい)
Emgu.*.dllを参照設定


3. ソースコードに、
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
等を追加します。
(公式wikiのチュートリアル等を参考にして、使う機能に応じて必要なものを記入して下さい)

4. コンパイル後、実行ファイルにEmugのbinフォルダにあったopencvで始まるdllファイルやcvextern.dll等を入れます。
(これも全部必要という訳ではないです。わかる人は必要なものだけ入れて下さい)


説明が足りてない部分が多々ありますが、これでひとまず公式wikiのチュートリアルのコピペでプログラムが「なんとなく」動くようになると思います。


OpenCV プログラミングブック
OpenCV プログラミングブック奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム

Amazonで詳しく見る
昨日の続きで、C#のシリアル通信の送信時の
改行コードを変えたいって話です。

そもそも、C#は簡単にフォームアプリが作れて、
シリアル通信とかも簡単だとは思うんですが、
送信関数の
public void WriteLine(String text);

で送られる改行コードがCR+LFに固定されていることが厄介だったりします。
それを指定し直す方法があるのか知りませんが、
ひとまず関数を作ってみましました。

ちなみに、用意したシリアルポートの名前をserialPort1としています。

public void WriteLineCR(String text)
{
    int count = Encoding.ASCII.GetByteCount(text);
    byte[] asciiarray = Encoding.ASCII.GetBytes(text);
    byte[] textarray = new byte[count + 1];
    Array.Copy(asciiarray, textarray, count);
    textarray[count] = 13;
    serialPort1.Write(textarray, 0, count+1);
}


まあ、StringをASCIIに変えてCR(0x0d = 13)を加えて送信してるだけです。
ちょっと変えればLFだけとかもすぐです。
ひとまず不具合なく動いてるんで満足。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。