понедельник, 15 марта 2010 г.

Безобразие!

Мать моя женщина! Он (автор gencgc в SBCL) юзает munmap+mmap для очистки страниц! Очистка 4096 байт с помощью топорного rep stosq "весит" 1900-2000 тактов (можно быстрее), а они делегируют эту задачу ядру, которое мало того, что два сисколла обрабатывает, ворошит vma, так ещё и делает ведь то же самое: чистит страницу.

Замер скорости показывает:

rep stosq:    1911 ticks
munmap/mmap: 50631 ticks

25-кратная разница.

10 комментариев:

  1. Самое замечательное, что munmap/map может вернуть чистую страничку без очистки памяти. Т.е. ядро возьмёт пустую страницу и отдаст её SBCL'ю. Всё будет хорошо до тех пор, пока в системе не кончатся чистые странички, потом вдруг резко наступят тормоза.

    ОтветитьУдалить
  2. А на винде же вроде этого дела нет? Как они там с памятью работают?

    ОтветитьУдалить
  3. Да, посмотрел в msdn, аналоги есть, оказывается. Это для меня открытие. Почему-то всегда думал, что mmap и т.п. на винде нет.

    ОтветитьУдалить
  4. 2love5an: Ну мапинг файла даже в Minix есть, хотя насколько я помню реализован не честно. Но там вобщем простительно, если вспомнить, что микроядро.

    ОтветитьУдалить
  5. > Самое замечательное, что munmap/map может вернуть
    чистую страничку без очистки памяти. Т.е. ядро
    возьмёт пустую страницу и отдаст её SBCL'ю.
    Всё будет хорошо до тех пор, пока в системе не
    кончатся чистые странички, потом вдруг резко
    наступят тормоза.

    Но чистые странички в системе будут недолго после старта, правильно?

    Т.е. вопрос, становится ли решение когда SBCL сам чистит память неоптимальным и требует ли доработки, или можно спокойно игнорировать факт, что munmap/map иногда быстрее?

    ОтветитьУдалить
  6. Будьте бдительны! на non-x86 кроме memset может понадобиться сброс I-cache.

    ОтветитьУдалить
  7. to Anton Vodonosov:

    Да, когда-нибудь чистые странички кончатся, и трюк с mmap будет тормозить. Пока же они есть, munmap/mmap быстрее.

    to slyfox:

    А зачем кэш инструкций сбрасывать?

    ОтветитьУдалить
  8. > А зачем кэш инструкций сбрасывать?
    Ступил, наверное - не надо. Скорее всего sbcl его сам сбрасывает в фазе кодогенерации. Сорри.

    ОтветитьУдалить

Архив блога