8

私は、appfabric と SQL Server 2008 のフェッチ時間を比較するテストを実行しており、appFabric は SQL Server よりも 4 倍遅く実行されているようです。

4 つの列 (すべて) を持つ 1 つのテーブルのみを含む SQL Server 2008 セットアップがありますnvarchar。テーブルには 6000 行あります。同じ行を (CLR シリアル化可能な obj として) appfabric キャッシュに挿入します。データを x 回フェッチするループを実行しています。

ここにコードがあります

public class AppFabricCache
{
readonly DataCache myDefaultCache;

public AppFabricCache()
{
//-------------------------
// Configure Cache Client 
//-------------------------

//Define Array for 1 Cache Host
var servers = new List<DataCacheServerEndpoint>(1);

//Specify Cache Host Details 
//  Parameter 1 = host name
//  Parameter 2 = cache port number
servers.Add(new DataCacheServerEndpoint(@"localhost", 22233));

//Create cache configuration
var configuration = new DataCacheFactoryConfiguration();

//Set the cache host(s)
configuration.Servers = servers;

//Set default properties for local cache (local cache disabled)
configuration.LocalCacheProperties = new DataCacheLocalCacheProperties();

//Disable exception messages since this sample works on a cache aside
DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off);

//Pass configuration settings to cacheFactory constructor
DataCacheFactory myCacheFactory = new DataCacheFactory(configuration);

//Get reference to named cache called "default"
myDefaultCache = myCacheFactory.GetCache("default");
}

public bool TryGetCachedObject(string key, out object value)
{
value = myDefaultCache.Get(key);
bool result = value != null;
return result;
}

public void PutItemIntoCache(string key, object value)
{
myDefaultCache.Put(key, value, TimeSpan.FromDays(365));
}

}

そして、ここにキャッシュからデータを取得するためのループがあります

public double RunReadStressTest(int numberOfIterations, out int recordReadCount)
{
recordReadCount = 0;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < numberOfIterations; i++)
{
for (int j = 1; j <= 6000; j++)
{
string posId = "PosId-" + j;
try
{
object value;
if (TryGetCachedObject(posId, out value))
recordReadCount++;
}
catch (Exception e)
{
Trace.WriteLine("AS%% - Exception - " + e.Message);
}
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
}

SQL Server からデータを取得するロジックはまったく同じです。それは

sqlCommand = 'Select * from TableName where posId = 'someId'' 

これが結果です...

SQL Server 2008 R2  Reading-1(ms)   Reading-2(ms)   Reading-3(ms)   Average Time in Seconds
 Iteration Count = 5    2528              2649            2665                 2.614
 Iteration Count = 10   5280              5445            5343                 5.356
 Iteration Count = 15   7978              8370            7800                 8.049333333
 Iteration Count = 20   9277              9643            10220                9.713333333

AppFabric                 Reading-1         Reading-2   Reading-3   Average Time in Seconds
Iteration Count = 5        10301            10160            10186                10.21566667
Iteration Count = 10       20130            20191            20650                20.32366667
Iteration Count = 15       30747            30571            30647                30.655
Iteration Count = 20       40448            40541            40503                40.49733333

ここで何か不足していますか?なぜそんなに遅いのですか?

4

3 に答える 3

2

違いは、ネットワークのオーバーヘッドです。SQL の例では、ネットワークを 1 回ホップして、N 行を選択します。AppFabric の例では、一括ではなくPER RECORD ごとにネットワークをホップします。これが違いです。これを証明するには、レコードを一時的に AppFabric にリストとして保存し、一度だけリストを取得するか、AppFabric Bulk API を使用して 1 回の要求ですべてを選択します。これが違いの多くを説明するはずです。

于 2013-05-25T19:36:29.767 に答える
1

これは、.Net のビルトイン シリアライゼーションが原因である可能性があります。

.Net シリアライゼーションはリフレクションを利用するため、パフォーマンスが非常に低下します。カスタムで書かれたシリアル化コードの使用を検討することをお勧めします。

于 2012-12-17T17:44:53.133 に答える
0

あなたのテストには偏りがあり、結果は最適ではないと思います。

分散キャッシュについて

  • ローカル キャッシュ :ローカル キャッシュ機能を無効にしました。キャッシュ オブジェクトは常にサーバーから取得されます。ネットワーク転送とデシリアライゼーションにはコストがかかります。
  • BulkGet : BulkGetは、サイズが 1 ~ 5KB 以下の多くのオブジェクトを取得する場合など、小さなオブジェクトで使用するとパフォーマンスが向上します。
  • データ圧縮なし : AppFabric とキャッシュ クライアントの間で圧縮はありません。これを確認してください。

あなたのテストについて

もう 1 つの重要なことは、同じことをテストしていないということです。一方では SELECT * をテストし、もう一方では N x GET ITEM をテストします。

于 2012-10-05T11:12:20.703 に答える