2014-09-24 1 views
2

У меня есть программа, которая извлекает тысячи строк данных из таблицы 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.48sec20 checks является 2.6sec, 50 checks является 6.8 seconds и ничего более, что это 12 seconds per check но программа останавливается на несколько минут, а затем он начинает снова вставляя и останавливается, и продолжается, и т.д., пока все проверки не вставлены. (Количество секунд на проверку основано на классе секундомера, и я это записываю в окно отладки. Я не беру общее время и деля его на количество проверок.)

Я пробовал 3 различные сценарии:

  1. Я создал 3 задачи со всеми моими вставками, как указано выше. Я выбрал 100 проверок, и у меня был фоновый таймер, который проверял бы состояние всех задач (в данном случае 300), и он сообщил бы мне, когда задачи будут завершены. Это заняло более десяти минут.

  2. Я создал 3 задачи со всеми моими вставками, как указано выше. Я выбрал 100 проверок, и я жду завершения всех задач, прежде чем перейти к следующей проверке. Это заняло более десяти минут.

  3. Я выбрал 100 чеков, и у меня нет задач. Я просто использую основной поток, чтобы записать информацию обратно в таблицы. Это то же самое, что и код в моей задаче выше, минус задача. Время заняло более 10 минут, чтобы написать все таблицы.

Как вы можете видеть, у меня не было увеличения скорости, были ли у меня задачи и таймер фона, задачи и ждали от них всех или без задач.

Другая часть информации - я изменил свое приложение конфигурации, чтобы иметь MaxConnections = 300 и ListenBacklog = 300. Я не уверен, что это влияет на все, что я делаю, но я думал, что выброшу его там.

Вопросы:

  1. Может кто-нибудь объяснить, почему среднее время на проверку вставляет изменения, основанные на количестве проверок выбраны? По-моему, я верю, что если я выбрать 10 проверок или 100 проверок она должна быть более последовательной в узду, не 1.48sec для группы 10 и 12 seconds для группы 100.

  2. Это прерывистое записей 15 проверок или поэтому, а затем он останавливается на 1 - 3 минуты, а затем продолжает обрабатывать и останавливается и т. д., почему это происходит, когда я смотрю на мое окно вывода, я вижу, что поток «вышел из кода 259? Я посмотрел Why am I seeing multiple "The thread 0x22c8 has exited with code 259 (0x103)." messages, и мне не удалось действительно решить мою проблему. Когда я нажимаю ссылку в решении этой проблемы, она выводит меня на форум Microsoft, в котором говорится, что проблема исправлена ​​в будущей версии Visual Studio.

  3. Может ли это быть сетевой проблемой? Так как я пытаюсь обработать 100 вложений через WCF, может быть причиной моей проблемы с производительностью?

Любая помощь, указывающая мне в правильном направлении, как решить эту проблему, связана ли она с сетью или WCF. Если есть дополнительная информация, пожалуйста, дайте мне знать, и я обновлю билет.

+1

Используйте профайлер. Сколько одновременных операций и задач есть? – usr

+0

Как указал @usr, используйте профилировщик. Он расскажет вам, как долго проходит каждый метод и какая линия (-ы) может быть узким местом. По крайней мере, вы должны время каждого из этих звонков, чтобы посмотреть, какой из них растет медленнее и медленнее экспоненциально. Это, по крайней мере, даст вам небольшое представление о том, где может быть проблема. Но да, профайлер будет вашим лучшим другом. – TyCobb

+0

Почему вы используете WCF для этого - это удаленный VFP-файл? –

ответ

1

Ответ на мой вопрос - оба.

Я предлагаю использовать профилировщик (спасибо вам за предложение), чтобы увидеть, где находятся шеи бутылки.

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

Моя основная проблема заключалась в том, что я создавал 100-миллионные соединения и не окружал их всех с помощью ... Я сделал изменения и завернул все соединения в рамках использования, и проблема альтов была решена. Теперь я получаю аналогичную производительность между 50 проверками и 100 проверками до 350 проверок.

Для тех из вас, кто не знает, как использовать, используя, здесь вы идете:

C#

using (var coatsService = _factory.CreateCoatsService()) 
    { 
     var cls = coatsService.GetPrdedtxts(_path); 
     return cls.ToList(); 
    } 

VB

Using coatsService = _factory.CreateCoatsService() 
     Dim cls = coatsService.GetPrdedtxts(_path) 
     return cls.ToList() 
    End Using 

 Смежные вопросы

  • Нет связанных вопросов^_^