Autor Tema: Colecciones, JAVA vs C#  (Leído 863 veces)

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

Desconectado Kimeraweb

  • AdminSite
  • *
  • Topic Author
  • Mensajes: 2460
  • de
  • Agradecimientos: 796
  • Kimeraweb
    • http://l2devsadmins.net
  • Cronica: : Alfa
  • Revision: Alfa
  • S.O: Windows 10
  • Serverpack : Desarrollo interno
Colecciones, JAVA vs C#
« en: Diciembre 13, 2015, 09:30:25 am »
gracias
Este post tiene 0 agradecimientos
  • Añade a tus favoritos
    Se usa Java 8 sobre windows 7 en un AMD APU10 4.1Ghz

    Citar
    Array. Tiempo invertido insertando 450000 objetos: 156 milisegundos.
    ArrayList. Tiempo invertido insertando 450000 objetos: 826 milisegundos.
    Set. Tiempo invertido insertando 450000 objetos: 516 milisegundos.
    Map. Tiempo invertido insertando 450000 objetos: 203 milisegundos.
    Queue. Tiempo invertido insertando 450000 objetos: 47 milisegundos.
     --- * ---
    Array. Tiempo invertido recorriendo 450000 objetos: 15 milisegundos.
    ArrayList. Tiempo invertido recorriendo 450000 objetos: 47 milisegundos.
    Set. Tiempo invertido recorriendo 450000 objetos: 47 milisegundos.
    Map. Tiempo invertido recorriendo 450000 objetos: 16 milisegundos.
    Queue. Tiempo invertido recorriendo 450000 objetos: 31 milisegundos.
     --- * ---
    Array. Tiempo invertido buscando 1 objeto entre 450000 objetos: 31 milisegundos.
    ArrayList. Tiempo invertido buscando 1 objeto entre 450000 objetos: 31 milisegundos.
    Set. Tiempo invertido buscando 1 objeto entre 450000 objetos: 47 milisegundos.
    HashMap. Tiempo invertido buscando 1 objeto entre 450000 objetos: 0 milisegundos.
    PriorityQueue. Tiempo invertido buscando 1 objeto entre 450000 objetos: 0 milisegundos.

    En C#, la conversión de tipos se hace de forma automática, no encontré el equivalente para crear un Hash y buscar un objeto.

    Java tiene colecciones especificas que lo hacen hasta 10 veces más rápido.
    Como no soy un experto, quizás se me haya pasado algún detalle que pudiera mejorarse.

    En esta imagen sólo reserva memoria para 900k objetos (450k para la clase Stack y 450k para la clase Queue).


    Entonces pensé, cual sería el resultado si tuviera que reservar espacio para 2,250k objetos (450 *5) como en el ejemplo de Java?



    Los códigos:
    JAVA:

    Código: [Seleccionar]
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.PriorityQueue;
    import java.util.Set;


    public class Main {
       

       
       
       public static void main (String [] args)
       {   
          int numero_objetos = 450000;
          /*
          ** Insertando objetos
          */
         
          // Array de objetos
          Objeto primitiveArray [] = new Objeto[numero_objetos];
          Date d = new Date();
          long tiempoInic0 = d.getTime();
          for (int x=0; x<numero_objetos; x++)
             primitiveArray[x] = new Objeto("Objeto " + x, x);
          Date d0 = new Date();
          long tiempoFin0 = d0.getTime();
          System.out.println("Array. Tiempo invertido insertando " + numero_objetos + " objetos: " + (tiempoFin0-tiempoInic0) + " milisegundos.");

         
          // Implementan List
          List<Objeto> arraylist = new ArrayList<Objeto>();
         
          Date d1 = new Date();
          long tiempoInic1 = d1.getTime();
          for (int x=0; x<numero_objetos; x++)
             arraylist.add(new Objeto("Objeto " + x, x));
          Date d2 = new Date();
          long tiempoFin1 = d2.getTime();
          System.out.println("ArrayList. Tiempo invertido insertando " + numero_objetos + " objetos: " + (tiempoFin1-tiempoInic1) + " milisegundos.");
       
          // Set
          Set<Objeto> set = new HashSet<Objeto>();
         
          Date d3 = new Date();
          long tiempoInic2 = d3.getTime();
          for (int x=0; x<numero_objetos; x++)
             set.add(new Objeto("Objeto " + x, x));
          Date d4 = new Date();
          long tiempoFin2 = d4.getTime();
          System.out.println("Set. Tiempo invertido insertando " + numero_objetos + " objetos: " + (tiempoFin2-tiempoInic2) + " milisegundos.");
       
          // Map
          Map<Integer,Objeto> map = new HashMap<Integer,Objeto>();
         
          Date d5 = new Date();
          long tiempoInic3 = d5.getTime();
          for (int x=0; x<numero_objetos; x++)
             map.put(x, new Objeto("Objeto " + x, x));
          Date d6 = new Date();
          long tiempoFin3 = d6.getTime();
          System.out.println("Map. Tiempo invertido insertando " + numero_objetos + " objetos: " + (tiempoFin3-tiempoInic3) + " milisegundos.");
         
          // Queue
          PriorityQueue<Objeto> priorityqueue = new PriorityQueue<Objeto>();
         
          Date d7 = new Date();
          long tiempoInic4 = d7.getTime();
          for (int x=0; x<numero_objetos; x++)
             priorityqueue.offer(new Objeto("Objeto " + x, x));
          Date d8 = new Date();
          long tiempoFin4 = d8.getTime();
          System.out.println("Queue. Tiempo invertido insertando " + numero_objetos + " objetos: " + (tiempoFin4-tiempoInic4) + " milisegundos.");

         
          /*
           * Recorriendo objetos
           */
          System.out.println(" --- * ---");
         
          // Array de objetos
          Date d9 = new Date();
          long tiempoInic5 = d9.getTime();
          for (Objeto a:primitiveArray)
             a.getNumero();
          Date d10 = new Date();
          long tiempoFin5 = d10.getTime();
          System.out.println("Array. Tiempo invertido recorriendo " + numero_objetos + " objetos: " + (tiempoFin5-tiempoInic5) + " milisegundos.");

          // ArrayList
          Date d11 = new Date();
          long tiempoInic6 = d11.getTime();
          for (Objeto a:arraylist)
             a.getNumero();
          Date d12 = new Date();
          long tiempoFin6 = d12.getTime();
          System.out.println("ArrayList. Tiempo invertido recorriendo " + numero_objetos + " objetos: " + (tiempoFin6-tiempoInic6) + " milisegundos.");

          // Set
          Date d13 = new Date();
          long tiempoInic7 = d13.getTime();
          for (Objeto a:set)
             a.getNumero();
          Date d14 = new Date();
          long tiempoFin7 = d14.getTime();
          System.out.println("Set. Tiempo invertido recorriendo " + numero_objetos + " objetos: " + (tiempoFin7-tiempoInic7) + " milisegundos.");

          // Map
          Date d15 = new Date();
          long tiempoInic8 = d15.getTime();
          Iterator<Entry<Integer, Objeto>> i = map.entrySet().iterator();
          while (i.hasNext()) {
             Map.Entry<Integer, Objeto> m = (Entry<Integer, Objeto>) i.next();
             m.getValue().getNumero();   
          }
          Date d16 = new Date();
          long tiempoFin8 = d16.getTime();
          System.out.println("Map. Tiempo invertido recorriendo " + numero_objetos + " objetos: " + (tiempoFin8-tiempoInic8) + " milisegundos.");

          // PriorityQueue
          Date d17 = new Date();
          long tiempoInic9 = d17.getTime();
          Iterator<Objeto> i1 = priorityqueue.iterator();
          while (i1.hasNext()) {
             Objeto pq = i1.next();
             pq.getNumero();
          }
          Date d18 = new Date();
          long tiempoFin9 = d18.getTime();
          System.out.println("Queue. Tiempo invertido recorriendo " + numero_objetos + " objetos: " + (tiempoFin9-tiempoInic9) + " milisegundos.");

          /*
           * Buscando objetos
           */
          System.out.println(" --- * ---");
         
          // Array de objetos
          Date d19 = new Date();
          long tiempoInic10 = d19.getTime();
          for (Objeto a:primitiveArray) {
             if (a.getNumero()==(numero_objetos-1))
             {
                Date d20 = new Date();
                long tiempoFin10 = d20.getTime();
                System.out.println("Array. Tiempo invertido buscando 1 objeto entre " + numero_objetos + " objetos: " + (tiempoFin10-tiempoInic10) + " milisegundos.");
                continue;
             }
          }
         
          // Implementa List
          Date d21 = new Date();
          long tiempoInic11 = d21.getTime();
         
          for (Objeto a:arraylist) {
             if (a.getNumero()==(numero_objetos-1))
             {
                Date d22 = new Date();
                long tiempoFin11 = d22.getTime();
                System.out.println("ArrayList. Tiempo invertido buscando 1 objeto entre " + numero_objetos + " objetos: " + (tiempoFin11-tiempoInic11) + " milisegundos.");
                continue;
             }
          }
         
          // Implementa Set
          Date d23 = new Date();
          long tiempoInic12 = d23.getTime();
          set.toArray();
          for (Objeto a:set) {
             if (a.getNumero()==(numero_objetos-1))
             {
                Date d22 = new Date();
                long tiempoFin12 = d22.getTime();
                System.out.println("Set. Tiempo invertido buscando 1 objeto entre " + numero_objetos + " objetos: " + (tiempoFin12-tiempoInic12) + " milisegundos.");
                continue;
             }
          }
         
          // Implementa HashMap
          Date d25 = new Date();
          long tiempoInic13 = d25.getTime();
          Objeto oms = map.get(numero_objetos - 1);
          oms.getNumero();
          Date d26 = new Date();
          long tiempoFin13 = d26.getTime();
          System.out.println("HashMap. Tiempo invertido buscando 1 objeto entre " + numero_objetos + " objetos: " + (tiempoFin13-tiempoInic13) + " milisegundos.");

          // Implementa PriorityQueue
          Date d27 = new Date();
          long tiempoInic14 = d27.getTime();
          Object[] pq =  priorityqueue.toArray();
          for (Object o : pq)
          {
             if (((Objeto) o).getNumero()==(numero_objetos-1))
                continue;
          }
          Date d28 = new Date();
          long tiempoFin14 = d28.getTime();
          System.out.println("PriorityQueue. Tiempo invertido buscando 1 objeto entre " + numero_objetos + " objetos: " + (tiempoFin14-tiempoInic14) + " milisegundos.");
         
       
       }
    }

    class Objeto implements Comparable<Object> {
       String nombre;
       int numero;
       
       Objeto (String nombre, int numero) { this.nombre = nombre; this.numero=numero; }
       int getNumero() { return numero; }
       
       // ** Implementanción de métodos de las interfaces **
       // Usado por HashMap para recorrer la coleccion (obligado)
       public int compareTo(Object o) { return numero; }
       
       // Usado por Hash para encontrar un unico objeto (opcional, pero excepcionalmente rápido)
       public int hashCode() { return numero; }
       public boolean equals (Object o) { if (o instanceof Objeto) { return true; } else { return false; }}
    }

    C#

    Código: [Seleccionar]
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Diagnostics;

    namespace CreandoObjetos
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                Stopwatch diagnosis = new Stopwatch();
                Stack<SoyElObjeto> coleccion = new Stack<SoyElObjeto>();
               
                diagnosis.Start();

                for (int x = 0; x <= Int32.Parse(textBox_coleccionesParaCrear.Text); x++)
                {
                    coleccion.Push(new SoyElObjeto("Objeto " + x, x));
                }

                diagnosis.Stop();

                label_tiempoEmpleado.Text = (diagnosis.Elapsed.Milliseconds).ToString();


                diagnosis.Start();

                foreach (SoyElObjeto a in coleccion)
                {
                    a.getNumero();
                }

                diagnosis.Stop();

                label_tiempoEmpleadoRecorriendo.Text = (diagnosis.Elapsed.Milliseconds).ToString();



                Queue<SoyElObjeto> cola = new Queue<SoyElObjeto>();
                diagnosis.Start();
                for (int x = 0; x <= Int32.Parse(textBox_coleccionesParaCrear.Text); x++)
                {
                    cola.Enqueue(new SoyElObjeto("Objeto " + x, x));
                }
                diagnosis.Stop();
                label_creandoObjetosQueue.Text = (diagnosis.Elapsed.Milliseconds).ToString();


                diagnosis.Start();
                foreach (SoyElObjeto a in cola)
                {
                    a.getNumero();
                }
                diagnosis.Stop();
                label_recorriendoObjetosQueue.Text = (diagnosis.Elapsed.Milliseconds).ToString();
                Refresh();
            }
        }
    }



    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace CreandoObjetos
    {
        class SoyElObjeto
        {
            String Name;
            int Numero;

            public SoyElObjeto(String name, int numero)
            {
                Name = name;
                Numero = numero;
            }

            public int getNumero()
            {
                return Numero;
            }

        }
    }
    « Última modificación: Diciembre 13, 2015, 11:48:51 am por Kimeraweb »
    "Sólo existen dos días al año en los que no se puede hacer nada: ayer y mañana" (Dalai Lama)

    Conectado Fissban

    • AdminSite
    • *
    • Mensajes: 5656
    • ar
    • Agradecimientos: 1667
      • Mis Proyectos
    • Cronica: : Scions of Destiny
    • Revision: Last
    • S.O: Windows 10
    • Serverpack : L2jAdmins
    Re:Colecciones, JAVA vs C#
    « Respuesta #1 en: Diciembre 13, 2015, 03:26:36 pm »
    gracias
    Este post tiene 0 agradecimientos
  • Añade a tus favoritos
    que enredo de variables en java jeje, yo para obtener el tiempo siempre preferí usar "System.currentTimeMillis()" y solo una variable.

    Siendo un aficionado en C# la verdad que me gusta mas el eclipse que visual studio :P aunque tiene su atractivo el lenguaje.

    aun asi kime, cuando hablamos de pruebas sobre listas o mapas es muy importante conciderar la cantidad de objetos q leemos o insertamos ya q estas se comportan diferente a diferente cantidades....segun eh leido en algun foro (pero jamás me dispuse a probarlo yo)

    Tenemos algunos tipos que al insertar 40.000 objetos funcionan de 10 pero al superar los 100.000 se arruina su perfomance y sinceramente no creo que en L2 encontremos listas y/o mapas que superen los 500 objetos.

    Desconectado Kimeraweb

    • AdminSite
    • *
    • Topic Author
    • Mensajes: 2460
    • de
    • Agradecimientos: 796
    • Kimeraweb
      • http://l2devsadmins.net
    • Cronica: : Alfa
    • Revision: Alfa
    • S.O: Windows 10
    • Serverpack : Desarrollo interno
    A Fissban le gusta este post.

    Re:Colecciones, JAVA vs C#
    « Respuesta #2 en: Diciembre 13, 2015, 04:30:42 pm »
    gracias
    Este post tiene 1 agradecimientos
  • Añade a tus favoritos
    Pocos son Fiss...  te dejo la sorpresa ;D solo de FastMap hay mas de dos millones de instancias, ocupan el 11.5% total de la memoria del servidor.


    Te dejo una screenshot de la lista de clases instanciadas:


    Por ejemplo, la primera que he ido a pillar, InstanceWorlds, 5120 objetos en la lista.


    Otra que encuentro al azar tiene 97649 objetos en la lista, _questEvents.


    Java es un lenguaje corporativo. En el prólogo de Java dice, que Java demuestra su potencia cuanto mas grande sea la cantidad de datos a manejar. Es decir, que si el server fuera todavía mas complejo, le sacaría mas distancia en rendimiento a otros lenguajes.
    "Sólo existen dos días al año en los que no se puede hacer nada: ayer y mañana" (Dalai Lama)

    Desconectado BlackZer0

    • Global Moderator
    • *
    • Mensajes: 1473
    • ve
    • Agradecimientos: 233
      • Venezuela Gamer
    • Cronica: : Interlude
    • Revision: last
    • S.O: Linux Ubuntu
    • Serverpack : Jfrozem JaCis
    Re:Colecciones, JAVA vs C#
    « Respuesta #3 en: Diciembre 13, 2015, 06:22:42 pm »
    gracias
    Este post tiene 0 agradecimientos
  • Añade a tus favoritos
    KImera esta en todo
    si quieres ayudarme para poder seguir compartiendo contenidos Puedes realizar donaciones por
    Paypal : TahanRoberto@gmail.com 
    "Ningún hombre se convierte realmente en un tonto hasta que deje de hacer preguntas"

    Desconectado Hefester

    • L2j Developer
    • *
    • Mensajes: 266
    • ar
    • Agradecimientos: 70
    • Cronica: : Interlude
    • Revision: -
    • S.O: Windows 10
    • Serverpack : L2J
    A Kimeraweb le gusta este post.

    Re:Colecciones, JAVA vs C#
    « Respuesta #4 en: Diciembre 25, 2015, 11:56:38 pm »
    gracias
    Este post tiene 1 agradecimientos
  • Añade a tus favoritos
    En C# la clase Dictionary sería lo que es Map en java, en C# también está List  :hu2_2: