а вот например начитавшись в выходные The Art of Concurrency решил давеча переделать несколько проверку процессов в wincheck. А именно - раскидать проверки каждого процесса (благо они практически параллельны по природе) на столько потоков, сколько на машине есть камней
Итоги такие:
+ 13 Kb исходников (главным образом самодельный диспетчер заданий). Cинхронизация - пришлось добавить ровно 3 critical_section
.exe прибавил 8Kb в размере (64битный 12Kb)
На 64битной машине с двумя камнями и кучей свободной памяти (чтобы cache managerу хватило места) ускорение практически линейно: на одном камне работает 8.2 секунд, на двух 4.6 (средние числа по результатам 5 запусков)
На 32битной машине с адово жрущими память thunderbird & firefox и тоже двумя камнями уже значительно хуже - 16 секунд против 10.8
Можно еще каждому потоку собственную кучу сделать, но мне лень и к тому же я думаю, что это даст копеечный совершенно выигрыш (потому что большие буфера используются повторно, а практически все мелкие рабочие я и так выделяю в стеке через alloca)
А вот например результаты работы на 8 камнях corei7 под w7 64bit:
1 поток - 48.2 секунды
2 - 22.9
3 - 17.2
4 - 14.9
5 - 12.9
6 - 11.8
7 - 11.3
8 - 11.0
Явно видно что более 5 одновременно работающих потоков уперлись в гонку за монопольный ресурс. И это наверняка не диск, потому что оно читает практически одни и те же файлы, которые должны себе спокойно лежать в cache manager
Update: результаты на 4х головом AMD Phenom X4 9850:
1 поток - 12.9 секунды
2 - 7.0
3 - 4.6
4 - 4.0
Комментариев нет:
Отправить комментарий