1

Digital Persona SDK の検証用に C# コードを改善する方法について、アドバイスをお願いしたいと思います。データベース内の BLOB のレコードが 3000 に達し、それらすべてを DPFP.Template[] テンプレート配列にまとめたときに気付きました。動作が非常に遅いだけです。

これを行うより良い方法はありますか?

これが私のコードです:

        foreach (DPFP.Template template in templateArr)
        {
            count--;
            String my_id = empids[count].ToString();
            // Get template from storage.

            // Compare feature set with particular template.
            ver.Verify(features, template, ref res); // This code loops for all 3000 records and causes the verification to slow down.

            if (res.Verified)
            {
                SetPrompt("You Have ");
                MakeReport("LOGGED IN!");
                getEmployeeData(my_id);
                getStatus(my_id);
                break; // success
            }
        }

        if (!res.Verified)
        {
            SetPrompt("Please ");
            MakeReport("TRY AGAIN!");
        }

データベースから保存されたすべてのブロブテンプレートをキャプチャして配置するコードは次のとおりです。 public DPFP.Template[] templateArray() {

        //String strSQL = "SELECT emp_id, fpt_template FROM tbl_employees WHERE fpt_template != ''";
        String strSQL = "SELECT emp_id, finger_template FROM tbl_fingers WHERE finger_template != ''";
        DataTable dt;
        DPFP.Template myTemplate;
        dt = this.QueryDataTable(strSQL);
        object objByte;
        byte[] bytData;

        //*** Bind Rows ***//
        if (dt.Rows.Count > 0)
        {

            DPFP.Template[] arrTemplate = new DPFP.Template[dt.Rows.Count];
            Int32 counter = dt.Rows.Count;
            foreach (DataRow dr in dt.Rows) 
            {
                //Object fpt_template = dr["fpt_template"];
                Object fpt_template = dr["finger_template"];
                objByte = (byte[])(fpt_template);
                bytData = (byte[])objByte;

                // Convert Blob data to object and then byte
                System.IO.MemoryStream ms = new System.IO.MemoryStream(bytData);
                myTemplate = new DPFP.Template(ms);
                arrTemplate[counter - 1] = myTemplate;
                counter--;
            }

            return arrTemplate;
        }

        this.Close();
        return null;
    }

ちなみに私はMySQLでC#を使っています よろしくお願いします!

4

1 に答える 1

2

まあ、それが古い質問であることは知っていますが、それでも. Stopwatch検証にかかる時間を計測するために使用できるとよいでしょう。とにかく、あなたが取ることができるいくつかの最適化:

  • forの代わりに使用しforeachます。

  • ループ内で毎回変数を宣言するのではなく、外側で行い、ループ内で再利用します。

  • 保存したすべてのテンプレート データをDPFP.Template配列に配置しないでください。
    保存された各テンプレートをDPFP.Templateループ内のオブジェクトに配置します。

  • StringBuilder文字列操作に使用

現在、サンプルの品質にもよりますが、私のプログラムは 150 個の指紋テンプレートをループするのに約 2 ~ 4 秒かかりました。このシナリオでパフォーマンスを向上できる検索アルゴリズムがあると確信しています。

于 2013-12-03T10:27:17.363 に答える