Я провожу очень простой тест с очередями, указывающими на реальное хранилище Azure, и, не знаю, почему, выполнить тест с моего компьютера гораздо быстрее, чем развернуть рабочую роль в Azure и выполнить ее там.Я не использую Dev Storage при локальном тестировании, мой .cscfg имеет строку подключения к реальному хранилищу.
Учетная запись хранения и роли находятся в одной группе соответствия.
Тест - это веб-роль и рабочая роль.Страница сообщает работнику, какой тест нужно выполнить, работник делает это и возвращает затраченное время.Этот конкретный тест показывает, сколько времени занимает получение 1000 сообщений из очереди Azure, используя пакеты из 32 сообщений.Во-первых, я тестирую запуск отладки с VS, после того как я разверну приложение в Azure и запусту его оттуда.
Результаты:
- С моего компьютера: 34805,6495 мс.
- Из роли Azure: 7956828.2851 мс.
Это может означать, что быстрее получать доступ к очередям извне Azure, чем изнутри, и это не имеет смысла.
IЯ тестирую так:
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
для этогоtest:
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);
на 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());
И теперь результаты похожи, так что, очевидно, есть разница в том, как обрабатывается точность или что-то в этом роде.Я исследую это позже.