• Как ускорить число потоков в секунду (сравнение потоков в elrang и c#)?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Следует различать потоки ОС и процессы в Erlang. Я не в курсе про C#, но насколько понимаю он делает потоки ОС (они очень тяжеловестные), чтобы сделать поток ОС надо сделать кучу дел.

    Процессы Erlang в противовес потокам очень легковесны, например в памяти занимают минимум 512 байт, быстро создаются, быстро убиваются. ОС не знает об этих процессах, всю работу по обслуживанию (одновременному выполнению на доступных ядрах) берет на себя Erlang.

    В ОС вы можете сделать ограниченное кол-во потоков, до 5000.
    В Erlang вы можете множить процессы как вам вздумается, главное чтобы памяти хватило. Порядок числа 100000-1000000.

    P.S. Добавьте тег Erlang.
    Ответ написан
    2 комментария
  • Как на erlang получить страницу сайта и записать в html файл?

    begemot_sun
    @begemot_sun
    Программист в душе.
    1. www.erlang.org/doc/man/httpc.html , www.erlang.org/doc/man/file.html#write_file-2
    2. timer:tc ( www.erlang.org/doc/man/timer.html#tc-1 ) конкретно в вашем случае:
    timer:tc(httpc, request, [ список аргументов ] )
    3. httpc:request отдает данные в таком формате:
    {status_line(), headers(), Body} - соответственно вы должны сматчить:
    {Status, Header, Body} = httpc:request(....),
    Размер Body:
    size(Body) - если вы работаете c binary(),
    length(Body) - если вы работаете со списком
    P.S. Учтите также п.2.

    Учите язык, читайте мануалы. Рабочий код писать вам никто не будет.
    Ответ написан
  • Как на erlang прочитать file.txt в массив, а потом записать массив в файл?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Прочитать примерно так:
    read_file_by_lines(Name, Mode, Array) ->
        {ok, Device} = file:open(Name, Mode),
        read_each_line(Device, []).
    
    read_each_line(Device, Accum) ->
        case io:get_line(Device, "") of
            eof  -> file:close(Device), array:from_list(lists:reverse(Accum));
            Line -> read_each_line(Device, [Line | Accum])
        end.

    Записать можно так:
    write_file_by_lines(Name, Mode, Array) ->
        {ok, Device} = file:open(Name, Mode),
        lists:foreach(
            fun(Line) -> io:write(Device, Line)
            end, 
            array:to_list(Array)),
         file:close(Device).
    Ответ написан
  • Как в c# выбирать информацию между html тегами?

    @Scrypto
    @">([a-z, ,0-9]*)<"
    Вот такой регуляркой попробуй.
    А вот сайт, чтобы составлять регулярные выражения www.regexr.com
    Ответ написан
    Комментировать
  • Как ускорить число потоков в секунду (сравнение потоков в elrang и c#)?

    slaykovsky
    @slaykovsky
    Если не считают эти потоки сложную математику - Эрланг выигрывает 100%. Даже обсуждать не надо.
    Ответ написан
    1 комментарий
  • Как сделать 200 update c#/mssql ещё быстрее (с#/mssql) ?

    @Sumor
    Для того, чтобы оценить где можно улучшить нужно в первую очередь посмотреть планы выполнения update и времена в профайлере SQL-сервера.
    1. Каждый индекс отнимает время на своё обновление. Возможно можно уменьшить количество индексов. Иногда выгодней их удалять и заводить заново после операций обновления. Тоже касается вычислимых полей, значения которых хранятся в таблице. Если переделать ключ таблицы в кластерный индекс, то это может улучшить время поиска и обновления записей.
    2. Тригеры. Их можно также отключить перед выполнением пакета и включить после выполнения.
    3. Уменьшить количество операций Update путём их объединения по каким-то признакам. Уменьшить количество обновлений в одной транзации.
    4. Если позволяет структура базы данных, то возможно быстрее будет работать связка delete/insert. В этом случае можно включить режим Bulk Insert, который пишет данные сразу в таблицы минуя лог транзакций.
    5. Модель восстановления — simple, full или bulk logged. Возможно в вашем случае модель full даст выигрыш в обновлении данных, но вы можете потерять в месте на жёстком диске и времени сохранения базы данных.
    6. Физическое расположение контейнеров. Можно физически разнести таблицы, индексы и лог на три разных диска - тогда могут улучшиться временные показатели.
    7. Использование секционированных таблиц и индексов. Возможно, если обновление происходит только в определённой части огромной таблицы, например, только в записях последнего года, то имеет смысл разбить её на секции.

    В любом случае нужно исследовать каждую задачу оптимизации индивидуально. Нужно попробовать исключить каждый фактор и замерить время без него. Например, временно удалить все индексы в таблице и запустить пакет обновления.
    Ответ написан
    Комментировать
  • Что, кроме потоков, есть в c#?

    @Sumor
    Вопрос скорости выполнения зависит слишком от многих факторов. В первую очередь от процедуры, которую вы хотите исполнять в потоке. Можно запустить одновременно множество потоков, но они будут упираться в ограничения в других местах - например, есть ограничение на количество подключений по сети, к БД, к жёсткому диску, ну, и собственно, количество процессоров.
    Для исследовательских задач алгоритм улучшения примерно такой — сначала реализуете алгоритм, выполняющий поставленную задачу самым простым для реализации способом. Смотрите на времена выполнения, в частности можно и нужно использовать различные профайлеры, счётчики ресурсов и тп. Если после этого времена не устраивают - смотрите где происходят наибольшие потери — эти места и нужно править в первую очередь.
    Повторюсь — улучшать нужно не то, что кажется исходя из каких-то там теоретических соображений, а то что реально показывает профайлер или трассировка выполнения.
    Распределение вычислений по потокам может дать выигрыш в случае многопроцессорных систем (а может и не дать). При этом надо учитывать, что:
    1. Потоки нужно создавать. Если расчётная функция выполняется сопоставимо со временем создания потока — нет смысла создавать поток.
    2. Потоками нужно управлять. Им нужно передавать исходные данные, а также получать результаты. Потоки могут конкурировать и блокировать друг друга за ресурсы приложения, очереди с исходными данными или за способность записать результат.
    3. Потоки могут быть независимыми или реализован конвейер. Во втором случае нужно правильно и согласовано организовать передачу данных между потоками — иначе все преимущества конвейерных вычислений уйдут в инфраструктуру обмена.

    Можно реализовать следующим способом:
    Запускается настраиваемое число потоков, которые в цикле берут данные из очереди типа ConcurrentQueue, обрабатывают их и результат кладут в кучу ConcurrentBag.
    Указанные коллекции — потокобезопасные, то есть возможна безопасная работа с ними одновременно из многих потоков.
    В моей задаче, для 4-х ядер оптимальное среднее время выполнения задачи с очередью 20000 элементов достигалось на 3-5 потоках.
    Ответ написан
    Комментировать
  • Как быстро на c# искать в строке массив строк?

    @AM5800
    Я не нашел точной информации, но, похоже, что string.IndexOf использует простоейший алгоритм поиска подстроки, который работает за O(nm). (n - длина исходной строки, m - длина образца).
    А поскольку у вас еще p образцов - получаем кубическую сложность.

    Самый простой вариант в данном случае - использовать другой алгоритм поиска подстроки. Вообще, алгоритмов поиска подстроки великое множество. Разные алгоритмы с одинаковой асимптотикой могут очень-по разному себя проявлять на различных данных. В любом случае, стоит попробовать разные варианты, чтобы определить какой алгоритм будет быстрее в вашем случае.

    Но, на первый взгляд мне кажется, что вам вполне подойдет алгоритм Ахо—Корасик
    Ответ написан
    8 комментариев
  • Как правильно сделать json в c#?

    morozovdenis
    @morozovdenis
    var v = new
    {
        token = token, 
        method = "abc", 
        param = new Dictionary< String, List<String> >() { { "data", new List<String>() { "nokia" } } },
        locale = "ru"
    };
    
    json = jss.Serialize( v );
    Ответ написан
    2 комментария