Обдумал немного ваш ответ, возможно 1 все таки имеет смысл, на создание потока нужно время, когда потоки создаются часто (чего другие менеджеры не делают) может суммарно уйти больше времени, поэкспериментирую с длиной потока, спасибо за совет.
Не совсем так, как отметил Артем, это работает только с нормальными провайдерами, в моем же случае провайдер жестко режит скорость на каждом потоке до 32кбит, и даже если у тебя 100500 мбит тариф скорость в DM будет максимум 32*8 кбит, но если качать мелкими частями (по 300кбайт скажем) то провайдер этот факт пропускает (шейпер не срабатывает) и скорость не режется, таким образом скорость отдельного потока вырастает до 300-400кбит, если потоков много скорость возрастает до максимума, который вытягивает провайдер. Отсюда и выходит 2-3 раза, цифры взяты тупо секундомером, несколько замеров на загрузку одного и того же файла.
1. Блокировки маловероятны, т.к. общих объектов как таковых нет, загрузка каждого фрагмента идет внутри отдельных объектов, запуск каждого потока проходит через Parallel taskи, единственное используется система eventов для передачи статусов, я пока только начал изучать eventы не уверен блокирует ли вызов события поток?
2. Маловероятно, т.к. download master с которым я сравнивал тоже использует многопоточность (но всего 5 потоков).
akass: так и есть та что в примере сложилась АГЦЦГГУААЦЦ, но как я и говорил задача имеет не единственное решение, поэтому их 2, какое из них "правельней" выбрать нельзя, они оба правильные в контексте задачи. Об ограничении я и говорил, когда сказал что она не полна)
По поводу графа фактически это он и есть ("чтобы понять рекурсию нужно понять рекурсию"), только вместо таскания рекурсивно информации о связях в графе переносится уже склеенная исходная последовательность.
По поводу "Попробовал дать на вход куски из которых вручную можно сложить , выдает "не вышло", можно эти куски глянуть, по идее не должно получиться так что "не вышло", возможно гдето затисались пробелы лишние или чтото в этом духе.
если эти ошибки исправить уже будет какой либо результат, в текущем виде код даже одной цепочки не построит т.к. return ConcatRecursive("", genoms);
в "" нет подстроки ни с каким геном
еще:
+ ""; - это что?
if (gen.EndsWith(genoms[j].Substring(0, 3)))
{
newgen = string.Concat(gen, genoms[j].Substring(3)); - это лучше вынести в отдельную функцию, чтобы упростить код
Neuroware: ошибка есть в этой функции string GetConcatGenom(List genoms) тут должно быть
для каждого фрагмента (мы ведь не знаем какой из них первый) вызываем рекурсивную функцию с параметрами
то есть нужно перебрать все из списка genoms и для каждого вызвать функцию ConcatRecursive где первый параметр это выбранный геном (1штук) и второй параметр это genoms без выбранного гена (новый список)
akass: вот уж точно нетривиальная задача) в целом все правильно, но передавать исходный geni будет неудобно, я бы создал из него (без элемента gen конечно - он уже есть в gen) новый список типа List и потом из него удалял элементы - RemoveAt, а в целом все правильно.
Еще тут нет того что происходит в самой функции Assembly.