fibras

Demo de Concurrencia en Pokémon

Este proyecto es una demostración comparativa de diferentes enfoques de concurrencia para realizar solicitudes HTTP concurrentes. Está diseñado para audiencias expertas en desarrollo de software que desean entender las diferencias de rendimiento entre varios lenguajes y modelos de concurrencia.

Descripción

El proyecto obtiene datos de 15 Pokémon de la PokeAPI_ de manera concurrente usando diferentes lenguajes de programación y técnicas de concurrencia. Cada implementación realiza las mismas 15 solicitudes HTTP y mide el tiempo total de ejecución.

.. _PokeAPI: https://pokeapi.co/

Implementaciones

🐘 PHP (Síncrono) Implementación base síncrona usando file_get_contents(). Sirve como línea base para comparar el rendimiento.

🐘 PHP (Fibers) Usa las fibers de PHP 8.1+ con un programador de eventos personalizado basado en stream_select() para manejar I/O asíncrona.

💎 Crystal (Fibers) Utiliza las fibers integradas de Crystal con canales para comunicación entre hilos ligeros.

🐹 Go (Goroutines) Emplea goroutines nativas de Go con sync.WaitGroup para sincronización.

🦀 Rust (Async/Await) Implementa async/await con el runtime Tokio para tareas asíncronas.

Requisitos

  • PHP 8.1+ con extensión fibers
  • Crystal_
  • Go_
  • Rust_ con Cargo
  • Conexión a internet (para acceder a PokeAPI)

.. _Crystal: https://crystal-lang.org/ .. _Go: https://golang.org/ .. _Rust: https://www.rust-lang.org/

Ejecución

Compilar y ejecutar el benchmark completo::

make

Esto compilará todos los lenguajes compilados (Crystal, Go, Rust) y ejecutará el benchmark mostrando una tabla comparativa de tiempos.

Para limpiar los artefactos de compilación::

make clean

Ejecución Individual

PHP Síncrono::

php php/sync-fetch_pokemon.php

PHP Fibers::

php php/fibers-fetch_pokemon.php

Crystal::

./crystal/fibers-fetch_pokemon

Go::

./go/fetch_pokemon

Rust::

./rust/target/release/fetch_pokemon

Cada programa acepta el argumento quiet para suprimir la salida por Pokémon::

php php/sync-fetch_pokemon.php quiet

Resultados Típicos

En una ejecución típica, los resultados muestran diferencias significativas de rendimiento entre los modelos de concurrencia:

  • PHP Síncrono: ~8000-9000 ms (línea base)
  • PHP Fibers: ~5000-6000 ms (mejora moderada)
  • Crystal Fibers: ~400-500 ms (alto rendimiento)
  • Go Goroutines: ~200-400 ms (muy rápido)
  • Rust Async/Await: ~500-700 ms (buen rendimiento)

Los resultados pueden variar según la conexión a internet y la carga del sistema.

Arquitectura

Cada implementación sigue el mismo patrón:

#. Iniciar temporización #. Lanzar 15 tareas concurrentes para obtener Pokémon #1 al #15 #. Esperar que todas las tareas se completen #. Calcular y mostrar el tiempo total

Los programas usan el modo "quiet" durante el benchmark para evitar interferencia de I/O en las mediciones.

Contribución

Este proyecto está diseñado como demostración educativa. Las contribuciones son bienvenidas, especialmente para agregar más lenguajes o mejorar las implementaciones existentes.

Licencia

Este proyecto es de dominio público. Úsalo como quieras para aprender sobre concurrencia en diferentes lenguajes de programación.

Repository

fibras

Owner
Statistic
  • 0
  • 0
  • 0
  • 0
  • 0
  • 6 days ago
  • September 23, 2025
License

Links
Synced at

Sun, 28 Sep 2025 18:04:55 GMT

Languages