2

SubSonic 2 を約 5 年間使用しており、気に入っています。ただし、過去 6 か月間、SubSonic 3 または同様の ORM ツールに移行することを考えていました。私の会社では Telerik のツールをたくさん使っているので、OpenAccess を試してみようと思いました。設定が完了したら、Users テーブル (最大 30 レコード) からの情報を RadGrid にロードするという非常に基本的なタスクを試してみることにしました。

したがって、グリッドの OnNeedDataSource イベント内には、次のものがあります。

var start = System.Environment.TickCount;
context = new EntitiesModel();
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

それを構築してページを実行した後、1607 ミリ秒かかったことが返されます。ただし、ページを更新すると 0 秒に戻ります。(どうして?)

次に、SubSonic コードを挿入します。

var start = System.Environment.TickCount;
rgUsers.DataSource = new UserCollection().Load();
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

初めてコードを実行すると、171 ミリ秒かかったと表示されます。ページを更新すると、60 ~ 70 ミリ秒かかったことが報告されます。

ですから、私の質問は次のとおりです。なぜ OA は最初の訪問時にロードするのにかなり時間がかかるのに、ページを更新するたびにロードするのに 0 秒もかからないのですか? SubSonic は最初のアクセスではかなり高速ですが、ページを更新するたびに最大 65 ミリ秒かかりますか?

これが「基本的な」質問であるか、パフォーマンスを適切にテストしていない場合は、申し訳ありません。この方法を改善する方法があれば、アドバイスをいただければ幸いです。

ありがとう、アンドリュー

4

3 に答える 3

4

OpenAccess には、OpenAccessContext を初めて作成するときに作成される内部 Database オブジェクトがあります。基本的に、すべてのデフォルトを計算し、キャッシュを作成し、他のインフラストラクチャ オブジェクトを初期化します。作成されるとすぐに、内部の静的ディクショナリに格納されます (connectionID がキーになります)。

作成された他のすべてのコンテキストは、その内部オブジェクトを使用し、オーバーヘッドはまったくありません。1600 ミリ秒は少し高いと言われていますが、マッピング タイプを変更することを検討してください (xml が最適で、パフォーマンスが優れています)。

最適化は、モデルがアプリケーションの開始ハンドラーで初期化されていることを確認することです。次のコードでうまくいくはずです。

void Application_Start(object sender, EventArgs e)
{
    var modelInfo = new EntitiesModel().Metadata;
}

編集:フォローアップとして、0ミリ秒と表示されていますが、これは実際にはクエリの実行時間ではありません。クエリが返すのは、後で実行される IQueryable です。実際のデータを取得するには、ToList() を呼び出す必要があります。

于 2012-02-22T10:29:35.123 に答える
1

その理由として、OpenAccess でデータベースを開くのに SubSonic よりも時間がかかることが考えられます。ロード時間を測定する前に、データベースを開くためだけにカウントを取得するなどの簡単な操作を実行してみてください。SubSonic でも同じことを行います。

context = new EntitiesModel();
context.Users.Count();
var start = System.Environment.TickCount;
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

トーマス

于 2012-02-22T09:32:33.500 に答える
0

これがトピックから外れているかどうかはわかりませんが、私は過去数年間、SS2 と SS3 を使用して貢献してきました。オーバーホールを完了し、MsAccessProvider を SS2 に追加し、Enum ジェネレーターを SS2 と SS3 に追加しました (これらはコミットされ、プロジェクト ページで公開されています)。

また、独自の SS3 用のキャッシング フレームワークをまとめました。これにより、任意の一意のインデックスによって参照されるデータベース内のテーブルから、自動化された選択的なデータ (汎用辞書として) のキャッシングが可能になります。テンプレートベースの Web ページ生成用にルックアップ データをキャッシュし、SS3 LINQ ルックアップで約 2 分間かかっていた応答を数分の 1 秒に改善することができました。(これは公にはしていません)

SSのユーザーの注意を引くために、このようなものをどこに投稿すればよいかわかりません. ソースへの私のコミットメントと未解決の問題のクローズは、まったく反応がありませんでした。

于 2012-03-02T12:22:34.937 に答える