На моем компьютере программы выполняются за 2 секунды, а на других - за 15 секунд.

У меня есть две программы, написанные на C ++, которые используют Winsock. Оба они принимают TCP-соединения, и один отправляет данные, а другой получает данные. Они скомпилированы в Visual Studio 2008. У меня также есть программа, написанная на C #, которая подключается к обеим программам на C ++ и пересылает пакеты, полученные от одной, и отправляет их другой. В процессе он подсчитывает и отображает количество переадресованных пакетов. Также отображается время, прошедшее от первого до самого последнего пакета.

Программа на C ++, которая отправляет пакеты, просто выполняет цикл 1000 раз, отправляя одни и те же данные. Когда я запускаю все три приложения на своей машине разработки (с использованием обратной связи или фактического IP-адреса), пакеты проходят через всю систему примерно за 2 секунды. Когда я запускаю все три на любом другом ПК в нашей лаборатории, это всегда занимает от 15 до 16 секунд. У каждого ПК разные процессоры и разные объемы памяти, но все они работают под управлением Windows XP Professional. На моем компьютере для разработки на самом деле установлен более старый AMD Athlon с вдвое меньшим объемом памяти, чем у одной из машин, которая выполняет эту задачу дольше. Я наблюдал за графиком времени ЦП в диспетчере задач на своем и еще одном компьютере, и ни один из них не использует значительную часть процессора (т.е. более 10%) во время работы этих программ.

У кого-нибудь есть идеи? Я могу только думать об установке Visual Studio на целевой машине, чтобы посмотреть, имеет ли это какое-то отношение к этому.

Проблема решена ================================================ ====

Сначала я установил Visual Studio, чтобы посмотреть, повлиял ли это на какой-либо эффект, но этого не произошло. Затем я протестировал программы на своем новом компьютере для разработки, и он работал так же быстро, как и мой старый. Запуск программ на ноутбуке с Vista снова показал результат 15 секунд.

Я напечатал временные метки по обе стороны от определенных инструкций в серверной программе, чтобы увидеть, какая из них занимает больше всего времени, и обнаружил, что задержка была вызвана вызовом метода Sleep () длительностью 1 миллисекунда. Очевидно, в моих старых и новых системах Sleep (1) игнорировался, потому что за одну миллисекунду отправлялось от 10 до> 20 пакетов. Иногда у меня бывали перерывы в выполнении примерно на 15 или 16 миллисекунд, что приводило к времени около 2 секунд для 1000 пакетов. В системах, которым требуется около 15 секунд для обработки 1000 пакетов, у меня будет промежуток в 15 или 16 миллисекунд между отправкой каждого пакета.

Я закомментировал вызов метода Sleep (), и теперь пакеты отправляются немедленно. Спасибо за помощь.


person ACE2100    schedule 26.08.2009    source источник
comment
Sleep () гарантированно будет спать по крайней мере столько, сколько вы просите. Он мог бы спать намного дольше. Я считаю, что в Windows есть функция, которую вы можете вызвать, чтобы запросить жесткое время мультимедиа, что изменит это поведение.   -  person Zan Lynx    schedule 10.10.2013
comment
msdn.microsoft.com/ en-us / library / windows / desktop /   -  person Zan Lynx    schedule 10.10.2013


Ответы (2)


Вы должны профилировать свое приложение на хорошем, 2-секундном и 15-секундном лабораторном опытах и ​​посмотреть, чем они отличаются. Разница может быть связана с любым количеством проблем (диск, антивирус, сеть) - без каких-либо резервных копий данных мы бы просто снимали в темноте.

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

person Michael    schedule 26.08.2009

Вы можете попробовать проверить параметры реестра настройки производительности Winsock - это может быть установка какой-то игры или утилиты, которая изменила их на вашем ПК.

person soru    schedule 26.08.2009