Создал приложение для загрузки файлов в Очень многопоточном режиме (с поддержкой более 10 потоков), на медленном интернете (до 2мбит) прирост скорости в 2-3 раза по сравнению с аналогами (download master и тп), но на хорошем интернете (over 50мбит) скорость медленнее аналогов почти в 2 раза. С чем связано не могу понять, загрузка ЦП минимальная в любом случае, поэтому на алгоритм грешить не могу пока. Может у кого есть идеи почему может так различаться скорость ?
p.s. на скорость дисковой подсистемы грешить тоже нельзя, т.к. файл грузится полностью в оперативную память и "сбрасывается" на диск уже после завершения загрузки, что занимает пару секунд всего.
Не зная архитектуры вашего приложения вообще сложно судить... Пара идей:
1. Блокировки, межпроцессное взаимодействие.
2. Рандомное чтение на отправителе.
1. Блокировки маловероятны, т.к. общих объектов как таковых нет, загрузка каждого фрагмента идет внутри отдельных объектов, запуск каждого потока проходит через Parallel taskи, единственное используется система eventов для передачи статусов, я пока только начал изучать eventы не уверен блокирует ли вызов события поток?
2. Маловероятно, т.к. download master с которым я сравнивал тоже использует многопоточность (но всего 5 потоков).
Обдумал немного ваш ответ, возможно 1 все таки имеет смысл, на создание потока нужно время, когда потоки создаются часто (чего другие менеджеры не делают) может суммарно уйти больше времени, поэкспериментирую с длиной потока, спасибо за совет.
Не совсем так, как отметил Артем, это работает только с нормальными провайдерами, в моем же случае провайдер жестко режит скорость на каждом потоке до 32кбит, и даже если у тебя 100500 мбит тариф скорость в DM будет максимум 32*8 кбит, но если качать мелкими частями (по 300кбайт скажем) то провайдер этот факт пропускает (шейпер не срабатывает) и скорость не режется, таким образом скорость отдельного потока вырастает до 300-400кбит, если потоков много скорость возрастает до максимума, который вытягивает провайдер. Отсюда и выходит 2-3 раза, цифры взяты тупо секундомером, несколько замеров на загрузку одного и того же файла.