elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con threads
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con threads  (Leído 9,556 veces)
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Duda con threads
« Respuesta #20 en: 19 Mayo 2014, 11:14 am »

Si yo hago un bucle con strings sin usar punteros... en C++ tendré un uso bastante estable de la memoria.

Código
  1. string p;
  2. for (int x = 0; x < 500; ++x)
  3.  p.insert(p.end(), 1024 * 1024, '.');
  4.  

Tal vez se me pierde el objetivo y/o sentido del bucle pero si hace algo que no se pierde inmediatamente ...


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con threads
« Respuesta #21 en: 19 Mayo 2014, 11:27 am »

Obviamente todos los almacenes de información a lo largo de un algoritmo implican un mayor consumo de recursos... en C, C++, C#, Java, Perl, PHP, ADA, Pascal, javascript y cualquier otro.

Sin embargo la cosa cambia cuando te encuentras con algo tal que:

Código
  1. #include <limits.h>
  2. #include <iostream>
  3.  
  4. int main( )
  5. {
  6.  for ( unsigned int i=0; i<UINT_MAX; i++ )
  7.  {
  8.    for ( unsigned int j = 0; j < UINT_MAX; j++ )
  9.    {
  10.      string variable = "ALGO" + std::to_string( i ) + std::to_string( j );
  11.      std::cout << variable << std::endl;
  12.    }
  13.  }
  14. }

Código
  1. public class Program
  2. {
  3.  public static void Main()
  4.  {
  5.    for ( uint i=0; i<uint.MaxValue; i++ )
  6.    {
  7.      for ( uint j = 0; j < uint.MaxValue; j++ )
  8.      {
  9.        string variable = "ALGO" + i.ToString( ) + j.ToString( );
  10.        System.Console.WriteLine( variable );
  11.      }
  12.    }
  13.  }
  14. }

Ya te garantizo yo que el consumo total de memoria del segundo programa en C# es bastante superior. Y cuando digo "bastante superior" me refiero descontando el consumo adicional de memoria que por defecto tiene C# con respecto a C++.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con threads
« Respuesta #22 en: 19 Mayo 2014, 11:46 am »

Te recomiendo Java y C#.
Esos no son punteros crudos al viejo C xD

Yo los situaría como las referencias de C++ (aunque estas se pueden modificar).
« Última modificación: 19 Mayo 2014, 11:47 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Duda con threads
« Respuesta #23 en: 19 Mayo 2014, 12:03 pm »

eferion: me debo estar perdiendo algo otra vez, ya que no se hace uso intensivo de la memoria dinamica (son unas cadenas de tamaño infimo) en tu ejemplo y se podria solventar facilmente usando una variable definida fuera del bucle en C# (acudo a la logica simplemente, no trabajo en .NET pero como el framework este medio bien hecho - tambien queda la JVM - al asignarle un nuevo puntero a variable deberia liberar la memoria anterior sin necesidad de recolectar basura posteriormente).

amchacon: por eso, si los punteros son el pasado ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con threads
« Respuesta #24 en: 19 Mayo 2014, 12:15 pm »

amchacon: por eso, si los punteros son el pasado ...
En C++, el uso de punteros ya no es tan necesario. Para modificar variables y tal, prefiero mil veces las referencias.

El único uso que le veo a los punteros en C++ es para el polimorfismo. Para todo lo demás tienes las STL y las referencias:

Código
  1. unique_ptr<int> MemoriaDinamica(new int);
  2.  
  3. array<int,10> MemoriaDinamicaArray;
  4.  
  5. vector<int> MemoriaDinamicaVector(10);

Los punteros son suceptibles a los memoryleaks, las STL no ^^
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con threads
« Respuesta #25 en: 19 Mayo 2014, 12:20 pm »

Se hace uso intensivo de memoria porque cada vez que creas un string, en la versión de C# (igual pasaría con Java) se está creando bajo la figura de un puntero... cuando se sale del ámbito, la instancia de string se marca para ser reciclada por el recolector de basura. Dado que el proceso está ocupado con la ejecución del bucle, el recolector de basura no entra en juego... y eso sucede a lo largo de toda la vida del código que he puesto.

Resultado: 4 * 4,294,967,295^2 instancias de string esperando a ser liberadas... y ocupando espacio en memoria.

el 4 viene porque:

Código
  1. string variable = "ALGO" + i.ToString( ) + j.ToString( );

Esta línea implica la creación de 4 strings:

* primer string: "ALGO"
* segundo string: i.ToString( )
* tercer string: j.ToString( )
* cuarto string: variable = todo_lo_demas

Bueno, realmente creo que sería más correcto decir que en cada iteración se crean 5 strings... ya que los operadores de suma se resuelven uno a uno.

Citar
En C++, el uso de punteros ya no es tan necesario. Para modificar variables y tal, prefiero mil veces las referencias.

El único uso que le veo a los punteros en C++ es para el polimorfismo. Para todo lo demás tienes las STL y las referencias:

Los punteros son suceptibles a los memoryleaks, las STL no ^^

Totalmente de acuerdo.

Además, usando referencias evitas la tentación de hacer delete donde no corresponde :)
« Última modificación: 19 Mayo 2014, 12:23 pm por eferion » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Duda con threads
« Respuesta #26 en: 19 Mayo 2014, 12:32 pm »

Tal vez un experto en .NET pueda resolver con facilidad este "problema". Es posible que no exista ninguna optimizacion ni en Java ni en C# como para resolver algo tan sencillo como que una variable temporal (todas las que no son variable que deberia poder ser liberada en cada iteracion con un cambio de ambito, cosa que podria ser aplicada a las demas variables temporales tambien llegado el caso) sea destruida inmediatamente pero me resulta dificil creerlo.



EDITO: acabo de probar tu codigo con el framework v2.0.50727 (el mas antiguo en mi maquina) el uso de memoria no aumenta ni siquiera por cada iteracion de i. "ALGO" no es un objeto segun ildasm.
« Última modificación: 19 Mayo 2014, 13:10 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con threads
« Respuesta #27 en: 19 Mayo 2014, 13:22 pm »

Después de realizar algunas comprobaciones debo reconocer que .NET ha mejorado enormemente los problemas que comento.

Me apunto probar con strings más grandes... ya que el "tamaño" que ocupa uno de estos es francamente pequeño... y no se puede hacer un subclass de "string" porque es una clase "sealed".

Aún así me ha sorprendido la mejora de rendimiento al respecto.
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] [Duda] De Threads, Swing, y Non Blocking Calls
Java
RyogiShiki 1 2,958 Último mensaje 15 Noviembre 2011, 14:56 pm
por RyogiShiki
Duda con pool de threads en java
Java
xoker 0 1,662 Último mensaje 11 Enero 2014, 20:50 pm
por xoker
Duda sobre threads (hilos) y semáforos (mutex)
Programación C/C++
IngenieroFrustrado 3 2,970 Último mensaje 25 Enero 2014, 11:17 am
por amchacon
Duda con threads o hilos
Java
.:UND3R:. 1 2,398 Último mensaje 14 Febrero 2014, 17:59 pm
por Gh057
threads , duda « 1 2 »
Java
omar_cdg 11 5,608 Último mensaje 10 Septiembre 2015, 17:45 pm
por Ur1cchio
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines