Всем привет!
Начало тут:
http://www.rsdn.ru/Forum/Message.aspx?mid=2385218Автор: SergH
Дата: 27.02.07
Продолжение — да, есть результаты, местами даже положительные
Тест:
(define func (lambda (x)
(if (= x 0)
1
(* x (func (- x 1)))
)
))
(map func 1000 1000 1000)
32-х разрядная Windows XP, 2 процессора Intel EM64 (данные примерные, по памяти):
* стандартный аллокатор, 0 потоков — 16.6 секунд
* стандартный аллокатор, 3 потока — 10.8 секунд
* быстрый аллокатор, 0 потоков — 4.2 секунды
* быстрый аллокатор, 3 потока — 3.5 секунд
Windows XP, Intel Core 2 Duo:
* стандартный аллокатор, 0 потоков — 8.9 секунд
* стандартный аллокатор, 2 потока — 9.5 секунд
* стандартный аллокатор, 3 потока — 9.6 секунд
* быстрый аллокатор, 0 потоков — 3 секунды
* быстрый аллокатор, 2 потока — 2.3 секунды
* быстрый аллокатор, 3 потока — 2.3 секунды
Mac OS X, Intel Core 2 Duo (вот чОртова операционная система! на 1000 программа падает, проверяли на 700, кроме того,
с быстрым алокатором тоже падает. И всю положительную статистику портит... Не зря их символ — надкусанное яблоко):
* стандартный аллокатор, 0 потоков — 3.827 секунд
* стандартный аллокатор, 3 потока — 9.272 секунд
Debian Linux (наверное, 64 разряда) 2 процессора Intel EM64:
* Лог для стандартного аллокатора:
/home/users/sergh/code/bin$ time ./executer out.sch
(inf inf inf)
time: 12746 milliseconds
real 0m12.750s
user 0m12.645s
sys 0m0.096s
/home/users/sergh/code/bin$ time ./executer out.sch 1
(inf inf inf)
time: 12460 milliseconds
real 0m12.464s
user 0m17.893s
sys 0m1.944s
/home/users/sergh/code/bin$ time ./executer out.sch 2
(inf inf inf)
time: 13268 milliseconds
real 0m13.271s
user 0m28.370s
sys 0m5.916s
/home/users/sergh/code/bin$ time ./executer out.sch 3
(inf inf inf)
time: 15178 milliseconds
real 0m15.182s
user 0m41.039s
sys 0m16.873s
/home/users/sergh/code/bin$ time ./executer out.sch
(inf inf inf)
time: 12603 milliseconds
real 0m12.605s
user 0m12.569s
sys 0m0.004s
/home/users/sergh/code/bin$ time ./executer out.sch 1
(inf inf inf)
time: 12686 milliseconds
real 0m12.689s
user 0m17.657s
sys 0m2.704s
/home/users/sergh/code/bin$ time ./executer out.sch 1
(inf inf inf)
time: 12442 milliseconds
real 0m12.446s
user 0m18.081s
sys 0m1.692s
* Лог для быстрого аллокатора:
/home/users/sergh/code/bin$ time ./executerfa out.sch
(inf inf inf)
time: 10979 milliseconds
real 0m11.065s
user 0m10.477s
sys 0m0.588s
/home/users/sergh/code/bin$ time ./executerfa out.sch 1
(inf inf inf)
time: 10728 milliseconds
real 0m10.803s
user 0m14.485s
sys 0m2.488s
/home/users/sergh/code/bin$ time ./executerfa out.sch 2
(inf inf inf)
time: 12616 milliseconds
real 0m12.692s
user 0m26.938s
sys 0m8.437s
/home/users/sergh/code/bin$ time ./executerfa out.sch 3
(inf inf inf)
time: 12929 milliseconds
real 0m13.005s
user 0m32.134s
sys 0m16.817s
/home/users/sergh/code/bin$ time ./executerfa out.sch
(inf inf inf)
time: 10944 milliseconds
real 0m11.017s
user 0m10.373s
sys 0m0.644s
/home/users/sergh/code/bin$ time ./executerfa out.sch 1
(inf inf inf)
time: 10628 milliseconds
real 0m10.704s
user 0m14.389s
sys 0m2.584s
/home/users/sergh/code/bin$ time ./executerfa out.sch
(inf inf inf)
time: 10956 milliseconds
real 0m11.029s
user 0m10.505s
sys 0m0.524s
/home/users/sergh/code/bin$ time ./executerfa out.sch 1
(inf inf inf)
time: 10595 milliseconds
real 0m10.671s
user 0m14.709s
sys 0m2.188s
/home/users/sergh/code/bin$ time ./executerfa out.sch 2
(inf inf inf)
time: 12517 milliseconds
real 0m12.593s
user 0m26.430s
sys 0m8.765s
В общем, есть небольшой, но стабильный выигрыш при использовании 1-го дополнительного потока и быстрого аллокатора. Ещё,
обратите внимание на соотношение врёмён real/usr/sys — в случае использования двух или трёх дополнительный потоков,
sys очень вырастает, за счёт этого всё работает неэффективно. Правда, usr тоже вырастает, и не совсем понятно,
куда же оно уходит

Но это и на остальных системах непонятно
Windows XP, Celeron 2Gz, 512Mb памяти. Это моя машинка

Процессор один. Тем не менее, при использовании
быстрого аллокатора, примерно через три секунды оперативная память кончается и начинается свопинг. Task Manager
показывает, что загрузка процессора падает с 100% до 10%, а потом и до 2-3%. В этой ситуации многопоточная версия
работает быстрее даже на однопроцессорной машине — пока один поток ждёт окончания свопинга, второй может работать.
Эффект не очень большой, но заметный — примероно -20%. Правда, стандартный аллокатор не приводит к свопингу и
за счёт этого отрабатывает почти в два раза быстрее. И, конечно, без каких-либо преимуществ для многопоточной версии.
Более полный отчёт:
http://sergh.pisem.net/diplom.html#2 — история + результаты
Там же исходники.