Btrieve Classes メニュー
ENGLISH

Btrieve Classes for .NET 開発者向け情報

パフォーマンスについて

読み込みスピードが数倍向上します!

Person テーブルのレコード数を 45,000 件に増やして、ID、First_Name と Last_Name カラムの値を全てグリッドに表示する C# アプリケーションを作成し、Actian Zen の ADO.NET を使用した場合と、Btrieve Classes for .NET を使用した場合で、パフォーマンスを比較しました。結果、Btrieve Classes for .NET を使用した場合のほうが、格段に読み込みスピードが速くなりました。

Access Method 1st 2nd コード
Actian Zen ADO.NET Data Provider 6.6s 360ms code1
Btrieve Classes Extended object 320ms 300ms code2

※ Btrieve Classes for .NET 9.0 を Actian Zen v15 上で実行しています。
※ 2nd のスピード測定結果はキャッシュ効果により差が縮まりました。

なぜパフォーマンスが良いのか?

Actian Zen ADO.NET データプロバイダーの場合、ソフトウェア層が厚い事がパフォーマンス的に不利な状況の原因と思われます。当製品のライブラリは、C++ アンマネージド・コードから直接 Btrieve API を呼び出す形式で、ソフトウェア レイヤーは非常に薄い構成です。マネージド・データへの変換は、データ転送量が少なくなるように最適化されたコードを採用しています。C++ で記述しているのは、C# 等のジェネリックなマーシャ リングよりも細かくマーシャリングを制御してパフォーマンスを確保することが出来るからです。

また、Actian Zen ADO.NET データ プロバイダーでは、コネクションプーリングや SQL ステートメントキャッシングなど、SQL クエリの大量非同期実行をサポートする機能が多数追加されていますが、当社のライブラリは Btrieve 専用なので、そうした SQL ベースの機能に関連する初期化や管理にかかるコード、メモリ割り当て、CPU の処理時間は一切ありません。当社のライブラリーが Btrieve に特化しているため、SQL 処理するためのオーバーヘッドがないことがこのパフォーマンスを生み出していると考えます。

今回 BTRVEX API を採用し、Extended クラスのパフォーマンスも向上しました。消費するメモリも ADO.NET に比べて半分程度なので、ウェブアプリケーションでの利用も優位性があります。

バージョン毎の機能について

Btrieve Class for .NET の主な機能をバージョン間で比較しています。
(〇:対応済み)

※ システム要件についてはこちらを参照ください。

※下にスクロールしてご覧ください。

比較表のダウンロードはこちら(PDF)

主な機能 v6 v7 v8 v9
ランタイムフリー

→ 実行モジュールを無償で配布可能
LINQ(統合言語クエリ)に対応

→ Btrieve のデータに対して LINQ クエリーの使用可能

サンプルコードはこちら
Unicode 形式の文字列データ型に対応

→ Actian Zen のデータ型 NCHAR と NVARCHAR をサポート
Metadata V2 データベースに対応

→ Actian Zen の最新メタデータバージョンをサポート
DDF クラスにて CLIENT ID に対応

→ 複数トランザクションの並列実行をサポート
.NET Core 3.1、.NET 5 ~ 8 に対応

→ Blazor を含む最新の .NET 環境での開発可能
Extended クラスの機能強化

→ AddFields メソッドと FillAll メソッドの追加によって、Extended オペレーションがより簡単に使用可能
BTRVEX API による Extended クラスのパフォーマンス向上

→ Btrieve オペレーションを使用したデータ処理で、より高いパフォーマンスを実現
Actian Zen の時系列データ型 AUTOTIMESTAMP と TIMESTAMP2 の対応

→ 時系列データへのアクセスが、より簡単に実行可能
ストラクチャービルダーの VSIX 対応と Entity class 生成機能の追加

→ Visual Studio 2022 との統合と Entity クラス生成をサポート

サンプルコード

  • Actian Zen ADO.NET Data Provider による
    パフォーマンステストコード

    string connStr = "Server DSN=Demodata";
    PsqlConnection conn = new PsqlConnection(connStr);
    try
    {   
    	conn.Open();
    	string sql = "select ID,First_Name,Last_Name from person order by id";
    	var cmd = new PsqlCommand(sql, conn);
    	var adapter = new PsqlDataAdapter(cmd);
    	var dt = new DataTable("Person");
    	adapter.Fill(dt);
    	conn.Close();
    	dgv.DataSource = dt;    // dgv = DataGridView
    }
    catch (PsqlException err)
    {
    	Console.WriteLine(err.ToString());
    }
    				
  • Btrieve Classes for .NET Extended Object による
    パフォーマンステストコード

    try
    {
    	var ddf = new BtLib.Ddf("btrv:///demodata");
    	var rec = ddf.GetRecord("Person");
    	rec.Open();
    	rec.Index = "ID";
    	short rc = rec.Read(BtLib.Operation.GetFirst);
    	var ex = rec.GetExtended(100,32767);
    	ex.AddFields(new string[] { "ID", "First_Name", "Last_Name" });
    	var ds = ex.GetDataSet();
    	rc = ex.FillAll(ds);
    	dgv.DataSource = ds.Tables[0];  // dgv = DataGridView
    	rec.Close();
    	ddf.LogOut();
    }
    catch (System.Exception err)
    {
    	Console.WriteLine(err.ToString());
    }
    				
  • LINQ サポートコードサンプル

    try
    {
    	BtLib.Ddf d = new BtLib.Ddf("btrv:///demodata");
    	BtLib.Record r = d.GetRecord("person");
    	r.Open();
    	var query = from p in r.Query<Person>(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();
    	d.LogOut();
    }
    catch (System.Exception er)
    {
    	System.Diagnostics.Debug.WriteLine(er.ToString());
    }
    
    public class Person
    {
    	private string _first_Name;
    	private string _last_Name;
    	private string _perm_Street;
    
    	public String First_Name
    	{
    		get { return _first_Name; }
    		set { _first_Name = value; }
    	}
    
    	public String Last_Name
    	{
    		get { return _last_Name; }
    		set { _last_Name = value; }
    	}
    
    	public string Perm_Street
    	{
    		get { return _perm_Street; }
    		set { _perm_Street = value; }
    	}
    }
    				
  • Btrieve Classes for .NET による
    グリッドデータ表示

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

Contactお問い合わせ

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

お問い合わせ

    必須会社名

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

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