Та же самая программа быстрее в Linux, чем в Windows - почему? - PullRequest
5 голосов
/ 10 ноября 2011

Решение для этого было найдено в вопросе Исполняемый файл работает на Wine быстрее, чем Windows - почему? Glibc floor(), вероятно, реализован в терминах системных библиотек.


У меня очень маленькая программа на C ++ (~ 100 строк) для симуляции физики. Я скомпилировал его с помощью gcc 4.6.1 на Ubuntu Oneiric и Windows XP на одном компьютере. Я использовал точно такие же параметры командной строки (тот же make-файл).

Странно, но в Ubuntu программа завершает намного быстрее, чем в Windows (~ 7,5 с против 13,5 с). В этот момент я подумал, что это различие в компиляторе (несмотря на использование той же версии).

Но что еще более странно, если я запускаю исполняемый файл Windows под Wine, он все равно быстрее, чем в Windows (у меня получается 11 с "реальным" и 7,7 с "пользовательским" временем - и это включает запуск Wine.)

Я в замешательстве. Конечно, если один и тот же код выполняется на том же процессоре, не должно быть различий во времени.

В чем может быть причина этого? Что я могу делать не так?

Программа выполняет минимальный ввод-вывод (выводит одну строку) и использует только фиксированную длину vector из STL (т. Е. Системные библиотеки не должны быть задействованы). В Ubuntu я использовал gcc по умолчанию, а в Windows - дистрибутив Nuwen . Я проверил, что загрузка ЦП близка к нулю при проведении бенчмаркинга (я закрыл большинство программ). В Linux я использовал time для синхронизации. В Windows я использовал timethis.exe.

UPDATE

Я сделал несколько более точных временных интервалов, сравнивая время выполнения для различных входных данных (время выполнения должно быть пропорционально входным данным) программ, скомпилированных gcc и msvc в Windows XP, Wine и Linux. Все числа указаны в секундах и являются как минимум 3 прогонами.

В Windows я использовал timethis.exe (время стены), в Linux и Wine я использовал время (процессорное время). (timethis.exe не работает на Wine) Я убедился, что другие программы не используют ЦП, и отключил антивирусный сканер.

Параметры командной строки для gcc были -march=pentium-m -Wall -O3 -fno-exceptions -fno-rtti (т.е. исключения были отключены).

Timings

Что мы видим из этих данных:

  1. разница не связана со временем запуска процесса, так как время выполнения пропорционально входу

  2. Разница между запуском в Wine и Windows существует только для программы, скомпилированной gcc, а не для программы, скомпилированной msvc: она не может быть вызвана другими программами, загружающими процессор в Windows, или не работает timethis.exe. .

Ответы [ 3 ]

4 голосов
/ 10 ноября 2011

Вы будете удивлены, какие системные библиотеки участвуют. Просто сделайте в своем приложении ldd и посмотрите, какие из них используются (хорошо, не так много, но, конечно, glibc).

Чтобы полностью доверять вашим выводам о скорости выполнения , вам потребуется запустить приложение несколько раз подряд и взять среднее время выполнения. Возможно, загрузчик ОС работает медленнее (хотя 4s - это долгое время загрузки).

Другие очень возможные причины:

  1. Отличная реализация malloc
  2. Обработка исключений, если она используется до крайности, может привести к замедлению (Windows GCC, MinGW, может не быть оптимальной звездой обработки исключений в шоу)
  3. Инициализация, зависящая от ОС: вещи, которые необходимо выполнить при запуске программы в Windows, но не в Linux.

Большинство из них легко тестируются; -)


Обновление вашего обновления: теперь единственное, что вы можете сделать, - это профиль. Хватит гадать, и пусть профилировщик скажет вам, где тратится время. Используйте gprof и встроенный профилировщик Visual Studio и сравнивайте время, потраченное на различные функции.

2 голосов
/ 10 ноября 2011

Сделайте бенчмаркинг в коде. Также попробуйте скомпилировать с визуальной студией. В Windows, если у вас есть какое-либо приложение, такое как Yahoo Messenger, которое устанавливает хуки, они могут очень легко замедлить время загрузки вашего приложения.

На окнах у вас есть: QueryPerformanceCounter В Linux: clock_gettime

1 голос
/ 10 ноября 2011

Очевидно, что разница связана с системой.

Вы можете использовать strace, чтобы понять, какие системные вызовы выполняются, например,

strace -o /tmp/yourprog.tr yourprog

, а затем заглянуть в /tmp/yourprog.tr

(Если в Windows существует эквивалент strace, попробуйте его использовать)

Возможно, ваша программа выделяет память (используя системный вызов mmap), и, возможно, системные вызовы, связанные с памятью, выполняются быстреев Linux (или даже в Wine), чем в Windows?Или некоторые другие системные вызовы обеспечивают более быструю функциональность в Linux, чем в Windows.

NB.Я ничего не знаю о Windows, так как я использую системы Unix с 1986 года и Linux с 1993 года.

...