我正在做一個非常簡單的測試,其隊列指向真正的Azure存儲,並且我不知道爲什麼執行測試我的電腦比將工作人員角色部署到Azure並在那裏執行更快。我在本地測試時沒有使用Dev Storage,我的.cscfg具有連接字符串到實際存儲。Azure存儲隊列從雲中的工作角色非常緩慢,但不是來自我的機器
存儲帳戶和角色位於相同的關聯組中。
該測試是一個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;
}
的PreTestExecute
放1000個項目在隊列中每個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;
}
我不什麼我做錯了,同樣的代碼,相同的連接字符串,我得到了這些resuts。
有什麼想法?
更新:
該問題似乎是在我計算它的方式。
我已經更換了times.Add(sw.ElapsedTicks);
爲times.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());
而現在的結果是相似的,所以顯然存在怎樣精度的差異被處理或什麼。我將在稍後進行研究。
這看起來反直覺,但我看不出任何明顯的代碼,會導致這個問題。儘管我有一點困惑於itemCount參數。這是放入隊列的項目數量嗎?如果是這樣,那麼你只需要通過for循環的itemCount/32次,並且傳遞給ItemTest的itemCount應該是32,而不是1000. – knightpfhor 2011-04-27 20:54:57
這段代碼是多用途測試類層次結構的一部分。該類被認爲是衡量「每個項目」的時間,所以itemCount用於包含總項目,itemCurrent是集合中的當前項目。對於這個測試,我把這1000個項目放在「pre」調用中,並測量讀取所有消息需要多長時間,讀取消息時,「done」設置爲true,並且當I計算平均值。無論如何,我現在要做一個更直接的測試。 – vtortola 2011-04-28 08:44:47