У меня есть программа, которая извлекает тысячи строк данных из таблицы visual foxpro, и я показываю это пользователю. Затем пользователь может выбрать столько проверок, сколько захочет, и я напишу обратную сумму в 10 различных таблиц foxpro.Является ли моя проблема с производительностью WCF или сетью?
На основании информации, выбранной пользователем, я создаю запись для каждого выбора и записываю ее в таблицу с использованием WCF.
Ниже приведен фрагмент кода, который я использую, чтобы записать обратно в таблицах:
Task head = new TaskFactory().StartNew(() =>
{
CreateVoidHistHead(curChecks, i);
//pass in _i which is defined within this routine. Cannot have _i global.
CreateApHead(curChecks, i);
var checkRecAdjustment = CreateAdjustmentRec(curChecks, ckdate);
var checkRecVoidChks = CreateVoidChksRec(curChecks);
var checkGjAdj = CreateGjAdj(curChecks);
var checkApSnpSht = CreateApsnpRec(curChecks);
using (var coatsService = factory.CreateCoatsService())
{
coatsService.InsertPrsnapc(_path, checkRecAdjustment);
coatsService.InsertVoidchk(_path, checkRecVoidChks);
coatsService.InsertGjadj(_path, checkGjAdj);
coatsService.InsertApsnpsht(_path, checkApSnpSht);
}
});
Как вы можете видеть в коде выше я создаю задачу для обработки этого вызова. Я создаю 3 задачи. Первая задача заключается в вставке в одну таблицу, задача выше вставляет в 6 таблиц, а последняя задача вставляет в 3 таблицы (все используют аналогичную логику, как указано выше).
Вот вопрос скорости, который у меня есть. Когда я выбираю 10 checks
, среднее время для записи в эти таблицы: 10 seconds
. Если я выберу 20 checks
, среднее время составляет 25 seconds
, 50 checks
= 1 минута и 100 checks
is 10+ minutes
. Я даже разбил его на выбранный уровень предмета. в среднем за единицу выбирается 10 checks
является 1.48sec
20 checks
является 2.6sec
, 50 checks
является 6.8 seconds
и ничего более, что это 12 seconds per check
но программа останавливается на несколько минут, а затем он начинает снова вставляя и останавливается, и продолжается, и т.д., пока все проверки не вставлены. (Количество секунд на проверку основано на классе секундомера, и я это записываю в окно отладки. Я не беру общее время и деля его на количество проверок.)
Я пробовал 3 различные сценарии:
Я создал 3 задачи со всеми моими вставками, как указано выше. Я выбрал 100 проверок, и у меня был фоновый таймер, который проверял бы состояние всех задач (в данном случае 300), и он сообщил бы мне, когда задачи будут завершены. Это заняло более десяти минут.
Я создал 3 задачи со всеми моими вставками, как указано выше. Я выбрал 100 проверок, и я жду завершения всех задач, прежде чем перейти к следующей проверке. Это заняло более десяти минут.
Я выбрал 100 чеков, и у меня нет задач. Я просто использую основной поток, чтобы записать информацию обратно в таблицы. Это то же самое, что и код в моей задаче выше, минус задача. Время заняло более 10 минут, чтобы написать все таблицы.
Как вы можете видеть, у меня не было увеличения скорости, были ли у меня задачи и таймер фона, задачи и ждали от них всех или без задач.
Другая часть информации - я изменил свое приложение конфигурации, чтобы иметь MaxConnections = 300 и ListenBacklog = 300. Я не уверен, что это влияет на все, что я делаю, но я думал, что выброшу его там.
Вопросы:
Может кто-нибудь объяснить, почему среднее время на проверку вставляет изменения, основанные на количестве проверок выбраны? По-моему, я верю, что если я выбрать 10 проверок или 100 проверок она должна быть более последовательной в узду, не
1.48sec
для группы 10 и12 seconds
для группы 100.Это прерывистое записей 15 проверок или поэтому, а затем он останавливается на 1 - 3 минуты, а затем продолжает обрабатывать и останавливается и т. д., почему это происходит, когда я смотрю на мое окно вывода, я вижу, что поток «вышел из кода 259? Я посмотрел Why am I seeing multiple "The thread 0x22c8 has exited with code 259 (0x103)." messages, и мне не удалось действительно решить мою проблему. Когда я нажимаю ссылку в решении этой проблемы, она выводит меня на форум Microsoft, в котором говорится, что проблема исправлена в будущей версии Visual Studio.
Может ли это быть сетевой проблемой? Так как я пытаюсь обработать 100 вложений через WCF, может быть причиной моей проблемы с производительностью?
Любая помощь, указывающая мне в правильном направлении, как решить эту проблему, связана ли она с сетью или WCF. Если есть дополнительная информация, пожалуйста, дайте мне знать, и я обновлю билет.
Используйте профайлер. Сколько одновременных операций и задач есть? – usr
Как указал @usr, используйте профилировщик. Он расскажет вам, как долго проходит каждый метод и какая линия (-ы) может быть узким местом. По крайней мере, вы должны время каждого из этих звонков, чтобы посмотреть, какой из них растет медленнее и медленнее экспоненциально. Это, по крайней мере, даст вам небольшое представление о том, где может быть проблема. Но да, профайлер будет вашим лучшим другом. – TyCobb
Почему вы используете WCF для этого - это удаленный VFP-файл? –