Btrieve Classes メニュー

AG-TECH CORPAG-TECH CORP

ENGLISH

パフォーマンス / バージョン毎の機能について

パフォーマンス比較表

Pervasive.SQL V8.6 の person 表の First_Name カラムの値を全てリスト・ボックスに表示するC# アプリケーションを作成し、 パフォーマンスの比較をしました。当製品のパフォーマンスが約3~20倍と圧倒的です!

Access Method 1st 2nd コード
ADO.NET + PSQL OLE DB provider 12s 10s code1
Btrieve classes record object 4s 2s code2
Btrieve classes extended object 4s 380ms code3

(注) 2nd の値はキャッシュ効果で短縮されています。

なぜパフォーマンスが良いのか?
ADO.NET + OLE DB provider の場合ソフトウェア層が厚い事がパフォーマンス的に不利な状況の原因と思われます。 COM を使ったモジュールがソフトウェア層に入る場合 RPC ベースのマーシャリングのオーバーヘッドは大きいと推測します。
当製品のライブラリは C++ アンマネージド・コードから直接 Btrieve API を呼び出す形式でソフトウェア レイヤーは非常に薄い構成です。マネージド・データへの変換はデータ転送量が少なくなるように最適化されたコードを採用しています。 C++ で記述しているのは C# 等のジェネリックなマーシャリングよりも細かくマーシャリングを制御してパフォーマンスを確保することが出来るからです。
また、ADO.NET や OLE DB provider は複数種類のデータベースに対応するために多くの機能や仕様が追加されているのですが弊社ライブラリは PSQL / Btrieve に特化しているためそのような一般化のためのコードが無いことがこのパフ ォーマンスを生み出していると考えます。

各バージョンで強化された機能について

  • Btrieve Classes for .NET 8.0.0では以下の機能を追加しました。

  • Actian ZEN (PSQL v13) サポート
  • Visual Studio 2017 サポート
  • Windows 10 / Windows Server 2016 サポート
  • Metadata V2 サポート
  • DDFクラスにて CLIENT ID サポート
  • Extended クラスにてマルチスレッド対応
  • Btrieve Classes for .NET 7.0.0では以下の機能を追加しました。

  • PSQL v12 サポート
  • PSQL v12 以降の Unicode 文字列データ型をサポート
  • Visual Studio 2015 サポート
  • Btrieve Classes for .NET 6.0.0では以下の機能を追加しました。

  • .NET Framework 4.0 ベースに変更
  • Btrieve Classes for .NET 5.0.1では以下の機能を追加しました。

  • Visual Studio 2013 サポート
  • Windows 8.1 / Server 2012 R2 に対応
  • .NET Framework 4.5.1 に対応
  • Btrieve Classes for .NET 5.0では以下の機能を追加しました。

  • Visual Studio 2012 サポート
  • Windows 8 / Server 2012 に対応
  • .NET Framework 4.5 に対応

Btrieve Classes for .NET 4.0では以下の機能を追加しました。

  • PSQL v11 サポート
  • Visual Studio 2010 サポート
  • Btrieve Classes for .NET 3.0では以下の機能を追加しました。

  • LINQ サポート
    .NET Framework 3.5 の LINQ で PSQL データを参照するメソッドが追加されました。
    こちらがサンプルコードです。
  • PSQL v10 サポート
  • Visual Studio 2008 サポート
  • 64-bit アプリケーションサポート

サンプルコード

  • ADO.NET + Pervasive OLE DB Providerによる
    パフォーマンステストコード

    string connStr;
     connStr = "Provider=PervasiveOLEDB.7.90;Data Source=Demodata;
    			   Location=Demodata;Cache Authentication=False;" +
    		   "Encrypt Password=False;Mask Password=False;
    			   Persist Encrypted=False;Persist Security Info=False;" +
    		   "Impersonation Level=Anonymous;Mode=ReadWrite;
    			   Protection Level=None";
     OleDbConnection conn = new OleDbConnection(connStr);
     try
     {
    	conn.Open();
    	string sql = "select First_Name from person";
    	OleDbCommand cmd = new OleDbCommand(sql, conn);
    	OleDbDataReader reader = cmd.ExecuteReader();
    	while(reader.Read())
    	{
    	   listBox1.Items.Add(reader["First_Name"]);
    	}
    	conn.Close();
     }
     catch( OleDbException e)
     {
     Console.WriteLine(e.ToString());
     }
  • Btrieve Classes for .NETによる
    パフォーマンステストコード

    try
     {
    	BtUtils.Ddf d = new BtUtils.Ddf("c:\\pvsw\\demodata");
    	BtUtils.Record r = d.GetRecord("person");
    	r.Open();
    	short rc = r.Read(Operation.GetFirst);
    	listBox1.Items.Clear();
    	while(rc==0)
    	{
    	   listBox1.Items.Add(r["First_Name"].ToString());
    	   rc = r.Read(Operation.GetNext);
    	}
    	r.Close();
     }
     catch( System.Exception er)
     {
    	System.Diagnostics.Debug.WriteLine(er.ToString());
    	System.Diagnostics.Debug.WriteLine("error");
     }
  • Btrieve Classes for .NETによる
    パフォーマンステストコード

    try
     {
    	short rc;
    	int i;
    	listBox1.Items.Clear();
    	BtLib.Ddf ddf = new BtLib.Ddf("c:\\pvsw\\demodata");
    	BtLib.Record r = ddf.GetRecord("Person");
    	r.Open();
    	r.Index = "ID";
    	BtLib.Extended ex = r.GetExtended();
    	ex.SearchCond = "@First_Name > A";
    	ex.MaxRecords = 100;
    	ex.SkipRecords = 100;
    	ex.AddField("First_Name");
    	rc = r.Read(BtLib.Operation.GetFirst);
    	while(rc != 9)
    	{
    	   rc = ex.Read(BtLib.Operation.GetNextExtended);
    	   if( ex.ResultCount == 0)
    		  break;
    	   for(i=0; i < ex.ResultCount; i++)
    	   {
    		  listBox1.Items.Add(ex["First_Name"].ToString());
    		  ex.MoveNext();
    	   }
    	}
    	r.Close();
     }
     catch( System.Exception er)
     {
    	System.Diagnostics.Debug.WriteLine(er.ToString());
     }
  • LINQ サポートコードサンプル

    //
     // Person Accessor クラスを別途定義済みとしたサンプルコードです。
     //
     try
     {
      BtLib.Ddf d = new BtLib.Ddf("c:\\pvsw\\demodata");
      BtLib.Record r = d.GetRecord("person");
      r.Open();
      var query = from p in r.Query(0)
    	where p.First_Name == "William"
    	select p;
    
     foreach (var person in query)
      {
    	listBox1.Items.Add(person.
     First_Name + " " + person.Last_Name + " " + person.Perm_Street);
      }
      r.Close();
     }
     catch (System.Exception er)
     {
      System.Diagnostics.Debug.WriteLine(er.ToString());
     }
  • Btrieve Classes for .NETによる
    グリッドデータ表示

    try
     {
    	BtLib.Ddf ddf = new BtLib.Ddf("c:\\pvsw\\demodata");
    	BtLib.Record r = ddf.GetRecord("Person");
    	r.Open();
    	DataSet ds = r.GetDataSet();             // わずか1行でDataSet生成
    	r.Close();
    	dataGrid1.SetDataBinding(ds,"Person");   // グリッドにバインドします。
     }
     catch( System.Exception er)
     {
    	System.Diagnostics.Debug.WriteLine(er.ToString());
     }

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ

    必須会社名

    個人のお客様は「個人」と入力してください。

    必須お名前
    必須メールアドレス
    必須メールアドレス(確認)
    必須ライセンス ありなし
    ダウンロード目的