Newsgroup: it.comp.java
Titolo: test confronto C++ e Java [seconda parte]

>>
Creazione stringhe nello heap (1m)             Elapsed: 578 ms          <
___________________________ C++ std::string ___________________________
Creazione di 5m stringhe 'ciao' + i           Elapsed: 3125 ms
Creazione di 50k stringhe += 'c' + i           Elapsed: 46 ms
find_first_of('c')                                    Elapsed: 859 ms
Sottostringa(4,7)                                    Elapsed: 156 ms
Creazione stringhe nello heap (1m)          Elapsed: 1172 ms
sotto riporto il codice Java e C++
se qualche "pazzo" lo vuole provare (e vuole trovare gli errori...) ben
venga
___________________________ C++ ___________________________
void test_string() {
 long i, n;
 std::string s;
 clock_t start,finish;
 double result;
 n = 5000000;
 printf(" Esecuzione di %ld crea stringa 'ciao' + i ... \n", n);
 start = clock();
 for (i=0; i<n; i++) {
  s = "ciao";
  s += i;
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
 printf(" Esecuzione di %ld crea stringa += s + 'c' + i ... \n", n);
 start = clock();
 for (i=0; i<n/100; i++) {
  s += 'c';
  s += i;
  if (s.length() > 10000) s = "";
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
 printf(" Esecuzione di %ld find_first_of \n", n);
 start = clock();
 s = "trova la prima occorrenza";
 for (i=0; i<n; i++) {
  int k = s.find_first_of('c');
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
 printf(" Esecuzione di %ld substring_of \n", n);
 start = clock();
 std::string s2 = "abcdefghijk";
 std::string s3 = "pqrstuvwxyz";
 std::string sBuf = "";
 for (i=0; i<n/100; i++) {
  if (i%2 == 0) s = s2.substr(4,7);
  else s = s3.substr(4,7);
  sBuf += s;
  if (sBuf.length() > 10000) sBuf = "";
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
}
void crea_stringhe() {
 long i;
 const long n = 1000000;
 clock_t start,finish;
 double result;
 std::string *sar = new std::string[n];
 printf(" Creazione di stringhe nello heap ... \n", n);
 std::string s;
 start = clock();
 for (i=0; i<n; i++) {
  sar[i] = "andrea";
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
}
______________________________________ Java ___________________________
void test_stringhe() {
    long n = 5000000;
    long t,end;
    String s;
    System.out.println("\nCreazione di stringhe 'ciao' + i ");
    t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      s = "ciao";
      s += i;
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nCreazione di stringhe += 'c' + i ");
    t = System.currentTimeMillis();
    s = "a";
    for (int i = 0; i < n/100; i++) {
      s += 'c';
      s += i;
      if (s.length() > 10000) s = "";
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nFind first of");
    t = System.currentTimeMillis();
    s = "trova la prima occorrenza";
    for (int i = 0; i < n; i++) {
      int k = s.indexOf('c');
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nSubstring(2,3)");
    t = System.currentTimeMillis();
    s = "";
    String s2 = "abcdefghijk";
    String s3 = "pqrstuvwxyz";
    String sBuf = "";
    for (int i = 0; i < n/100; i++) {
      if (i%2 == 0) s = s2.substring(4,7);
      else s = s3.substring(4,7);
      sBuf += s;
      if (sBuf.length() > 10000) sBuf = "";
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
 void crea_stringhe() {
    String s[] = new String[1000000];
    System.out.println("\nCrea stringhe");
    long t = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
      s[i] = new String("andrea");
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
Conclusione: nell'allocazione dinamica (new) il Java sembra migliore (?!?)
nelle operazioni di inizializzazione (string = "ciao") sono praticamente
uguali
invece nelle operazioni (di basso livello) tipo string += "ciao"
il C++ č oltre 100 volte piů veloce!!!

 il C++ è oltre 100 volte più veloce!!!
Anche il C++ alloca una nuova stringa ad ogni +=? Altrimenti nel codice Java
dovevi usare StringBuffer...
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it


Giusto... :-)
... ripeto il tutto con StringBuffer
___________________________ Java String ___________________________
Creazione di 5m stringhe 'ciao' + i       Elapsed: 2641 ms         ==
Creazione di 50k stringhe += 'c' + i   Elapsed: 16 ms              <
Occorrenze di 'c' (50m)                    Elapsed: 390 ms          <
Sottostringa(4,7) (50k)                    Elapsed: 32 ms              <
Creazione stringhe nello heap (1m)      Elapsed: 578 ms         <
___________________________ C++ std::string ___________________________
Creazione di 5m stringhe 'ciao' + i       Elapsed: 3125 ms
Creazione di 50k stringhe += 'c' + i       Elapsed: 46 ms
find_first_of('c')                                    Elapsed: 859 ms
Sottostringa(4,7)                                Elapsed: 156 ms
Creazione stringhe nello heap (1m)      Elapsed: 1172 ms
A dir poco sorprendente..., Java batte C++ 4-0 !!!
PS: per contro qualcuno dovrebbe ottimizzare il codice C++ eh eh
codice Java modificato
______________________________________ Java ___________________________
void test_stringhe() {
    long n = 5000000;
    long t,end;
    String s = new String();
    System.out.println("\nCreazione di stringhe 'ciao' + i ");
    t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      s = "ciao";
      s += i;
    }
    System.out.println(""+s);
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nCreazione di stringhe += 'c' + i ");
    t = System.currentTimeMillis();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < n/100; i++) {
      sb.append('c').append(i);
      if (sb.length() > 10000) sb = new StringBuffer();
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nFind first of");
    t = System.currentTimeMillis();
    String test = "trova la prima occorrenza";
    for (int i = 0; i < n; i++) {
      int k = test.indexOf('c');
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
    System.out.println("\nSubstring(2,3)");
    t = System.currentTimeMillis();
    String s1 = "";
    String s2 = "abcdefghijk";
    String s3 = "pqrstuvwxyz";
    StringBuffer sBuf = new StringBuffer();
    for (int i = 0; i < n/100; i++) {
      if (i%2 == 0) s1 = s2.substring(4,7);
      else s1 = s3.substring(4,7);
      sBuf.append(s);
      if (sBuf.length() > 10000) sBuf = new StringBuffer();


 ... ripeto il tutto con StringBuffer
Mi dispiace averti fatto lavorare ulteriormente ;)
Ora sarebbe simpatico che qualcuno provasse lo stesso codice con il gcc su
Linux (provando anche Java ovviamente). Sono curioso ;)
Tu che compilatore hai usato? Su che SO?
Ciao!


 su Linux (provando anche Java ovviamente). Sono curioso ;)
Ho fatto un po' di prove io su Linux e Windows (per confrontare) usando
Java (con e senza StringBuffer) e C# (con StringBuilder) (i linguaggi che
conosco). Il codice c++ fornito da voi non sono riuscito a compilarlo
conoscendo poco o niente di c++ (mi dice che non trova alcune funzioni).
Se mi date il codice completo provo anche quello. Ecco i risultati:
Windows XP (j2sdk1.4.2)
Java senza StringBuffer:
Creazione di stringhe 'ciao' + i	Elapsed: 3595 ms
Creazione di stringhe += 'c' + i	Elapsed: 9534 ms
Find first of				Elapsed: 451 ms
Substring(2,3)				Elapsed: 4717 ms
------------------------------------------------------------
Java con StringBuffer:
Creazione di stringhe 'ciao' + i	Elapsed: 3505 ms
Creazione di stringhe += 'c' + i	Elapsed: 31 ms
Find first of				Elapsed: 460 ms
Substring(2,3)				Elapsed: 30 ms
-----------------------------------------------------------
C# con Microsoft Framework 1.1:
Creazione di Stringhe 'ciao' + i	Elapsed: 2 secondi,864 ms (2864 ms)
Creazione di Stringhe += 'c' + i	Elapsed: 0 secondi, 40 ms
Find first of				Elapsed: 0 secondi, 320 ms
SubString(2,3)				Elapsed: 0 secondi, 30 ms
------------------------------------------------------------------
Linux (Kernel 2.6.3 - gcc 3.3.2 - j2sdk1.4.2)
Java senza StringBuffer:
Creazione di stringhe 'ciao' + i	Elapsed: 3523 ms
Creazione di stringhe += 'c' + i	Elapsed: 10423 ms
Find first of				Elapsed: 448 ms
Substring(2,3)				Elapsed: 5209 ms
-------------------------------------------------------------------
Java con StringBuffer:
 
Creazione di stringhe 'ciao' + i	Elapsed: 3537 ms
Creazione di stringhe += 'c' + i	Elapsed: 31 ms
Find first of				Elapsed: 460 ms
Substring(2,3)				Elapsed: 35 ms
-------------------------------------------------------------------
C# con Ximian Mono 0.30
Creazione di Stringhe 'ciao' + i	Elapsed: 10 secondi,738 ms
Creazione di Stringhe += 'c' + i	Elapsed: 0 secondi, 100 ms
Find first of				Elapsed: 0 secondi,625 ms
SubString(2,3)				Elapsed: 0 secondi, 78 ms
-------------------------------------------------------------------
Java ha pressocchè le stesse prestazioni su Win e Linux, mentre C# è
molto più lento su Linux che su Win. (P.S.: Il supporto è ancora
sperimentale).
Su Win C# ha prestazioni simili a Java.
Ecco il codice C#:
--------------------
using System;
using System.Text;
public class Test {
	public static void Main(String[] argv) {
		test_Stringhe();
	}
	static void test_Stringhe() {
	    long n = 5000000;
	    long t,t1,end,end1;
	    String s=null,el;
	    Console.WriteLine("\nCreazione di Stringhe 'ciao' + i ");
	    t = DateTime.Now.Millisecond;
	    t1=DateTime.Now.Second;
	    for (int i = 0; i < n; i++) {
	      s = "ciao";
	      s += i;
	    }
	    Console.WriteLine(""+s);
	    end = DateTime.Now.Millisecond;
	    end1=DateTime.Now.Second;
	    if (end<t)
	    	el=(end1-t1-1)+" secondi,"+(1000+end-t)+" ms";
	    else
	    	el=(end1-t1)+" secondi, "+(end-t)+" ms";
	    Console.WriteLine("Elapsed: " + el);
 
	    Console.WriteLine("\nCreazione di Stringhe += 'c' + i ");
	    t = DateTime.Now.Millisecond;
	    t1=DateTime.Now.Second;
	    StringBuilder sb = new StringBuilder();
	    for (int i = 0; i < n/100; i++) {
	      sb.Append('c').Append(i);
	      if (sb.Length > 10000) sb = new StringBuilder();
	    }
	    end = DateTime.Now.Millisecond;
	    end1=DateTime.Now.Second;
	    if (end<t)
	    	el=(end1-t1-1)+" secondi,"+(1000+end-t)+" ms";
	    else
	    	el=(end1-t1)+" secondi, "+(end-t)+" ms";
	    Console.WriteLine("Elapsed: " + el);
 
	    Console.WriteLine("\nFind first of");
	    t = DateTime.Now.Millisecond;
	    t1=DateTime.Now.Second;
	    String test = "trova la prima occorrenza";
	    for (int i = 0; i < n; i++) {
	      int k = test.IndexOf('c');
	    }
	    end = DateTime.Now.Millisecond;
	    end1=DateTime.Now.Second;
	    if (end<t)
	    	el=(end1-t1-1)+" secondi,"+(1000+end-t)+" ms";
	    else
	    	el=(end1-t1)+" secondi, "+(end-t)+" ms";
	    Console.WriteLine("Elapsed: " + el);
 
 
	    Console.WriteLine("\nSubString(2,3)");
	    t = DateTime.Now.Millisecond;
	    t1=DateTime.Now.Second;
	    String s1 = "";
	    String s2 = "abcdefghijk";
	    String s3 = "pqrstuvwxyz";
	    StringBuilder sBuf = new StringBuilder();
	    for (int i = 0; i < n/100; i++) {
	      if (i%2 == 0) s1 = s2.Substring(4,7);
	      else s1 = s3.Substring(4,7);
	      sBuf.Append(s);
	      if (sBuf.Length > 10000) sBuf = new StringBuilder();
	    }
	    end = DateTime.Now.Millisecond;
	    end1=DateTime.Now.Second;
	    if (end<t)
	    	el=(end1-t1-1)+" secondi,"+(1000+end-t)+" ms";
	    else
	    	el=(end1-t1)+" secondi, "+(end-t)+" ms";
	    Console.WriteLine("Elapsed: " + el);
	    }
}
-------------------------------------------------------------
-- 
Pietro	- 
http://www.pietroweb.tk
Linux Registered User #304991
Powered by MDK Linux Kernel 2.6.3