Решение для этого было найдено в вопросе Исполняемый файл работает на 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
(т.е. исключения были отключены).
Что мы видим из этих данных:
разница не связана со временем запуска процесса, так как время выполнения пропорционально входу
Разница между запуском в Wine и Windows существует только для программы, скомпилированной gcc, а не для программы, скомпилированной msvc: она не может быть вызвана другими программами, загружающими процессор в Windows, или не работает timethis.exe. .