Le comentaba a JJ que las versiones del algoritmo que tenéis en C y Java usan como representación estructuras de datos mutables, por lo que al hacer la mutación, la versión previa del individuo ya no está disponible.
En Scala, tanto Vector como String son persistentes, por lo que se conserva el individuo antiguo tras mutarlo. Esto es lo habitual en lenguajes funcionales y puede ser adecuado si interesase mantener al individuo antiguo en la población. En C/Java habría que clonarlo antes de mutarlo, lo que tendría un coste temporal extra que habría que tener en cuenta, y por ello las comparaciones no son muy justas.
En Scala también se pueden usar estructuras no persistentes (como los Arrays), y en ese caso, el rendimiento debe ser semejante al de los arrays en C/Java. En mi máquina, los arrays de Scala son prácticamente igual de rápidos que los BitSets de Java que habéis utilizado y 11 veces más rápidos que los vectores persistentes.
He puesto los códigos y resultados obtenidos aquí:
https://github.com/ppgllrd/research-2015-ea-languages
Por último, creo que es conveniente repetir el experimento varias veces y sacar un promedio de tiempos (que es lo que yo he hecho), ya que los tiempos que obtengo son variables. Supongo que cosas como el recolector de basura alteran los resultados, sobre todo en las pruebas que llevan poco tiempo.
Le comentaba a JJ que las versiones del algoritmo que tenéis en C y Java usan como representación estructuras de datos mutables, por lo que al hacer la mutación, la versión previa del individuo ya no está disponible. En Scala, tanto Vector como String son persistentes, por lo que se conserva el individuo antiguo tras mutarlo. Esto es lo habitual en lenguajes funcionales y puede ser adecuado si interesase mantener al individuo antiguo en la población. En C/Java habría que clonarlo antes de mutarlo, lo que tendría un coste temporal extra que habría que tener en cuenta, y por ello las comparaciones no son muy justas. En Scala también se pueden usar estructuras no persistentes (como los Arrays), y en ese caso, el rendimiento debe ser semejante al de los arrays en C/Java. En mi máquina, los arrays de Scala son prácticamente igual de rápidos que los BitSets de Java que habéis utilizado y 11 veces más rápidos que los vectores persistentes. He puesto los códigos y resultados obtenidos aquí: https://github.com/ppgllrd/research-2015-ea-languages Por último, creo que es conveniente repetir el experimento varias veces y sacar un promedio de tiempos (que es lo que yo he hecho), ya que los tiempos que obtengo son variables. Supongo que cosas como el recolector de basura alteran los resultados, sobre todo en las pruebas que llevan poco tiempo.