Contactお問い合わせ
お気軽にお問い合わせください。
読み込みスピードが数倍向上します!
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 の主な機能をバージョン間で比較しています。
(〇:対応済み)
※ システム要件についてはこちらを参照ください。
※下にスクロールしてご覧ください。
主な機能 | 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 クラス生成をサポート |
〇 |
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()); }
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()); }
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; } } }
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()); }