Время замедлилось с помощью `SDStopwatch` в Azure

Я только что запустил некоторый код, который сообщает о его производительности на экземпляре веб-сайтов Azure; результат казался немного странным. Я перезапустил операцию, и действительно, она кажется последовательной: System.Diagnostics.Stopwatch видит время выполнения 12 секунд для операции, которая фактически заняла более трех минут (по крайней мере, 3m16s).

Debug.WriteLine("Loading dataset in database ...");
var stopwatch = new Stopwatch();
stopwatch.Start();
ProcessDataset(CurrentDataSource.Database.Connection as SqlConnection, parser);
stopwatch.Stop();
Debug.WriteLine("Dataset loaded in database ({0}s)", stopwatch.Elapsed.Seconds);
return (short)stopwatch.Elapsed.Seconds;

Этот процесс выполняется в контексте "действия" службы данных WCF и инициирует тестовые данные в базе данных SQL (это не рабочий код). В частности, это:

  1. Открывает соединение с базой данных SQL Azure,
  2. Отключает нулевое ограничение,
  3. Пользы System.Data.SqlClient.SqlBulkCopy заблокировать пустую таблицу и загрузить ее с помощью буферизованного потока, который извлекает набор данных (2,4 МБ) из хранилища BLOB-объектов Azure через файловую систему, распаковывает его (GZip, 4,9 МБ накачано) и анализирует его (записи CSV, 349996, анализирует с помощью пользовательского IDataReader с помощью TextFieldParser),
  4. Обновляет столбец той же таблицы, чтобы установить общее значение,
  5. Повторно включает нулевое ограничение.

Не меньше, не больше; нет ничего особенно интенсивного, я полагаю, что операция в основном связана с сетью.

Есть идеи, почему время замедляется?

Заметки:

  • Интересно, что время ожидания для групповой вставки и команд обновления пришлось увеличить (установить до пяти минут). Я прочитал, что по умолчанию 30 секунд, что больше, чем заявленные 12 секунд; следовательно, я заключаю, что SqlClient измеряет время по-разному.
  • Отчеты от локального выполнения кажутся совершенно правильными, хотя это неизменно быстрее (4-6 с использованием LocalDB), так что может просто быть так, что эффекты не заметны.

1 ответ

Решение

Вы использовали секундомер.Elapsed.Seconds, чтобы получить общее время, но это неправильно. Elapsed.Seconds - это секундная составляющая временного интервала, представленного структурой TimeSpan. Пожалуйста, попробуйте вместо этого секундомер.Elapsed.TotalSeconds.

Другие вопросы по тегам