[Solucionado] ¿Realmente C++/Cli es superior en velocidad ambos .Net?

Iniciado por Xavelets, 28 Abril 2011, 05:53 AM

0 Miembros y 1 Visitante están viendo este tema.

Xavelets

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....
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.

neoncyber

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
Código (python) [Seleccionar]

#!/usr/bin/python
print "Visit:"
print "http:\\donkeysharp.blogspot.com"

Xavelets

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
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.

Khronos14

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 (cpp) [Seleccionar]

#include <gtk/gtk.h>
#include <glib/gthread.h>
#include "frm_main.h"
#include "platform.h"

#ifdef WINDOWS
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
#endif
#ifdef LINUX
int main(int argc, char * argv[])
#endif
{
FMain * frm_main;
#ifdef WINDOWS
int argc;
char ** argv;
#endif

g_thread_init (NULL);
gdk_threads_init ();
gdk_threads_enter();

gtk_init(&argc, &argv);
frm_main = new FMain();
gtk_main();

delete(frm_main);
gdk_threads_leave();

return 0;
}



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.

[D4N93R]

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!

neoncyber

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
Código (python) [Seleccionar]

#!/usr/bin/python
print "Visit:"
print "http:\\donkeysharp.blogspot.com"

Xavelets

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
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.

d(-_-)b

Una sulucion seria programar en C# y C++, segun el proposito de la aplicacion usas el lenguaje que quieras.

saludos...
Max 400; caracteres restantes: 366

neoncyber

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 (csharp) [Seleccionar]

// http://www.c-sharpcenter.com/Tutorial/UnManaged.htm


using System.Runtime.InteropServices;
using System;

class call_dll {

  [StructLayout(LayoutKind.Sequential, Pack=1)]
  private struct STRUCT_DLL {
    public Int32  count_int;
    public IntPtr ints;
  }

  [DllImport("mingw_dll.dll")]
  private static extern int func_dll(
      int an_int,
      [MarshalAs(UnmanagedType.LPArray)] byte[] string_filled_in_dll,
      ref STRUCT_DLL s
   );
 
  public static void Main() {

    byte[] string_filled_in_dll = new byte[21];


    STRUCT_DLL struct_dll = new STRUCT_DLL();
    struct_dll.count_int = 5;
    int[]  ia = new int[5];
    ia[0] = 2; ia[1] = 3; ia[2] = 5; ia[3] = 8; ia[4] = 13;

    GCHandle gch    = GCHandle.Alloc(ia);
    struct_dll.ints = Marshal.UnsafeAddrOfPinnedArrayElement(ia, 0);

    int ret=func_dll(5,string_filled_in_dll, ref struct_dll);
   
    Console.WriteLine("Return Value: " + ret);
    Console.WriteLine("String filled in DLL: " + System.Text.Encoding.ASCII.GetString(string_filled_in_dll));

  }
}


Saludos
Código (python) [Seleccionar]

#!/usr/bin/python
print "Visit:"
print "http:\\donkeysharp.blogspot.com"

Xavelets

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
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.