我正在进行一项非常简单的测试,队列指向真正的Azure存储,我不知道为什么,从我的计算机执行测试比将工作角色部署到azure并在那里执行要快得多。我在本地测试时没有使用Dev Storage,我的.cscfg具有到真实存储的连接字符串。
存储帐户和角色位于同一个关联组中。
测试是一个Web角色和一个辅助角色。该页面告诉工作人员要做什么测试,工作人员这样做并返回消耗的时间。此特定测试用于确定使用32个消息批次从Azure队列获取1000条消息所需的时间。首先,在将应用程序部署到Azure并从那里运行之后,我测试了使用VS运行调试。
结果是:
这可能意味着从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;
}
我不是我做错了,相同的代码,相同的连接字符串,我得到了这些结果。
有什么想法吗?
更新:
问题似乎与我计算的方式有关。
我已将[{1}}替换为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);
现在结果是相似的,所以显然处理精度的方式有所不同。我稍后会研究这个。
答案 0 :(得分:2)
问题显然是StopWatch和TimeSpan滴答的不同性质的问题,如here所述。
Stopwatch.ElapsedTicks Property
秒表刻度与DateTime.Ticks不同。 DateTime.Ticks值中的每个刻度表示一个100纳秒的间隔。 ElapsedTicks值中的每个刻度表示等于1秒的时间间隔除以频率。
答案 1 :(得分:1)
您的CPU利用率如何?这可能是您的代码加密CPU并且您的工作站比Azure节点快得多吗?