Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Xavelets en 28 Abril 2011, 05:53 am



Título: [Solucionado] ¿Realmente C++/Cli es superior en velocidad ambos .Net?
Publicado por: Xavelets en 28 Abril 2011, 05:53 am
Hola a todos!!!!

Les explico el porque de la duda.....

Soy un programador aficionado un tanto obsesivo que aprendió a programar en C hace mucho tiempo, y que lleva aprendiendo C# algunos meses (no lo domino, pero ya me defiendo con este lenguaje) ;D

Tengo en mente un proyecto en el cual pretendo procesar varios streams de audio "en tiempo real", por lo que me interesa de sobremanera el tema del rendimiento. :rolleyes:

De inicio entiendo perfectamente que el código nativo ya sea en lenguaje C, o C++ es la mejor opción para obtener el mejor rendimiento (aparte del uso de algoritmos eficientes y los compiladores utilizados), ya que a diferencia de .Net estos no tienen que pasar por el CLR etc. etc.....

Sin embargo me siento atraído a utilizar .Net debido a la gran cantidad de documentación y facilidades que provee esta plataforma (¿ya les dije que C# me gusto mucho?).

Aunque he leído que C++/Cli es superior en rendimiento que C#, también leí que los programas hechos con cualquiera de estos lenguajes se ejecutan en el CLR;  incluso pareciera que utilizan exactamente las mismas bibliotecas, y que lo único que cambia es la sintaxis para el uso de las distintas clases. Es aquí donde la ardilla en mi cerebro comienza a correr moviendo los engranajes y me lleva a pensar por lógica que no debe de haber una diferencia significativa de rendimiento entre la implementación de un algoritmo en lenguaje C++/Cli, y lenguaje C#.

¿Porque esta disertación sobre rendimiento de lenguajes en .Net y la inmortalidad del cangrejo?  Pues porque no quiero comenzar a codificar en C# (mi favorito) y darme cuenta que no me da el rendimiento necesario, o comenzar a escribir en C++/Cli (que no domino su sintaxis y estoy escasamente familiarizado), tardarme mas tiempo en el desarrollo, y lo que es peor, darme cuenta que tampoco tengo en rendimiento necesario  :xD :-[  .... no se que hacer jejejejeje!!

Es por eso que solicito su ayuda, sus experiencias y opiniones respecto a este tema.

Otra pregunta.....

¿Vale la pena intentar con .Net, o mejor me olvido y comienzo a aprender a hacer programas con la WinAPI aunque tarde años?....



Pd. 1 Nunca aprendí a programar interfaces de usuario en C, y en C# me resultó muy sencillo e intuitivo; y quiero que mi proyecto tenga GUI.

Pd. 2 Solo tengo a mi disposición herramientas de programación gratuitas, es decir VC++ Express 2008, SharpDevelop, Codeblocks, Windows 7 SDK, MinGW, etc....


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: neoncyber en 28 Abril 2011, 15:07 pm
Yo creo q si, pero tambien es mas rapido de c o c++, pues ve, no es forma de comparar ya que como dices tu .NET u otras plataformas de desarrollo como Java, Python, Ruby, nos brind muchas facilidades de aplicaciones empresariales, cosa que con c o c++ es un poco mas complicado de hacer, pero si hablamos en el area de algoritmia, me quedo con c/c++ y desecho a los demas, ya que para algoritmia se necesita cabeza mas q herramientas.

Saludos


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: Xavelets en 28 Abril 2011, 23:31 pm
Hola neoncyber!!

muchas gracias por tu respuesta, y una disculpa a ti y a los demás compañeros, porque no deje bien claro cual era mi inquietud principal, que en pocas palabras era.....  "que lenguaje/plataforma/herramientas... usar" jejejeje

Se que lo mejor es usar C/C++, pero quería usar .Net porque todavia no se hacer interfaces de usuario con código nativo, y menos sin un diseñador de interfaces......   ademas el IDE de VS es excelente y facilita mucho el trabajo.

En fin, buscando un poco mas, me encontré con las bibliotecas Boost, las cuales implementan casi todo lo que creo voy a necesitar,  (hilos, sockets, etc), solo me falta encontrar alguna API para capturar audio de dos o más tarjetas de sonido, y encontrar la forma para comunicar un programa nativo (que espero poder lograr convertirlo en un servicio), y una interfaz de usuario hecha en .Net con C#, y que ésta última controle el comportamiento de dicho programa.


Salu2


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: Khronos14 en 29 Abril 2011, 00:14 am
Hola Xavelets, yo me encuentro en una situación similar. Se programar en Delphi, C/C++ y C#.
Cuando necesito potencia y hacer una aplicación Win32 rápidamente uso Delphi. C# lo estudié obligado, y me gusta bastante, sólo que no me acaba de convencer las aplicaciones compiladas a byte-code.

Ahora mismo estoy programando en C++ y GTK+. De esta forma puedo crear aplicaciones multiplataforma, sin apenas cambiar líneas de código. El desarrollo del programa lo hago con el Visual C++ 2010 Express Edition, y en GNU/Linux hago un Makefile y lo compilo con g++.

Código
  1. #include <gtk/gtk.h>
  2. #include <glib/gthread.h>
  3. #include "frm_main.h"
  4. #include "platform.h"
  5.  
  6. #ifdef WINDOWS
  7. #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
  8.  
  9. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  10. #endif
  11. #ifdef LINUX
  12. int main(int argc, char * argv[])
  13. #endif
  14. {
  15. FMain * frm_main;
  16. #ifdef WINDOWS
  17. int argc;
  18. char ** argv;
  19. #endif
  20.  
  21. g_thread_init (NULL);
  22. gdk_threads_init ();
  23. gdk_threads_enter();
  24.  
  25. gtk_init(&argc, &argv);
  26. frm_main = new FMain();
  27. gtk_main();
  28.  
  29. delete(frm_main);
  30. gdk_threads_leave();
  31.  
  32. return 0;
  33. }
  34.  


GTK+ me gusta mucho, pero la documentación es muy escasa y tienes que buscarte mucho la vida. Otra alternativa es Qt con C++ y usando el IDE QtCreator puedes crear aplicaciones fácilmente.

Saludos.


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: [D4N93R] en 29 Abril 2011, 21:08 pm
Pero con .Net tienes muchas ventajas que no te dará gtk ni qt. :) Seguridad por ejemplo. O el mismo framework, cosas como LINQ o Parallel, o Tasks, WCF?

Un saludo!


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: neoncyber en 30 Abril 2011, 00:49 am
Totalmente de acuerdo con [D4N93R]  ya que ademas de facilidades de librerias (BCL), se cuenta con una gran cantidad de herramientas para agilizar el desarrollo de aplicaciones, claro es el ejemplo de Visual Studio LightSwitch, el cual te permite hacer cloud applications y aplicaciones de escritorio ya hechas con wpf facilmente

http://www.microsoft.com/visualstudio/en-us/lightswitch

Saludos


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: Xavelets en 30 Abril 2011, 02:49 am
Hola nuevamente a todos!! =)

@Khronos14

Muchas gracias por tu sugerencia; la verdad es que hace algún tiempo traté de usar GTK, y dado que mis conocimientos son pocos y los he adquirido casi completamente de forma autodidacta, no entendía nada, y me di por vencido... claro que ahora he aprendido un poco más, lo voy a intentar de nuevo, y de hecho con el código que escribiste aquí, me ha aclarado algunos detalles sobre el uso de GTK, e incluso como ubicar las directivas para una compilación multiplataforma....

Citar
... sólo que no me acaba de convencer las aplicaciones compiladas a byte-code.

Andale, a esto me refería con el planteamiento original, y mi duda sobre la diferencia de rendimiento entre C++/CLIE y C#.    Explico....

Si me equivoco, por favor corríjanme... la compilación tanto C++/CLIE (implementacion de Microsoft), como C# producen byte-code que será interpretado y ejecutado por el CLR.

Por otra parte, entiendo que la sintaxis de un lenguaje es solo la forma en que el usuario le dice al compilador que código de máquina generar. Por ejemplo, la sintaxis de un ciclo "for" es distinta en VB que en C#, sin embargo y por lógica yo pensaría que los compiladores de ambos lenguajes generan exactamente las mismas instrucciones de máquina (o byte-codes). Finalmente los que hicieron esta plataforma debieron de haber seguido las mismas directivas de construcción.

De forma similar, la sintaxis de un ciclo "for" en C++/CLI y C# es la misma, y no veo razón por la cual ambos lenguajes no generen exactamente las mismas instrucciones de máquina... si esto es cierto, no debería ser mucha la diferencia de rendimiento entre ambos lenguajes...

Esta es la explicación de la pregunta en el título del tema.

@ D4N93R y neoncyber

Exacto por eso mi sufrimiento :-( , quiero ayudarme con .Net, pero tengo miedo de trabajar un montón y al final darme cuenta de que mi aplicación no es lo suficientemente rápida ya que el algoritmo de procesamiento que voy a aplicar es O(n^4). Anteriormente hice un programa en C para probar el algoritmo, y en mi maquina equipada con un Intel Core Duo a 1.66 GHz y 1 GB de RAM y apenas podría decir que alcanzaba para tiempo real....  claro que no implemente hilos y por lo tanto no utilicé  toda la capacidad de mi procesador.

¿Ustedes que piensan? ¿valdrá la pena programar en C# para tiempo real con un algoritmo de ese tipo?, o mejor hago el sacrificio para aprender un poco mas de C++/CLI, o  C++ nativo.


Salu2


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: d(-_-)b en 30 Abril 2011, 16:05 pm
Una sulucion seria programar en C# y C++, segun el proposito de la aplicacion usas el lenguaje que quieras.

saludos...


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: neoncyber en 30 Abril 2011, 17:10 pm
Si definitivamente tu aplicacion la orientaras al area de algoritmia, te recomiendo c/c++, ahora si lo que quieres es utilizar una interfaz grafica de .NET, podrias hacer una dll en c++ q contenga la funcion de tu interes, y puedes llamar a esta dll desde c# de la siguiente forma
Código
  1. // http://www.c-sharpcenter.com/Tutorial/UnManaged.htm
  2.  
  3.  
  4. using System.Runtime.InteropServices;
  5. using System;
  6.  
  7. class call_dll {
  8.  
  9.  [StructLayout(LayoutKind.Sequential, Pack=1)]
  10.  private struct STRUCT_DLL {
  11.    public Int32  count_int;
  12.    public IntPtr ints;
  13.  }
  14.  
  15.  [DllImport("mingw_dll.dll")]
  16.  private static extern int func_dll(
  17.      int an_int,
  18.      [MarshalAs(UnmanagedType.LPArray)] byte[] string_filled_in_dll,
  19.      ref STRUCT_DLL s
  20.   );
  21.  
  22.  public static void Main() {
  23.  
  24.    byte[] string_filled_in_dll = new byte[21];
  25.  
  26.  
  27.    STRUCT_DLL struct_dll = new STRUCT_DLL();
  28.    struct_dll.count_int = 5;
  29.    int[]  ia = new int[5];
  30.    ia[0] = 2; ia[1] = 3; ia[2] = 5; ia[3] = 8; ia[4] = 13;
  31.  
  32.    GCHandle gch    = GCHandle.Alloc(ia);
  33.    struct_dll.ints = Marshal.UnsafeAddrOfPinnedArrayElement(ia, 0);
  34.  
  35.    int ret=func_dll(5,string_filled_in_dll, ref struct_dll);
  36.  
  37.    Console.WriteLine("Return Value: " + ret);
  38.    Console.WriteLine("String filled in DLL: " + System.Text.Encoding.ASCII.GetString(string_filled_in_dll));
  39.  
  40.  }
  41. }
  42.  

Saludos


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: Xavelets en 1 Mayo 2011, 01:12 am
Si!!!  Slow V.S.  y neoncyber ;D  creo que es lo que voy a hacer.....


@neoncyber

Muchas gracias por el código, aunque siendo sincero no entiendo muy bien algunas partes del mismo;  pero dejame analizarlo con más cuidado e investigar sobre algunas de las funciones y estructuras sintácticas que usas.

Si definitivamente no lo entiendo después de eso, te estaré molestando a ti y a los compañeros del foro con dudas más específicas.  :D

Aunque a grandes rasgos, y si entiendo bien...

¿con esto puedo crear una DLL en código nativo compilarlo, y por consiguiente generar código máquina "eficiente", y el CLR lo ejecutará como tal?, es decir sin intervenir con él y provocarle algún tipo de retraso.

Si es así, ¡¡esto es exactamente lo que necesito!! :D


Edito:
Bueno me viene a la mente otra cosa, las llamadas a funciones externas a .NET  ¿serán muy costosas computacionalmnete hablando?

Les advertí que soy un tanto obsesivo jijijijijiji :rolleyes:  :silbar:

Gracias y Salu2


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: neoncyber en 1 Mayo 2011, 06:36 am
Bueno, basicamente ese tipo de codigos se utilizan para llamar a funciones de la API Win32, pero descubri que si se podia llamar a dll propias. pero bueno, tal vez la llamada a una funcion externa, solo la llamada consuma recursos, pero la ejecucion la hara tu dll.

Saludos


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: [D4N93R] en 2 Mayo 2011, 16:22 pm
La solución es la siguiente:

1) Programas el core del algoritmo en C++
2) Programas el GUI en C# o cualquier otro de .Net
3) Programas un Wrapper en C++/CLI que lo consumes desde el GUI en .Net
4) En .Net tienes clases para aprovechar los núcleos del CPU por lo que si tu algoritmo puede dividirse en Tasks, tienes dos opciones inclusivas: aprovechar los núcleos y aprovechar remoting/wcf + Parallel tasks + plinq para ejecutar tu algoritmo en C++ en varios equipos consumiendo .Net
5) Nos dices como te fue y brindamos por el éxito de tu app!

:)

Coclusión:

Nada va a ser más rápido que código nativo. Nada va a ser más scalable y rápido de programar que administrado. Es decir, usa lo mejor de ambos mundos!

Un saludo..

EDIT: me acabo de dar cuenta que es casi igual a lo que dijo neoncyber, pero el no sugiere C++/CLI para el wrapper, sino usar interop directamente desde .net. Es casi igual, pero usando el wrapper queda más limpio, escalable, tienes una capa más de abstracción, y no le resta rendimiento tampoco.


Título: Re: Sobre rendimiento ¿Realmente C++/Cli es superior en velocidad a C#, ambos .Net?
Publicado por: Xavelets en 6 Mayo 2011, 02:33 am
Hola amigos, pues para agradecerles sus opiniones y orientación!!

¡Esta decidido!, estoy trabajando con el esquema que sugieren D4N93R y neoncyber  ;-)

El único inconveniente es que tengo que aprender mucho sobre C++ pero eso es lo de menos, aquí los estaré molestando

Salu2