Следующая статья от Edward Bradford сравнивает производительность простейших операций копирования в память на Linux (2.2/2.4) и Windows 2000.
И в этих тестах Linux опережает Windows в 1,5-2 раза.
2Irsi, Ogr: Сеть - великое изобретение. Многим безногим она дала общение. Заблудшим и отчаявшимся - поддержку сочуствующих. Одиноким - друзей. Ищущим - ответы. ... Вот только м@#$кам она ничего не даст ... Не будем реагировать: ОК?
2 онанимус: Античный философ Гераклит говорил, что мудрость состоит не в ?изучении многих вещей?; мудрость ? нечто отличное от всего. И она состоит в том, чтобы за различным узреть единство и за борьбой ? гармонию: ?Люди не понимают, как противоборствующее согласуется с самим собой. Это ? гармония противоположных напряжений, подобно луку и лире?.
И я говорю, что в борьбе противоположностей - есть совершенство. Да я сторонник Unix, я сторонник AMD и VIA, я болел за команду Ferrary и Шумахера еще тогда, когда они не были чемпионами в Ф-1, но это все не заставляет меня жестоко ненавидить Microsoft, Intel, и команду McLaren. Мой брат работает под w2k (что поделаешь, ASP), я под RH.7, у него на работе серваки под FreeBSD и w2k, у меня под KSI Linux, он обожает Делфи, а я прусь от Перла... И что ж, мне нужно за это ненавидеть своего собственного брата? Если бы он был Линуксоидом, то у меня не было бы возможности похвастаться перед ним Star офисом, Мозилой, xmms, драйверами под Dimond MX300 (которые лучше, чем в w2k:) )... Почему бы не воспринимать все с юмором, параллельно получая новые знания? Господа, где же Ваша мораль и этика! Я конечно, не говорю о запрете всего того потрясающего лексикона, но пусть лучше в нем звучит юмор а не злость и неуважение, не так ли?
>>Решение дифуров - это тест скорее не памяти, а FPU... Незнаю как дифуров, но решение диффуров прямыми методами (aka метод конечных элементов) - точно памяти!
Простой эксперимент:
Что-то вроде
char* p = new char[ 0x10000000 ];
sleep( 60 ); //Sleep( 60000 ) for win32
memusage
sleep( 60 ); //Sleep( 60000 ) for win32
delete [] p;
Лично у меня (NT4 vs RH6.2) на win32 сразу виден скачек в
TaskManager->Memory usage history. Т.е. память отобразилась в свопе.
На RH до обращения к памяти ничего не происходит.
Наверно различие в производительности связанно, в первую очередь, с
организацией подкачки страниц.
2 Ogr, да я согласен, что примитивное копирование блоков памяти
туда-сюда прикладного смысла не имеет (разогрев камня и димов не в
счет). Но в любой прикладной задаче найдется кусок копирования
памяти. Бухгалтеры в таких случаях говорят "Курица по зернышку клюет".
А вот еще одна фича, которую обнаружил мой товарищ: Заворачиваем в dll(win32) и so(linux) функцию void usescanf(size_t count) { char str[] = "01"; int n; for( size_t i = 0; i < count; i++ ) { sscanf(str, "%d", &n ); } //end for } и вызываем из dll | so | exe | elf. Идея в том, что sscanf лежит в прикладной, но не системной dll(so). На win32 ощущается очень сильное замедление по сравнению с linux. Если скомпилить статически, то скорость практически одинакова. Заметно только при многокраных вызовах. Т.е вызовы в win32 dll->dll->dll имеют значительные накладные расходы (очевидно LoadLibrary|FreeLibrary). Можно, конечно, принудительно загрузить dll и удерживать ее в адресном пространстве, но это нужно делать ручками.
Навел на мысль. Посмотрел я исходничек внимательней. Дело может быть в том, что вынь элементарно выделяет память медленнее, а копирование здесь не причем. Проверить это просто: викинуть из исходника копирование, оставить выделение памяти и сравнить опять. Проверю сегодня же.
2 SeRGi (*) (2001-06-26 11:01:12.0)
Не факт. Модель защищенных дескрипторов на все-все-все и возможности
аудита (считай стабов) на использование делает NT более тяжелым в
любой операции получения и первого обращения к любому ресурсу.
Когда Irsi спрашивал о поднятых сервисах, он промолчал про включенный
расширенный аудит на память, а это тяжелые операции.
Ну, блин, вообще...
Паренёк, мой тебе благородный совет: RTFM, RTFM и ещё раз RTFM!!!
Ну ладно, "на пальцах" объясню:
LILO записывается "по умолчанию" в область диска, называемую MBR (Master Boot Record) и, фактически, просто устанавливает на выбранный юзером раздел диска флаг "active", а потом передаёт управление BIOS'у назад.
Ну так вот: чтобы избавиться от LILO, тебе надо перезаписать MBR. Самый просто способ - выполнить вышеприведенные действия.
2 anonymous (*) (2001-06-26 11:28:22.0)
1) Грузись с сидюка. NT сам перетрет mbr
2) Читай маны (rfc, readme, howto, msdn etc)
3) Dos потому что тебе так проще.
2 R00T (*) (2001-06-26 11:31:59.0)
Пожалел бы инвалида. Он даже "спасибо" сказать не умеет.
По моему NT и W2k mbr не затирают и процедуру, описанную ROOT, при установке NT после Linux надо выполнять обязательно. W98 mbr переписывает и проблем с lilo в этом случае не будет.
Да, кстати, (этого я точно не знаю - без шуток) как поставить NT на раздел диска больше 2047 Mb? W2k ставиться нормально на любой раздел, но мне надо NT. To ROOT and BlackRabit: если кого обидел, прошу великодушно извинить: надоели пузомерки, вот и решил дурацкими вопросами флейм в другую сторону повернуть, но видимо неуклюже. Еще раз извините.
Проблема вся в том, что NT4 поддерживает "большие" диски с сервиспака 3 или 4 (не помню точно). Берешь последний сервис пак. Оттуда надо достать файлы ntldr, ntdetect и файлы, относящиеся к файловой системе (fastfat.sys, ntfs.sys). Extract'ом умеешь пользоваться? Тогда достанешь!
Патчишь дистриб. Всё! Пользуйся. Только патч потом всё равно ставить надо ;-(
2Anonimous: Пузомерки - мерило, отражающие направленность компании. Раз в IBM появились такие тесты, значит работа с Linux там идёт не на словах, но на деле. Пусть только своим делом занимаются ... (=не трогают ядро и маркетинг ;-) Так что о чем-то они, да говорят.
Дело явно не в том, что по другому выделяется память. Я сейчас сижу и переписываю тестовую программу - пытаюсь понять, что здесь не так. Уже сделал следующее:
1) расположил вызовы функций измерения времени вплотную к операциям копирования;
2) переписал их, используя инструкцию проца rdtsc ( для пущей совместимости с Линуксом );
3) заменил распределение памяти на вызовы VirtualAlloc/VirtualLock, чтобы не происходило page fault'ов во время выполнения;
4) вставил в Виндовую программу кусок asm кода для копирования, сгенерированного gcc/Linux;
Результат нулевой - расклад в Windows в точности такой же, как до начала экспериментов.
Сейчас еще перегружусь в Linux и попробую там. Бред какой-то ...
2Hamster: Так может вынь сразу при запросе памяти возвращет управление программе?
Я поступил иначе: 1. Закоментировал switch в главном цикле, отвечающий за копирование. Результат: скороть увеличилась прилично, но колеблется сильно! 2. Тут я увидел, что цикл проводится всего 4 раза. Увеличил до 200. Постабильней стало и скорость близка к исходной. > memxfer5b -p -f -s 16m 8 200 0 Результат: скорость выше, чем до начала теста (выделение+копирование), но не на много (15-20%). Где правда?
ЗЫ. Мне тут знакомый сказал слудующее: Винда, мол, (для безопасности) обнуляет все выделенную область аж два раза. Шутник! Ха-ха. На требования сертификата С3 ссылается. Может кто аргументированно по этой теме просвятить?
>ЗЫ. Мне тут знакомый сказал слудующее: Винда, мол, (для безопасности) обнуляет все выделенную область аж два раза. Шутник! Ха-ха. На требования сертификата С3 ссылается. Может кто аргументированно по этой теме просвятить?
Есть смысл обнулять память, что бы другой процесс получивший опять же этот кусок памяти не получил доступ к каким нибудь ненужным ему данным. Насчет 2 раза- тут я пас.
Насчет NT. Поставить можно на 4 гб, потом PartitionMagic расширить. Но это под NTFS. Да и не делай системный диск более 7.4 Гб (c winnt директорией). Будут 'глюки'. Лучше 2.
А все дело в размере блока :) http://irunslowly.tripod.com/memtest/memblck.htm при копировании до 16к, W2K работает быстрее чем линукс. Потом они идут примерно равно. Не случайно был выбран размер в 16м...
Да кстати, весь этот тест является весьма странным, т.к. для расчета времени применяются системные часы, а не вызов вроде GetProcessTimes, который показывает сколько сама программа заняла времени, что весьма существенно во многозадачных системах.
P.S. И почему-то меня не удивляет такой подход линуксоида...
Для расчета времени применяются системные часы по той простой причине, что ( как ты сам можешь убедиться ) при выполнении теста процессор 99% времени проводит в самой программе. Мы же не измеряем производительность системы в условиях жестокой многозадачности, так зачем извращаться и придумывать навороты ( GetProcessTimes ), которые даже на результате не отразятся.
И насчет твоего теста. Pentium-III 933 MHz, PC133 SDRAM, Windows 2000 Professional, Linux 2.4.4.
Memory block test './a.out' under Linux
Buffer size: 16777216
2McMCC: "И какой именно? Я вообщем-то стараюсь быть объективным...
Может зря?"
Я кстати о Вас куда лучшего мнения, чем Вы думаете. Эта фраза относилась к автору исходной программы, который меряет скорость выполнения не самой программы, а системы в целом.
2Hamster: У Вас нет желания поигратся в настройках BIOS в плане изменения харакетристик доступа к памяти?
2 McMCC: программа компилилась командой gcc -O2 memblck.cpp. Компилятор gcc 2.95.2, а в Виндах MSVC++ SP5 w/processor pak.
2 Ogr: а там нет таких настроек :((
2 Hamster: Выложи свой ексешник куда-нибудь, а то мой друган точно компилил
без w/processor pak. Просто стало интересно проверить на вшивость cygwin....
2Hamster: Я в своем тоже не видел ни каких настроект пока не заглянул в Advanced Chip settings... А когда увидел, то после пары попыток изначальный тест стал выдавать результаты более чем в два реза лучше, вот только на той машине у меня линукса нет :( не могу сказать как это бы отразилось на нем.
2 McMCC: выложу через пару часов ( сейчас достучаться до chat.ru не могу ).
2 Ogr: тут этих настроек вообще в принципе нет. Не приходилось встречаться с материнками от Intel'а? Тут вообще все настройки, какие можно, убраны. Нет ни установок памяти, ни частоты процессора.