キューが実際のAzureストレージを指す非常に単純なテストを行っていますが、理由はわかりません。コンピューターからテストを実行する方が、ワーカーの役割をazureにデプロイしてそこで実行するよりもはるかに高速です。ローカルでテストするときにDevStorageを使用していません。私の.cscfgには、実ストレージへの接続文字列が含まれています。
ストレージアカウントとロールは同じアフィニティグループにあります。
テストは、Webの役割とワーカーの役割です。このページは、実行するテストをワーカーに通知し、ワーカーはそれを実行して、消費した時間を返します。この特定のテストでは、32個のメッセージのバッチを使用してAzureキューから1000個のメッセージを取得するのにかかる時間を測定します。まず、アプリをAzureにデプロイしてそこから実行した後、VSでデバッグの実行をテストします。
結果は次のとおりです。
- 私のコンピューターから:34805.6495ミリ秒。
- Azureの役割から:7956828.2851ミリ秒。
つまり、Azureの内部よりも外部からキューにアクセスする方が高速であり、意味がありません。
私はこのようにテストしています:
private TestResult InQueueScopeDo(String test, Guid id, Int64 itemCount)
{
CloudStorageAccount account = CloudStorageAccount.Parse(_connectionString);
CloudQueueClient client = account.CreateCloudQueueClient();
CloudQueue queue = client.GetQueueReference(Guid.NewGuid().ToString());
try
{
queue.Create();
PreTestExecute(itemCount, queue);
List<Int64> times = new List<Int64>();
Stopwatch sw = new Stopwatch();
for (Int64 i = 0; i < itemCount; i++)
{
sw.Start();
Boolean valid = ItemTest(i, itemCount, queue);
sw.Stop();
if (valid)
times.Add(sw.ElapsedTicks);
sw.Reset();
}
return new TestResult(id, test + " with " + itemCount.ToString() + " elements", TimeSpan.FromTicks(times.Min()).TotalMilliseconds,
TimeSpan.FromTicks(times.Max()).TotalMilliseconds,
TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);
}
finally
{
queue.Delete();
}
return null;
}
は、1000個のPreTestExecute
アイテムをそれぞれ2048バイトでキューに入れます。
そして、これはItemTest
このテストのメソッドで起こることです:
Boolean done = false;
public override bool ItemTest(long itemCurrent, long itemCount, CloudQueue queue)
{
if (done)
return false;
CloudQueueMessage[] messages = null;
while ((messages = queue.GetMessages((Int32)itemCount).ToArray()).Any())
{
foreach (var m in messages)
queue.DeleteMessage(m);
}
done = true;
return true;
}
私は間違っていること、同じコード、同じ接続文字列ではなく、これらの結果を得ました。
何か案が?
アップデート:
問題は私がそれを計算する方法にあるようです。
times.Add(sw.ElapsedTicks);
fortimes.Add(sw.ElapsedMilliseconds);
とこのブロックを置き換えました:
return new TestResult(id, test + " with " + itemCount.ToString() + " elements",
TimeSpan.FromTicks(times.Min()).TotalMilliseconds,
TimeSpan.FromTicks(times.Max()).TotalMilliseconds,
TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);
これのために:
return new TestResult(id, test + " with " + itemCount.ToString() + " elements",
times.Min(),times.Max(),times.Average());
そして今、結果は似ているので、どうやら精度の扱い方などに違いがあるようです。これについては後で調べます。