В тесте, который я создаю здесь, моя цель - создать парсер. Поэтому я построил концептуальное доказательство, которое считывает все сообщения из файла, и после нажатия всех их в память я создаю один процесс для разбора каждого сообщения. Пока все будет хорошо, и у меня есть хорошие результаты. Но я мог видеть, что erlang VM не использует всю мою мощность процессора (у меня есть четырехъядерный процессор), на самом деле он использует около 25% процента моего процессора при выполнении моего теста. Я провел встречный тест с использованием C++, который использует четыре потока и, очевидно, использует 100%, что дает лучший результат (я уважал ту же модель очереди erlang).Оптимизация производительности на процессах Erlang
Так что мне интересно, что могло бы «замедлить» мой тест erlang? Я знаю, что это не вопрос сериализации, поскольку я создаю один процесс за сообщение. Я думал, что, может быть, мое сообщение слишком маленькое (около 10 тыс. Каждый), и поэтому большая часть процессов не помогает достичь отличной производительности.
Некоторые факты о тесте:
106K сообщения На Эрл (25% использовали мощности процессора) - 204 мс На мой C тест ++ (100% мощности процессора используется) - 80 мс
Да разница не такая уж большая, но если есть больше власти, конечно, есть больше возможностей для улучшения, не так ли?
А, я сделал некоторые профилирования и не смог найти другой способ оптимизации, так как есть несколько вызовов функций, и большинство из них - преобразование объектов в объект.
Обновление:
Woooow! Следуя идее Хасана Сайеда, мне удалось достичь 35 мс против 80 с C++! Это круто!
Непосредственная мысли, знаете ли вы, сколько времени уходит на сканирование файла по сравнению с разбором сообщений. Сканирование по своей сути является последовательным, так что параллелизующий эффект процессов нереста может быть потерян. Это может объяснить, почему ядра не используются. – rvirding