Время замедлилось с помощью `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 (это не рабочий код). В частности, это:
- Открывает соединение с базой данных SQL Azure,
- Отключает нулевое ограничение,
- Пользы
System.Data.SqlClient.SqlBulkCopy
заблокировать пустую таблицу и загрузить ее с помощью буферизованного потока, который извлекает набор данных (2,4 МБ) из хранилища BLOB-объектов Azure через файловую систему, распаковывает его (GZip, 4,9 МБ накачано) и анализирует его (записи CSV, 349996, анализирует с помощью пользовательскогоIDataReader
с помощьюTextFieldParser
), - Обновляет столбец той же таблицы, чтобы установить общее значение,
- Повторно включает нулевое ограничение.
Не меньше, не больше; нет ничего особенно интенсивного, я полагаю, что операция в основном связана с сетью.
Есть идеи, почему время замедляется?
Заметки:
- Интересно, что время ожидания для групповой вставки и команд обновления пришлось увеличить (установить до пяти минут). Я прочитал, что по умолчанию 30 секунд, что больше, чем заявленные 12 секунд; следовательно, я заключаю, что
SqlClient
измеряет время по-разному. - Отчеты от локального выполнения кажутся совершенно правильными, хотя это неизменно быстрее (4-6 с использованием LocalDB), так что может просто быть так, что эффекты не заметны.
1 ответ
Вы использовали секундомер.Elapsed.Seconds, чтобы получить общее время, но это неправильно. Elapsed.Seconds - это секундная составляющая временного интервала, представленного структурой TimeSpan. Пожалуйста, попробуйте вместо этого секундомер.Elapsed.TotalSeconds.