Cuenta la frecuencia de las letras en textos mediante computación en paralelo.
El paralelismo consiste en hacer en paralelo cosas que también se pueden hacer de forma secuencial. Un ejemplo habitual es contar la frecuencia de letras. Utiliza el paralelismo para calcular la frecuencia total de cada letra en una lista de textos.
Hay varias formas de lograr paralelismo en C++. El ejecutor en línea de Exercism admite C++17, así que puedes usar las políticas de ejecución de la biblioteca de algoritmos. Otra opción es gestionar manualmente los hilos. Sin embargo, ten en cuenta que crear un hilo es bastante caro (usar un grupo de hilos ayudaría).
Cuando trabajes en local, puedes usar lo que quieras, por supuesto. Sin embargo, es muy probable que una solución que use bibliotecas no estándar no funcione con el ejecutor en línea de Exercism.
Cuando trabajes en local, puedes ejecutar un benchmark de forma opcional para hacerte una idea de la mejora de velocidad de las distintas implementaciones. Activar la opción de CMake EXERCISM_INCLUDE_BENCHMARK habilita el benchmark:
cmake -DEXERCISM_RUN_ALL_TESTS=1 -DEXERCISM_INCLUDE_BENCHMARK=1 .
La implementación de GCC de la biblioteca estándar de C++ (libstdc++) se basa en TBB. Si TBB no está disponible, se recurrirá a una versión secuencial, incluso cuando se solicite la ejecución en paralelo.
En Ubuntu, tienes que instalar el paquete libtbb-dev:
apt-get install libtbb-dev
En macOS, puedes usar Homebrew para instalar TBB:
brew install tbb
Clang libc++ tiene, desde la versión 17, compatibilidad experimental y parcial con los algoritmos paralelos. Para activarla, hay que indicar la opción de compilador -fexperimental-library.
Apple Clang 15 y versiones anteriores no admiten algoritmos paralelos.
En Linux y macOS te recomendamos usar GCC (junto con la libstdc++ predeterminada) para este ejercicio.
El MSVC de Microsoft admite algoritmos paralelos al menos desde VS 2017 15.7 sin necesidad de instalar ninguna biblioteca adicional.
Regístrate en Exercism para aprender y dominar C++ con 19 conceptos100 ejercicios y mentoría humana real, todo gratis.
Exploramos las diferencias entre concurrencia y paralelismo, viendo los distintos enfoques que adoptan lenguajes como JavaScript, Go, Elixir y Rust.