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

allora premetto che c'erano alcuni errori nei test precedenti...
il C++ partiva con la configurazione di debug !!! (arghh...)
e il Java senza alcun parametro della JVM
Ho introdotto i seguenti miglioramenti:
_________________:: Java   ::___________________
1) 3 ripetizioni di tutto il test per "scaldare" il compilatore Hot Spot
2) System.gc alla fine di ogni ciclo (questo prob. non serve o forse peggiora, bo?)
3) parametri JVM: -server -Xmx256m -Xms256m -XX:CompileThreshold=1000
_________________:: C++   ::___________________
1) 3 ripetizioni (prendo i migliori tempi, perchè dato che non libero la memoria le prestazioni
 solitamente peggiorano ad ogni ripetizione ;-)
2) parametri compilatore VC++6: nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
"_MBCS" /Fp"Release/milliseconds.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
(scusate ma siccome so usare solo VC++ non ho idea quali parametri si riferiscano solo al
compilatore...)
Riavvio del pc al termine di un test e chiusura di tutti i processi in background
Test Java
--------------------------
Assegnamento  Elapsed: 657 ms
Concatenazione  Elapsed: 1063 ms
Find first of  Elapsed: 110 ms
Sottostringhe  Elapsed: 531 ms
Creazione  Elapsed: 172 ms
--------------------------
Test C++
--------------------------
Assegnamento  Elapsed: 343 ms
Concatenazione  Elapsed: 641 ms
Find first of  Elapsed: 156 ms
Sottostringhe  Elapsed: 3000 ms
Creazione  Elapsed: 250 ms
--------------------------
Conclusione: sostanzialmente allineati, a parte il test sulle
sottostringhe del C++ (occorrerebbero ottimizzazioni C++)

package testspeed;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class FrameSpeed extends JFrame {
  JButton jButtonRun = new JButton();
  ArrayList listBigInside = new ArrayList();
  ArrayList listBigOutside = new ArrayList();
  ArrayList listSmall = new ArrayList();
  public FrameSpeed() {
    try {
      jbInit();
    }
    catch(Exception ex) {
      ex.printStackTrace();
    }
  }
  void jbInit() throws Exception {
    jButtonRun.setText("Go");
    jButtonRun.addActionListener(new FrameSpeed_jButtonRun_actionAdapter(this));
    this.getContentPane().add(jButtonRun);
  }
  public static void main(String[] args) {
    FrameSpeed sp = new FrameSpeed();
    sp.pack();
    sp.show();
  }
  void test_vs_java() {
    long t = System.currentTimeMillis();
    double va = 0.0001;
    for (int i = 1; i < 5000000; i++) {
      va += (((va*0.3*i)/(i*2))%17);
    }
    long end = System.currentTimeMillis();
    System.out.println("va is: "+va);
    System.out.println("Elapsed: "+(end-t)+" ms");
  }
  void test_mult_double() {
    long i, n;
    double f = 1;
    n = 5000005;
    System.out.println("Esecuzione di "+n+" mult & div");
    long t = System.currentTimeMillis();
    for (i = 2; i < n; i++) {
      f = (3.123456 * f ) / (Math.log(i));
      if (f < 0.0000001) f = 1;
    }
    long end = System.currentTimeMillis();
    System.out.println("f vale: " +  f);
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  void test_cubo() {
    int [][][]histogram = new int[256][256][256];
    System.out.println("Esecuzione di cubo");
    long t = System.currentTimeMillis();
    for (int i = 0; i < 256; i++) {
      for (int j = 0; j < 256; j++) {
        for (int z = 0; z < 256; z++) {
          histogram[i][j][z] = i+j+z;
        }
      }
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  void test_stringhe() {
    int n = 5000000;
    for (int i = 0; i < 3; i++) {
      System.out.println("\nRun test "+i);
      System.out.println("--------------------------");
      string_assegnamento(n / 10);
      string_concat(n);
      string_trova(n);
      string_estrai(n);
      crea_stringhe(n / 5);
      System.out.println("--------------------------");
//      System.gc();
    }
  }
  private void string_estrai(int n) {
    long t;
    long end;
    System.out.print("\nSottostringhe \t");
    String s1 = "";
    String s2 = "abcdefghijk";
    String s3 = "pqrstuvwxyz";
    StringBuffer sBuf = new StringBuffer();
    t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      if (i%2 == 0) s1 = s2.substring(4,7);
      else s1 = s3.substring(4,7);
      sBuf.append(s1);
      if (sBuf.length() > 10000) sBuf = new StringBuffer();
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  private void string_trova(int n) {
    long t,end;
    System.out.print("\nFind first of \t");
    String test = "trova la prima occorrenza";
    t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      int k = test.indexOf('c');
      if (k>0) {}
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  private void string_concat(int n) {
    long t,end;
    System.out.print("\nConcatenazione \t");
    StringBuffer sb = new StringBuffer();
    t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      sb.append('c').append(i);
      if (sb.length() > 10000) sb = new StringBuffer();
    }
    end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  private void string_assegnamento(int n) {
    String s = "";
    String s2 = "";
    String s3 = "";
    System.out.print("\nAssegnamento \t");
    long t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      s = "ciao"+i;
      s2 = s + i;
      s3 = s2 + i;
      s = s3 + i;
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  void crea_stringhe(int n) {
    String s[] = new String[n];
    System.out.print("\nCreazione \t");
    long t = System.currentTimeMillis();
    for (int i = 0; i < n; i++) {
      s[i] = new String("andrea");
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  class SmallClass2 {
        int k;
        double dob;
        String name;
        String cognome;
        SmallClass2(int i, double d, String n, String cog) {
          k = i;
          dob = d;
          name = n;
          cognome = cog;
        }
        int getID() { return k; }
};
      class BigClass {
        String name;
        String cognome;
        SmallClass2 sm1;
        SmallClass2 sm2;
        SmallClass2 sm3;
        String p;
        int k;
        BigClass(String n, String cog, int i, double d) {
          k = i;
          name = n;
          cognome = cog;
          sm1 = new SmallClass2(i, d, n, cog);
          sm2 = new SmallClass2(i, d, n, cog);
          sm3 = new SmallClass2(i, d, n, cog);
          p = "Pluto";
        }
        int getID() { return k; }
      };
  void jButtonRun_actionPerformed(ActionEvent e) {
//    test_radice();
//    test_mult_double();
//    test_vs_java();
//    test_cubo();
    test_stringhe();
//    crea_stringhe();
//    crea_small_class();
//    crea_big_class();
//    test_if_then_else();
  }
  void crea_small_class() {
    System.out.println("\nCrea SmallClass");
    long t = System.currentTimeMillis();
    long tot = 0;
    for (int i = 1; i < 50000; i++) {
      SmallClass2 small = new SmallClass2(i,0.123,"andrea","tinto");
      tot += small.getID();
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  void crea_big_class() {
    System.out.println("\nCrea BigClass");
    long t = System.currentTimeMillis();
    long tot = 0;
    for (int i = 1; i < 50000; i++) {
      BigClass big = new BigClass("andrea","tinto",i,0.123);
      tot += big.getID();
    }
    long end = System.currentTimeMillis();
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
void test_if_then_else() {
    long n = 5000000;
    System.out.println(" Esecuzione di "+n+" if-then-else \n");
    long t = System.currentTimeMillis();
    int k = 0;
    for (int i = 0; i < n; i++) {
      if (i % 10 == 0) {
        if (i % 5 == 0) k -= 5;
        else k += 1;
      }
      else {
        if (i % 4 == 0) k -= 4;
        else k += 1;
      }
    }
    long end = System.currentTimeMillis();
    System.out.println("k vale: "+k);
    System.out.println("Elapsed: " + (end - t) + " ms");
  }
  void test_radice() {
    long i, n, result;
    double f = 45.35, d = 45.35;
    long start, finish;
    n = 5000000;
    System.out.println(" Esecuzione di " + n + " radici quadrate ... \n");
    start = System.currentTimeMillis();
    for (i = 0; i < n; i++) {
      f = Math.sqrt(d+f);
    }
    finish = System.currentTimeMillis();
    result = (finish - start);
    System.out.println(" Tempo trascorso in ms: " + result);
  }
}
class FrameSpeed_jButtonRun_actionAdapter implements java.awt.event.ActionListener {
  FrameSpeed adaptee;
  FrameSpeed_jButtonRun_actionAdapter(FrameSpeed adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButtonRun_actionPerformed(e);
  }
}

------------------------------ test.cpp ---------------------------------------------
#include <string>
#include "TestString.h"
void main( void )
{
 TestString testString;
 int n = 5000000;
 for (int i=0; i<3; i++) {
  printf("\nRun test %d\n",i);
  printf("--------------------------\n");
  testString.assegnamento(n/10);
  testString.concat(n);
  testString.trova(n);
  testString.estrai(n);
  testString.crea(n/5);
  printf("--------------------------\n");
 }
}
--------------------------------------- TestString.h -------------------------------------
class TestString {
public:
 void crea(int n);
 void assegnamento(int n);
 void concat(int n);
 void trova(int n);
 void estrai(int n);
};
------------------------------------- TestString.cpp ----------------------------------------
#include "TestString.h"
#include <time.h>
#include <stdio.h>
#include <string>
void TestString::crea(int n) {
 long i;
 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);
}
void TestString::assegnamento(int n) {
 clock_t start,finish;
 double result;
 std::string s, s2, s3;
 printf(" Assegnamento \n", n);
 start = clock();
 for (int i=0; i<n; i++) {
  s = "ciao";
  s += i;
  s2 = s;
  s2 += i;
  s3 = s2;
  s3 += i;
  s = s3;
  s += i;
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
}
void TestString::concat(int n) {
 int i;
 std::string s;
 clock_t start,finish;
 double result;
 printf(" Concatenazione \n", n);
 start = clock();
 for (i=0; i<n; 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);
}
void TestString::trova(int n) {
 int i;
 std::string s;
 clock_t start,finish;
 double result;
 printf(" 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');
  if (k>0) {}
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
}
void TestString::estrai(int n) {
 int i;
 clock_t start,finish;
 double result;
 printf(" Sottostringhe \n", n);
 std::string s1 = "";
 std::string s2 = "abcdefghijk";
 std::string s3 = "pqrstuvwxyz";
 std::string sBuf = "";
 start = clock();
 for (i=0; i<n; i++) {
  if (i%2 == 0) s1 = s2.substr(4,7);
  else s1 = s3.substr(4,7);
  sBuf += s1;
  if (sBuf.length() > 10000) sBuf = "";
 }
 finish = clock();
 result = finish-start;
 printf(" Tempo trascorso in ms %2.9f\n\n ", result);
}

ah dimenticavo uso WindowsXp Home edition
j2re1.4.2
Athlon XP2600 512ram
compilatore VC++6 (vecchiotto)