Решение этой проблемы было найдено в вопросе Исполняемый файл в Wine работает быстрее, чем в Windows - почему? Glibc floor()
, вероятно, реализован в виде системных библиотек.
У меня есть очень маленькая программа на C ++ (~ 100 строк) для моделирования физики. Я скомпилировал его с помощью gcc 4.6.1 как на Ubuntu Oneiric, так и на Windows XP на одном компьютере. Я использовал точно такие же параметры командной строки (тот же файл makefile).
Как ни странно, в Ubuntu программа завершается намного быстрее, чем в Windows (~ 7,5 с против 13,5 с). На данный момент я подумал, что это разница между компиляторами (несмотря на то, что используется одна и та же версия).
Но что еще более странно, если я запускаю исполняемый файл Windows под вином, он все равно быстрее, чем в Windows (я получаю 11 с «реальное» и 7,7 с «пользовательское» время - и это включает винный запуск).
Я запутался. Конечно, если один и тот же код выполняется на одном и том же процессоре, не должно быть разницы во времени.
В чем может быть причина этого? Что я делаю не так?
Программа выполняет минимальный ввод-вывод (выводит одну строку) и использует только vector
фиксированной длины из STL (т.е. никакие системные библиотеки не должны использоваться). В Ubuntu я использовал gcc по умолчанию, а в Windows - дистрибутив Nuwen. Я проверил, что загрузка ЦП близка к нулю при проведении бенчмаркинга (я закрыл большинство программ). В Linux я использовал time
для измерения времени. В Windows я использовал timethis.exe
.
ОБНОВЛЕНИЕ
Я сделал несколько более точных таймингов, сравнив время работы для разных входов (время выполнения должно быть пропорционально входу) программ, скомпилированных с помощью 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.