Windows, Linux и управление памятью - PullRequest
2 голосов
/ 15 июля 2009

Мне довольно любопытно, как Windows и Linux управляют памятью с помощью программ на C ++.

Причина этого любопытства в том, что я только что сделал 3 очень простых программы на C ++, переносимых между Linux и Windows. Код был точно таким же. Аппаратное обеспечение тоже. Но результаты были невероятно разные! Оба теста были повторены 10 раз, а затем было рассчитано среднее арифметическое.

Я тестировал последовательные вставки в статический массив целых чисел, вектор класса и в стек (с указателями). Общее количество вставок составило 10 ^ 6.

Windows XP SP2 x86: Статический массив целых чисел: 56 мс Вектор класса: 686 мс Стек (с указателями): 2193 мс

Slackware 11 x86 результаты: Статический массив целых чисел: 100 мс Вектор класса: 476 мс Стек (с указателем): 505 мс

Разница в скорости между временем вставки стека в Windows и Slax впечатляет. Эти результаты кажутся нормальными? Оба кода были скомпилированы с использованием G ++ (mingw32-g ++ в Windows).

Используемый компьютер представлял собой двухъядерный процессор с тактовой частотой 3,2 ГГц и 4 ГБ ОЗУ, а при проведении испытаний было более 2 ГБ свободной ОЗУ.

Ответы [ 2 ]

6 голосов
/ 15 июля 2009

Это может иметь большее отношение к реализации C ++ stdlib (Microsoft MSVC против GNU libc / stdc ++), чем к управлению памятью ...

C ++ устанавливает спецификацию, но реализации сильно различаются.

Обновление: и как я теперь заметил, вы использовали g ++ на обеих платформах - ну, это все-таки другая реализация. А код GNU был разработан для среды Unix и позже был перенесен на Windows - поэтому он может делать предположения и оптимизации, которые являются неправильными для среды Windows.

Но ваш оригинальный вопрос верен. Это может иметь отношение к базовой модели памяти операционной системы, но ваши тесты здесь слишком грубые, чтобы делать какие-либо выводы.

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

1 голос
/ 15 июля 2009

Две секунды для миллиона вставок - это слишком много. Вы включили оптимизацию? Без них эти цифры ничего не значат.

Редактировать: так как вы скомпилировали без оптимизаций, включите их (например, используйте -O2) и повторите измерение. Разница, вероятно, будет намного меньше. Стандартные библиотеки имеют тенденцию быть достаточно защитными и выполнять много проверок непротиворечивости, которые могут сильно исказить измерение.

Редактировать: Если это все еще занимает более 2 секунд даже при включенной оптимизации, то происходит что-то еще. Попробуйте опубликовать некоторый код. Следующая программа работает около 40 миллисекунд в моей системе под Cygwin.

#include <stack>

int main()
{
    std::stack<int> s;
    for (int i = 0; i < 1000000; ++i)
        s.push(i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...