Newsgroup: it.lavoro.informatica
Titolo: java vs c++ - gmp

 
 
E a grande richiesta,come qualcuno ha voluto,posto un bel confronto gmp.
Per esattezza gmp e' solo una libreria non una funzionalita.
Le funzionalita le vengono date da tre concetti che sono implementati:
 
mpz_t  --> integer
mpq_t  --> rational
mpf_t  --> floating
 
Il benchmark,usando l'algoritmo pigreco postato in "java  vs c++ 
bigdecimal",usa solo mpf_t, lo stesso che usa c++ (la classe mpf_class 
e' un  wrapper su mpf_t)
 
Il programma c++ e' lo stesso del precedente benchmark ed idem per la 
versione java,compilatore c++ e piattaforma.
Per le gmp in java dopo un po di ricerche e provato compilazione e di 
qualcuna l'uso (qualcosa di orribile,la documentazione e' praticamente 
inesistente
e le build sono pure buggate) pur con qualche problema ho scelto queste:
 
https://github.com/Arnaud-Nauwynck/JNI-wrapper-for-GMP-Gnu-Multi-Precision-Library
 
 
Ho corretto un bug nel Makefile a livello di linker ed aggiunto -O2 per 
l'ottimizzazione  ma mi sono dovuto compilare la parte java nonche 
creare il jar in quanto il Makefile non forniva questa funzionalita.
Ma comunque ho ottenuto un risultato funzionante.
 
 
--- pi.java --
import org.gnu.gmp.swig.*;
 
public class pi {
 
	private static void print(String s,int n) {
		if (s.length() < n)
			n=s.length();
		if (n < 3)  {
  			System.out.println(s);
			return;
		}
		System.out.println(s.substring(0,1));
		int j=1;
		for (int i=1;i < n;++i) {
			System.out.print(s.charAt(i));
			if (j % 10 == 0)
				System.out.print(" ");
			if (j % 170 == 0)
				System.out.println();
			++j;			
		}
		System.out.println();
	}
 
 
	private static String str(final MPF v,final long n) {
		int[] exp = new int[1];
		return v.get_str(exp,1,n);
	}
 
 
	private static MPF assign(final int n,final long prec) {
		MPF v=new MPF();
		v.set_prec(prec);
		v.set_si(n);
		return v;
	}
 
     private static MPF div(int n1,int n2) {
		MPQ m = new MPQ(n1,n2);
		MPF r=new MPF();
	    r.set_q(m);
		m.dispose();
		return r;
	}
 
     private static MPF div(final MPF v1,final int v2,final long prec) {
		MPF r = new MPF();
		r.set_prec(prec);
		r.set_div_ui(v1,v2);
		return r;
	}
     private static MPF div(final MPF v1,final MPF v2,final long prec) {
		MPF r = new MPF();
		r.set_prec(prec);
		r.set_div(v1,v2);
		return r;
	}
 
	private static MPF sub(final MPF v1,final MPF v2,final long prec) {
		MPF r = new MPF();
		r.set_prec(prec);
		r.set_sub(v1,v2);
		return r;	
	}
 
	private static void self_sub(MPF v1,final MPF v2) {
		v1.set_sub(v1,v2);
	}
 
	private static void self_mul(MPF v1,final MPF v2) {
		v1.set_mul(v1,v2);	
	}
 
	private static MPF mul(final MPF v1,final MPF v2,final long prec) {
		MPF r = new MPF();
		r.set_prec(prec);
		r.set_mul(v1,v2);
		return r;	
	}
 
	private static MPF add(final MPF v1,final MPF v2,final long prec) {
		MPF r = new MPF();
		r.set_prec(prec);
		r.set_add(v1,v2);
		return r;	
	}
 
	private static void self_add(MPF v1,final MPF v2) {
		v1.set_add(v1,v2);
	}
 
 
	public static void main(String args[]){
		final int n=Integer.parseInt(args[0]);
		final boolean isprint=Integer.parseInt(args[1]) != 0;
		final long  bit_precision=n * 8;
         	final MPF n16=div(1,16);
  		final MPF n1=assign(1,bit_precision);
		final MPF n2=assign(2,bit_precision);
		final MPF n4=assign(4,bit_precision);
		MPF s=assign(0,bit_precision);
		MPF powi=assign(1,bit_precision);
		int n8=0;
		for (int i=0;i < n;++i) {
			if (i != 0) {
				self_mul(powi,n16);
				n8 += 8;
			}
             		MPF t=div(n4,n8 + 1,bit_precision);
			final MPF b=div(n2,n8 + 4,bit_precision);
			final MPF c=div(n1,n8 + 5,bit_precision);
			final MPF d=div(n1,n8 + 6,bit_precision);
			self_sub(t,b);
			self_sub(t,c);
			self_sub(t,d);
			self_mul(t,powi);
			self_add(s,t);
		}
		if (isprint)
			print(str(s,n),n);
	}
};
 
 
--- pi.sh --
#!/bin/bash
JAVA_HOME=/opt/jdk1.8.0_192
export PATH="$JAVA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$JAVA_HOME/lib:$LD_LIBRARY_PATH"
rm -f a.out *.class *.o
javac -version
javac  -O -cp org.gnu.gmp.swig.jar pi.java
g++-8 --version
g++-8 -std=c++17 -Wall -O2 pi.cpp  -lgmp -lgmpxx
for n in  10 100 1000 10000
do
	time java -Djava.library.path=. -cp org.gnu.gmp.swig.jar:. pi  $n 0
	time ./a.out $n 0
done
 
-- esecuzione --
+ JAVA_HOME=/opt/jdk1.8.0_192
+ export PATH=/opt/jdk1.8.0_192/bin:...
+ PATH=/opt/jdk1.8.0_192/bin:...
+ export LD_LIBRARY_PATH=/opt/jdk1.8.0_192/lib:
+ LD_LIBRARY_PATH=/opt/jdk1.8.0_192/lib:
+ rm -f a.out pi.class '*.o'
+ javac -version
javac 1.8.0_192
+ javac -O -cp org.gnu.gmp.swig.jar pi.java
+ g++-8 --version
g++-8 (Ubuntu 8.2.0-1ubuntu2~18.04) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
+ g++-8 -std=c++17 -Wall -O2 pi.cpp -lgmp -lgmpxx
+ for n in 10 100 1000 10000
+ java -Djava.library.path=. -cp org.gnu.gmp.swig.jar:. pi 10 0
Loaded System.library gmpjni for MPQ
Loaded System.library gmpjni for MPF
 
real	0m0,056s
user	0m0,049s
sys	0m0,009s
+ ./a.out 10 0
 
real	0m0,001s
user	0m0,001s
sys	0m0,000s
+ for n in 10 100 1000 10000
+ java -Djava.library.path=. -cp org.gnu.gmp.swig.jar:. pi 100 0
Loaded System.library gmpjni for MPQ
Loaded System.library gmpjni for MPF
 
real	0m0,055s
user	0m0,045s
sys	0m0,016s
+ ./a.out 100 0
 
real	0m0,001s
user	0m0,001s
sys	0m0,000s
+ for n in 10 100 1000 10000
+ java -Djava.library.path=. -cp org.gnu.gmp.swig.jar:. pi 1000 0
Loaded System.library gmpjni for MPQ
Loaded System.library gmpjni for MPF
 
real	0m0,072s
user	0m0,070s
sys	0m0,008s
+ ./a.out 1000 0
 
real	0m0,005s
user	0m0,005s
sys	0m0,000s
+ for n in 10 100 1000 10000
+ java -Djava.library.path=. -cp org.gnu.gmp.swig.jar:. pi 10000 0
Loaded System.library gmpjni for MPQ
Loaded System.library gmpjni for MPF
 
real	0m2,674s
user	0m2,560s
sys	0m0,116s
+ ./a.out 10000 0
 
real	0m0,295s
user	0m0,295s
sys	0m0,000s

 E a grande richiesta,come qualcuno ha voluto,posto un bel confronto gmp.
 
ROTFL... ma vattenaffanculo.

 
 
 
Belle le rosiche
Quali mai piu grandi soddisfazioni possono portare le rosiche di codesto 
individuo.
Per questo non c'e prezzo,per il resto c'e ... (nota pubblicita)
 

 Belle le rosiche
 
ROTFL :) Ma quale "rosiche", imbecille? Cosa significherebbe, poi, "rosica" sostantivo? Che cos'e` che dovrebbe farmi rosicare? Guarda che dei risultati di certi benchmark non me ne fotte una beata mazza. Ti qualificano per quel che sei: un cretino incompetente. 
Hai persino la presunzione di esordire con un "a grande richiesta"? :D
Hai gia` dimostrato di non capirci un cazzo, di sviluppo software, parli di Java come un linguaggi per scrivere "servizi utente", e pretendi ancora di avere un briciolo di credibilita`? Sparacazzate masochista che non sei altro :D

 E a grande richiesta,
 
organizziamo una colletta per pagarti una donnuccia, mi sa che ne hai 
bisogno.
oppure preferisci un toy boy? scegli te.

Il 17/02/19 11:32, rootkit ha scritto:

Non eri stato proprio tu ad affermare che era meglio una comparazione 
tra gmp java e gmp c++ ?
Ti ho accontentato e questo e' il ringraziamento ?
 

Il 17/02/19 11:00, 4ndre4 ha scritto:

Ribadisco,per le rosiche non c'e prezzo,per il resto...
 

 Ti ho accontentato e questo e' il ringraziamento ?
 
vah che saremo generosi, eh. mica ti procuriamo roba dozzinale. 
vedrai che una volta provata ti si aprirà un mondo e questi "benchmark" 
ti appariranno per quello che sono.
 

 
 
Per le figuracce di merda, c'è enoquick
 

 Ribadisco,per le rosiche non c'e prezzo,per il resto...
 
Ribadiso: 


 e' un  wrapper su mpf_t)
 
Solo che la versione java sembra scritta da una proscimmia, piuttosto 
giovane ed inesperta.
Ma se piace a te, a me va bene.

Il 18/02/19 05:36, Dr.UgoGagliardelli ha scritto:

Il programma che ho fatto ?
 

 
 
Per il nulla ci sei tu
 

Il 18/02/19 05:36, Dr.UgoGagliardelli ha scritto:

Stamattina quando ti risposto avevo fretta
Ecco la risposta completa e gentile:
 
Non avevo voglio di scrivere un wrapper su MPF se e' questo quello che 
intenti
Ed il programma e' solo un benchmark non un programma per insegnare a 
progettare sw.
 
Ed ora la risposta non gentile:
mke2fs
 

 progettare sw.
 
Come dicevo, se piace a te a me va bene.
Poi mi spieghi la logica secondo la quale un cosiddetto benchmark, 
basato su un programma fatto alla cazzo di cane, possa avere una qualche 
validita' scientifca.
A me e' sembrato un modo per alimentare l'entropia. Per quanto possa 
valere, quella che ho espresso e' meramente la mia opinione, che potra' 
non piacerti, ma finche' qualcuno non mi dira' che non posso farlo, la 
esprimo.
 

 progettare sw.
 
Un programma scritto alla cazzo di cane, non un benchmark. Senza nessun valore, come il resto degli esperimentini con cui ti sei felicemente masturbato.

 validita' scientifca.
 
Il programma non e' proprio fatto alla cazzo di cane
Invece che un classe wrapper usa delle normali funzioni statiche
Questo non pregiudica il benchmark


 Il programma non e' proprio fatto alla cazzo di cane
 
Ah no, eh? :)

Il 19/02/19 01:49, 4ndre4 ha scritto:

Ma va che ti ho fatto un favore
Ora puoi usare le gmp sotto java.
Ti fai delle belle classi sui vari MP* e sei a posto.
O speravi che te li facessi io?
Ho gia perso troppo tempo in java per accontentare qualcuno.
 

 Ma va che ti ho fatto un favore
 
Fai un favore a te stesso e smetti di scrivere stupidaggini.

 sys    0m0,000s
 
quindi java perde il confronto sempre in questo test, giusto?
 

 quindi java perde il confronto sempre in questo test, giusto?
 
"Pvvvvonti?"
"enoquick, e` lei?"
 
(cit.)
 

Il 20/02/19 05:28, Kalium ha scritto:

sembrerebbe,d'altronte lo avevo gia affermato in passato che usando 
l'heap per forza e lo strato JNI avrebbe fatto perdere in performance.
Magari agendo sullo strato JNI qualcosa si puo ottimizzare.
 

Il 20/02/19 06:18, 4ndre4 ha scritto:

O come e' bello rosicar...
 

 O come e' bello rosicar...
 
LOL :) Ma rosicare cosa? Rosicare de che? Tu faresti rosicare me? Continua a sognare. 

 sembrerebbe,
 
LOL :) Adesso corri a risponderti come Kalium.