Erlang file IO и асинхронные потоки - PullRequest
1 голос
/ 15 января 2012

Я читал документацию erlang о файле io и видел это:

В операционных системах с поддержкой потоков можно разрешить выполнение файловых операций в потокахсвои собственные, что позволяет другим процессам Erlang продолжать выполнение параллельно с файловыми операциями.См. Флаг командной строки + A в erl (1).

, поэтому я ожидал, что время, необходимое для операции ввода-вывода, уменьшится, если я добавлю асинхронные потоки.
вместо этого, когдаЯ попытался запустить erl +A1, erl +A6 или erl +A12 (на 6-ядерном компьютере), время, необходимое для записи в файл, увеличилось в 5-10 раз.

Я использовал timer:tc/3 для измерения времении я использовал io:write/2, file:write/2 (преобразовал термин в двоичный файл) и file:write/2 при открытии файла с флагом raw.термин был размером ~ 170kb и был написан 1000 раз.Использовал R14B04 (но я получил аналогичные результаты и с R15A).

Я делаю что-то не так, либо в использовании асинхронного ввода-вывода, либо в измерении его эффективности?пропустив термин (возможно, из-за того, что его размер невелик) превышает вес полученного ускорения?

(не такой элегантный: $) код:

-module(test).
-compile(export_all).

test()->
    {ok,F}=file:open(foo,[raw,write]),          % or just [write]
    {T,ok}=timer:tc(test,t,[F,1000]),
    file:close(F),
    T.

t(_,0)->ok;
t(F,A)->
    B=dsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdf,

    file:write(F,
term_to_binary([B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B])),
%or io:write(F,[B,..])
    t(F,A-1).

Я заинтересован в минимизации ввода-выводанакладные расходы (в основном просто вывод), потому что я хочу записать некоторые данные на диск во время профилирования;вот почему отправка данных в какой-то другой процесс, который будет писать, бесполезна (если только я не смогу каким-то образом посвятить ядро ​​процессу).Пока что лучший способ - открыть необработанный файл, собрать данные и затем записать их;любые советы будут оценены:)

1 Ответ

4 голосов
/ 15 января 2012

Когда я запускаю тест, я получаю примерно одинаковую производительность с + A1 и без.Это на OS X Snow Leopard с двухъядерным процессором.Это также то, что я ожидаю, используя асинхронные потоки.

Добавление асинхронных потоков только добавляет дополнительные потоки для выполнения операций ввода-вывода и, таким образом, повышает производительность параллельных заданий ввода-вывода, а также позволяет более быстрому запуску обычных процессов erlang, поскольку потоки процессов не заняты выполнением заданий ввода-вывода.

Если вы запускаете тест со многими параллельными заданиями, вы должны увидеть выигрыш в производительности от использования асинхронных потоков.

Хотя почему вы видите снижение производительности в ваших последовательных тестах, остается загадкой.

...