0

400 個までのビジネス オブジェクトのリストをハイドレートしようとしていますが、文字列をハイドレートする必要があると、パフォーマンスが非常に遅くなります。400 個のオブジェクトをハイドレートするのに 20 秒以上かかります。

編集

MySQL 5.1 と dotConnect for MySQL v5.0.12 をデータ プロバイダーhttp://www.devart.com/dotconnect/mysql/として使用しています。

問題の原因となっている文字列の種類に絞り込むために、いくつかのベンチマークを行いました。他のアセンブリの読み込みにかかる時間を無視するために、レコード 2 から n までの時間を測定し始めました。

次のコードは、0 ミリ秒で 1 つのオブジェクトをハイドレートします

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))

これも 0 ミリ秒で 1 つのオブジェクトを水和します

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = "FirstName"

ただし、datareader オブジェクトを文字列に変換するとすぐに、平均 53 ミリ秒かかります

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))

私も2本の弦に水分を補給しようとしましたが、1本の弦ほどパフォーマンスを吹き飛ばしませんか?以下は、1 つのオブジェクトをハイドレートするのに平均 57 ミリ秒しかかかりません。

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))
objUserInfo.LastName = Convert.ToString(dr("LastName"))

多くの人が上記の構文を使用してビジネス オブジェクトをハイドレートしていることを知っています。これを行うためのより効率的/高速な方法はありますか?

編集 文字列でダ​​イレクトキャストを行う別のテストを行ったところ、同じ遅い速度が生成されました:(キャストを行うためだけに53ms。

objUserInfo.FirstName = DirectCast("alex", String)
4

3 に答える 3

2

これを試してください:

それ以外の

objUserInfo.Firstname = Convert.ToString(dr("FirstName"))

使用する

objUserInfo.Firstname = dr.GetString(2);
  1. GetXXX メソッドを使用し、Microsoft に依存して変換を最適化します。(編集:Convert.ToString(dr("FirstName"))醜い暗黙的で時間のかかる変換および/または (アン) ボックス化操作を行っていると思われます。)
  2. 文字列インデクサー ("FirstName") を使用して列にアクセスする代わりに、数値インデクサー (2) を使用します。これは高速ですが、読みにくくなります。

編集: アレックスが問題を発見しました。キャスティングの問題じゃない!それについての彼のコメント:

よし、問題を突き止めた!私は DotNetNuke を使用しており、その標準オブジェクトの 1 つを埋めています。問題は、FirstName プロパティを設定すると、実際には非常に時間がかかるプロファイル オブジェクトへの別の呼び出しが行われることです。文字列の変換やキャストとは関係ありません。

于 2009-03-30T08:27:46.993 に答える
1

どのデータプロバイダーを使用していますか? オラクルに醜い問題がありました。

最も効率的なのは、dr.GetString(columnNumber) を呼び出すことです。ここで、dr.GetOrdinal(columnName) によって取得される列番号です (読み取りループの最初にキャッシュできます)。

ただし、これは実際の問題ではありません。列のサイズではありませんか?

于 2009-03-30T08:22:31.013 に答える
0

私も2本の弦に水分を補給しようとしましたが、1本の弦ほどパフォーマンスを吹き飛ばしませんか? 以下は、1 つのオブジェクトをハイドレートするのに平均 57 ミリ秒しかかかりません。

時間はどのように計測していますか?追加のアセンブリの読み込みが含まれている可能性があり、53 ミリ秒はそれを考慮に入れています。

最初のループ (最初の水分補給) の後でのみ、時間の測定を開始する必要があります。このようにして、アセンブリのロードは測定前に行われます。

于 2009-03-30T08:20:19.350 に答える