Почему нельзя один экземпляр ресурсоемкого кода не полностью загружает CPU?
Вне зависимости от сложности вычислений и количества потоков у меня не получается занять 100% CPU одним экземпляром программы. Зато, если запустить 2-3 экземпляра то CPU можно заставить работать на полную.
Вопрос: как передать программе полномочия использовать все ресурсы процессора на 100%?
Грузит ещё интернет (но там работа с апи, от силы 2% ширины канала ест) и файловую систему (10-20%). Поднять приоритет чего? У меня у всех потоков ThreadPriority.Highest;
@NoEscape Ну так пока она ждет ответа от сети или от винчестера она не может грузить CPU. Можно попробовать запустить потоков "с запасом" - в два раза больше чем ядер - тогда, возможно, на все 100 будет кушаться.
Тестировал с разным количеством потоков. При 10 и 150 результаты примерно одинаковые и по нагрузке сети и по CPU. Вы правы, в основном время ест выкачка html кода (без него скорость обработки- 20 млн функций\сек, с ним- ~3500 функций\сек). Однако, сеть почти не нагружается. А вот если запустить кучу экземпляров то можно подгрузить сеть до 10-20%.
Я так понял, нужно добиться результата, когда программе выдается приоритет на работу с сетью и доступ ко всей ширине канала.
А, и ещё: функция скачки хтмл кода в 99% случаев возвращает одну из ошибок (если возвратился код, а не огшибка, то мы добились результата). Соответственно, GetHTML находится в блоке try catch. Может можно как то игнорировать исключения при скачивании хтмл и в случае ошибки просто ничего не возвращать? Я слышал, try catch есть много ресурсов.
@NoEscape Важно еще и чтобы удаленный сервер, который вы мучаете, успевал генерировать Вам страницы для парсера - если он медленный (или провайдер режет скорость, или медленный роутер, или еще что-то), то вам не загрузить сеть на 100%. Смотреть на "загруженность" сети по диспетчеру задач весьма однобоко, как мне кажется.
Я не только по нему смотрю. Парадокс в том, что запуская в экземпляра каждый выдает около 3500 функций, включающих скачивания хтмл в секунду, из чего я сделал вывод что сервер справляется прекрасно, просто один экземпляр программы чего то не хочет работать в полную мощь (которую выдают 3 одновременно запущенных экземпляра).
Я не знаю, каким API и библиотекой вы пользуетесь - возможно оно искусственно ограничивает частоту запросов к одному и тому же серверу, но при использовании разных процессов это ограничение снимается, т.к. сложнее отследить использования.