martes, agosto 26, 2008

Otra sorpresa

Pues si, siguiendo el consejo de tayoken he cogido el programa de los primos en C++ y lo he pasado a VB.NET.

Este proyecto Visual Basic se trata igual que la versión de C++ de una aplicación de consola.

La ejecución para el límite de 100 millones ha tardado en VB.NET 10 minutos 21 segundos. Una gran sorpresa ya que en Visual C++ con las opciones de compilación por defecto había tardado 14 minutos 26 segundos.

No soy el primero que se sorprende. Por ejemplo aquí les ha pasado lo mismo.

Después de unos pocos ajustes de configuración en las propiedades del proyecto he conseguido reducir la ejecución a 10 minutos 46 segundos pero no es suficiente.

Para empezar, se ha comprobador que no están habilitadas las extensiones administradas. No es un proyecto CLR (opción /clr del compilador), o sea que no está orientado al Common Language Runtime.

Las opciones que he tocado son:

Propiedades de configuración, General, Optimización de todo el programa: SI
Propiedades de configuración, C/C++, Optimización: Máxima velocidad
Propiedades de configuración, C/C++, Optimizaciones globales: SI
Propiedades de configuración, C/C++, tamaño o velocidad: ninguno (no se puede seleccionar velocidad si hemos marcado antes Optimización de todo el programa).
Propiedades de configuración, C/C++, Optimizar para procesador: Pentium4 y superior.
Propiedades de configuración, C/C++, Generación de código: Valor predeterminado (las otras opciones no son compatibles con la opción de "Maximizar velocidad".
Propiedades de configuración, C/C++, General, Formato de la información de depuración: Deshabilitado (no es compatible con la opción /gl).

Mañana intentaremos que Visual C++ gane por fin a Visual Basic.NET

Saludos.


Imports System.io
Module Module1

Sub Main()
Dim horaComienzo As Date
Dim fichero As New StreamWriter("primos.txt")
horaComienzo = Now
Dim candidato As Integer = 5
Dim pruebaDivisor As Integer
Dim esPrimo As Boolean
Dim numPrimos As Integer = 2
Dim limiteSuperior As Integer
Console.Write("Introduce el limite al que llegar: ")
limiteSuperior = Console.ReadLine
fichero.WriteLine("2")
fichero.WriteLine("3")
While candidato <= limiteSuperior
pruebaDivisor = 5
esPrimo = True
While pruebaDivisor * pruebaDivisor <= candidato
If candidato Mod pruebaDivisor = 0 Then
esPrimo = False
Exit While
End If
pruebaDivisor += 2
End While
If esPrimo Then
fichero.WriteLine(candidato)
End If
candidato += 2
pruebaDivisor = 5
esPrimo = True
While (pruebaDivisor * pruebaDivisor <= candidato)
If (candidato Mod pruebaDivisor) = 0 Then
esPrimo = False
Exit While
End If
pruebaDivisor += 2
End While
If esPrimo Then
fichero.WriteLine(candidato)
End If
candidato += 4
End While
fichero.Write("Hora de comienzo:")
fichero.WriteLine(horaComienzo)
fichero.WriteLine("Hora de final:")
fichero.WriteLine(Now)
fichero.Close()
Console.Write("Fin")
Console.Read()
End Sub
End Module

5 comentarios:

Anónimo dijo...

Mola ^_^

Aitor Iriarte dijo...

A mi también me parece fenomenal que VB.NET sea en muchos casos más rápido que VC++. Así menos esfuerzo :-)

He encontrado una web interesante donde hicieron unas pruebas de rendimiento. Creo que es la explicación de lo ocurrido.

Escribo ahora el post.

Saludos.

Anónimo dijo...

Últimamente le doy más a C#, lo has probado? está muy bien, tan fácil de manejar como el VB y para los que aprendimos con C nos resulta más atractivo...

Aitor Iriarte dijo...

Llegué a comprar un libro de C# pero luego no he hecho nada.

Me da un poco de pena, como si traicionara a Visual Basic por algo que está más de moda :-(

Yo empecé por mi cuenta con gwbasic, luego en el Instituto en clase de informática se utilizaba Pascal.

En la carrera el primer año la asignatura de programación era con Pascal y el segundo año C.

Vamos que no aprendí a programar con C y tal vez por eso no le tengo mucho apego.

De todas formas hay que probarlo a ver que pasa. El siguiente post el mismo programa con C# ;-)

Saludos.

Anónimo dijo...

Bueno, como yo entonces :P primero con el spectrum :D luego pascal y luego C y java... y ahora c#, delphi, COBOL, vb, js, etc, etc. Incluso en el maldito y asqueroso Lotus Notes... bueno, ya sabes... lo que se ponga por delante, que total, al final es todo lo mismo :) Pero al que más cariño le tengo es a C, es con el que aprendí algoritmos más complejos, me gusta mucho... C# no creas que pasará de moda tan rápido, no me extrañaría que dejasen de incluir VB en futuras ediciones de VS y se centrasen únicamente en c# (además le da mil patadas al java, pero no se lo digas a nadie que no quiero que me crujan)

Ah, se me olvidaba, creo que había algo para compilar o registrar una aplicación para que se ejecute en modo nativo, pero no me hagas mucho caso que ahora te lo digo de memoria...

Saludos!