- PVSM.RU - https://www.pvsm.ru -
Джофф Гарен (Geoff Garen) из компании Apple обнаружил вызов Sleep() [1] в спинлоке функции TCMalloc сборщика мусора WebKit.
-#if OS(WINDOWS)
- Sleep(2);
-#else
- struct timespec tm;
- tm.tv_sec = 0;
- tm.tv_nsec = 2000001;
- nanosleep(&tm, NULL);
-#endif
После удаления Sleep производительность сборщика в определённых условиях выросла в 3,7 раза. Это наглядный пример, как одна маленькая оптимизация способна и уменьшить размер кода, и одновременно в несколько раз повысить производительность.
На HN по этому поводу развернулась дискуссия [2]: мол, зачем там вообще был вызов Sleep(), если его использование в спинлоках считается дурным тоном.
В итоге обнаружился тот разработчик, который и внедрил вызов Sleep в WebKit. Он объяснил [3], что изначально эта кастомная функция для динамического выделения памяти TCMalloc разрабатывалась для серверов, и спинлок такого вида был там по определённой причине, но эта причина, наверное, не так актуальна для WebKit как браузерного движка.
Сам Джофф Гарен высказался в том же смысле, но в более наглядной форме [4]:
Изменение в коде WebKit сделано в мае 2012 года, так что последний Safari наверняка работает уже на оптимизированной версии.
Автор: alizar
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/webkit/14311
Ссылки в тексте:
[1] обнаружил вызов Sleep(): http://trac.webkit.org/changeset/117478
[2] дискуссия: http://news.ycombinator.com/item?id=4466699
[3] объяснил: http://news.ycombinator.com/item?id=4467781
[4] более наглядной форме: http://www.quickmeme.com/meme/3qqgwz/%3E/
Нажмите здесь для печати.