Java: byte to 8 boolean

aaaaaaaaa

Re:Java: byte to 8 boolean
« Odpověď #45 kdy: 13. 03. 2014, 00:14:22 »
Pre info: Java ME Embedded dokaze bezat na 192 KB RAM. Tym sa mysli aj viac ako hello world. Je pravda, ze to nie je Java SE, ale od takeho maleho runtime snad nikto necaka ovela viac ako od c runtime.


Re:Java: byte to 8 boolean
« Odpověď #46 kdy: 13. 03. 2014, 07:00:00 »
1) Hello world sežere v C++ 156 KB. Java SE Embedded? Nepoužívám, nejsem schopen říci kolik bere paměti.
2) Musel bych dokázat zpomalení? xD Důkaz je skoro každá aplikace napsaná v Javě xDD
3) Radši nic, nebo bych zas hodil nějakou osobní invektivu xD ...
Aha, takže nevíte, důkazy nemáte, a ještě si sám protiřečíte. To jsou opravdu pádné důvody pro způsob, jakým tady vystupujete. Čeština pro to má hezké rčení: prázdný sud nejvíc duní.

technomaniak

Re:Java: byte to 8 boolean
« Odpověď #47 kdy: 13. 03. 2014, 07:12:57 »
1) Hello world sežere v C++ 156 KB. Java SE Embedded? Nepoužívám, nejsem schopen říci kolik bere paměti.
2) Musel bych dokázat zpomalení? xD Důkaz je skoro každá aplikace napsaná v Javě xDD
3) Radši nic, nebo bych zas hodil nějakou osobní invektivu xD ...
Aha, takže nevíte, důkazy nemáte, a ještě si sám protiřečíte. To jsou opravdu pádné důvody pro způsob, jakým tady vystupujete. Čeština pro to má hezké rčení: prázdný sud nejvíc duní.

Rád bych získal vysvětlení, že co tu předvádíte se dotýká tématu  : Java: byte to 8 boolean ;D Trochu mi to připomíná diskuzi teenagerů kdo ho má většího, či kdo se dostal více pičkám mezi stehna. .... 8)

PS. já sám programuji pro zábavu a hlavně z 99% jenom v Javě ale
- zkoušel jste někdo násobení matic (datových typu int) třeba  matice A 20000x20000 s nasobením matice B 20000x20000 v C vs čistě Java(bez JNI) na stejném stroji? Zde je Java skutečně skoro 2x pomalejší. A dle mnou provedených pokusů není problém vysledovat lineární závislost zpomalení na velikosti matic. Není problém vám tu lupnost triviální zdroje ať si to ověříte a budu vděčen když mi někdo ukážete jakoukoliv možnost jak to zrychlit aby to bylo konkurenceschopné.

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #48 kdy: 13. 03. 2014, 08:55:39 »
- zkoušel jste někdo násobení matic (datových typu int) třeba  matice A 20000x20000 s nasobením matice B 20000x20000 v C vs čistě Java(bez JNI) na stejném stroji? Zde je Java skutečně skoro 2x pomalejší. A dle mnou provedených pokusů není problém vysledovat lineární závislost zpomalení na velikosti matic. Není problém vám tu lupnost triviální zdroje ať si to ověříte a budu vděčen když mi někdo ukážete jakoukoliv možnost jak to zrychlit aby to bylo konkurenceschopné.

V jiném vlákně jsem zkoušel počítat RMSD (viz http://forum.root.cz/index.php?topic=8163.msg84097#msg84097). Začal jsem s časy: Java: 14.984s, C++/icc: 5.58s, C++/g++: 2.64s. A nakonec jsme to u Javy stáhli až na 4.23s.

V Javě jsou pole trochu o něčem jiném, takže bych začal tím, že bych tu matici reprezentoval jedním polem.

Re:Java: byte to 8 boolean
« Odpověď #49 kdy: 13. 03. 2014, 09:04:35 »
budu vděčen když mi někdo ukážete jakoukoliv možnost jak to zrychlit aby to bylo konkurenceschopné.
Obvyklý postup, jak něco zrychlit, je použít vhodný nástroj. Třeba pojídání polévky zrychlíte tak, že odložíte vidličku a místo ní použijete lžíci. Až se po polévce pustíte do řízku, je zase dobré místo lžíce použít vidličku. Na různé věci se totiž hodí různé nástroje – to, že použijete špatný nástroj, není chyba toho nástroje. Pokud někdo jí polévku vidličkou a usuzuje z toho, že vidlička je pomalá, je to především jeho hloupost.

Pokud potřebujete násobit velké matice, použijte k tomu výpočty na GPU. Volat je můžete jak z C tak z Javy.


Pavel Tisnovsky

Re:Java: byte to 8 boolean
« Odpověď #50 kdy: 13. 03. 2014, 09:47:23 »
PS. já sám programuji pro zábavu a hlavně z 99% jenom v Javě ale
- zkoušel jste někdo násobení matic (datových typu int) třeba  matice A 20000x20000 s nasobením matice B 20000x20000 v C vs čistě Java(bez JNI) na stejném stroji? Zde je Java skutečně skoro 2x pomalejší. A dle mnou provedených pokusů není problém vysledovat lineární závislost zpomalení na velikosti matic. Není problém vám tu lupnost triviální zdroje ať si to ověříte a budu vděčen když mi někdo ukážete jakoukoliv možnost jak to zrychlit aby to bylo konkurenceschopné.

Ja bych se na to rad podival, pokud se pouzivaji "normalni" matice v Jave, tak tady prostor pro urychleni pravdepodobne bude.

q

Re:Java: byte to 8 boolean
« Odpověď #51 kdy: 13. 03. 2014, 11:59:37 »
PS. já sám programuji pro zábavu a hlavně z 99% jenom v Javě ale
- zkoušel jste někdo násobení matic (datových typu int) třeba  matice A 20000x20000 s nasobením matice B 20000x20000 v C vs čistě Java(bez JNI) na stejném stroji? Zde je Java skutečně skoro 2x pomalejší.
Talk is cheap, show me the code ;-).

NotBeginner

Re:Java: byte to 8 boolean
« Odpověď #52 kdy: 13. 03. 2014, 12:10:47 »
Tak začneme : program který vygeneruje soubor obsahujici matici nahodných cisel
Pozn. nezapomět nastavit v Java pri spoustění parametr -Xmx  + hlavně při větších maticích je nutná větší RAM
(viz. např. Java  pro jednu matici v paměti : 20 000 * 20 000 = 400 000 000 * 4byte(int) = 1matice(1,6GB RAM) +prostředí + Windows atd..)
Kód: [Vybrat]
import java.util.*;
import java.io.*;
public class B02_GeneratorMaticInt {
@SuppressWarnings("resource")
private static int nacteniVelikosti() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Celociselne Cislo :");
int n = key.nextInt();
return n; }
@SuppressWarnings("resource")
private static String nacteniNazvu() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Nazev souboru :");
String jmeno = key.nextLine();
return jmeno; }
private static int [][] vygenerovaniMatice(int velikost){
int [][] matice = new int [velikost][velikost];
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
matice[i][j] = (int) (Math.random() * 9); } } // matici naplnime hodnotami od 0 do 9
return matice; }
private static void ulozeniMatice(String s, int [][] matice) {
File NazevSoub = new File(s);
FileWriter ZapisovaciSoubor = null;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
try {
ZapisovaciSoubor = new FileWriter(NazevSoub); }
catch (IOException e) {
System.out.println("Nepodarilo se vytvorit soubor ");
e.printStackTrace(); }
try {
ZapisovaciSoubor.write(matice.length+radek);
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
ZapisovaciSoubor.write(matice[i][j]+" "); }
ZapisovaciSoubor.write(radek); } }
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try {
ZapisovaciSoubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } } // uzavreme soubor
@SuppressWarnings("unused")
private static void tiskMatice(int [][] matice) {
System.out.println("Zde je vypsana matice");
for (int i = 0; i < matice.length; i++) {
for (int j = 0; j < matice[i].length; j++) {
System.out.format("%d ", matice[i][j]); }
System.out.println(); } }
public static void main(String [] args) {
String jmenoSouboru;
int velikost;
System.out.println("Program pro vygenerovani matic a jejich ulozeni do souboru");
System.out.println("Vlozte velikost matice - cele cislo (bez desetinne carky)");
while(true) { // nekonecna smycka
try{
velikost=nacteniVelikosti(); break; }
catch(RuntimeException E){ System.err.print("Vstup neni celociselne cislo"); } }
System.out.println("Vlozte prosim jmeno souboru do ktereho chcete provest ulozeni vygenerovane matice");
while(true) { // nekonecna smycka
try {
jmenoSouboru = nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
int [][] Matice;
Matice = vygenerovaniMatice(velikost);
//tiskMatice(Matice); // pro kontrolu
ulozeniMatice(jmenoSouboru,Matice);
}
}

Zde je zdrojak v Cčku, který je schopen načíst námi vygenerovaný soubor
Kód: [Vybrat]
#include<stdio.h>
#include<time.h>
main(){
clock_t startCteni1,konecCteni1,startCteni2,konecCteni2,startNasob,konecNasob,startZapis,konecZapis;
printf("Program na vypocet nasobeni matic\n");
char nazevSouboru1 [15];
printf("Vlozte jmeno souboru pro matici 1 :");
scanf("%15s",nazevSouboru1);  // pozor cteme pouze prvnich 15 znaku  --- %15s
char nazevSouboru2 [15];
printf("Vlozte jmeno souboru pro matici 2 :");
scanf("%15s",nazevSouboru2);  // pozor cteme pouze prvnich 15 znaku  --- %15s
FILE *fr1,*fr2;
fr1 = fopen(nazevSouboru1,"r"); // nacteme soubor 1
int velikost1,velikost2;
fscanf(fr1,"%i",&velikost1);
printf("Zde je prvni cislo : %i\n",velikost1);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI A pointeru na pointer **/
int i,j,k;
int **maticeA;
maticeA=(int**)malloc(velikost1*sizeof(int*));
for(i=0;i<velikost1;i++) {
maticeA[i]=(int*)malloc(velikost1*sizeof(int)); }
/************* Nacitame matici A *******************/
printf("Nacitame matici 1\n");
startCteni1=clock();
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost1;j++){
fscanf(fr1,"%i",&maticeA[i][j]); } }
konecCteni1=clock();
printf("Nacitani prvni matice trvalo %6.2f sec\n",(konecCteni1-startCteni1)/(double) CLOCKS_PER_SEC);
/*printf("Zde je nactena matice A\n");
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost1;j++) {
printf("%i ",maticeA[i][j]); }
printf("\n"); }*/
fclose(fr1);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI B pointeru na pointer **/
fr2 = fopen(nazevSouboru2,"r"); // nacteme soubor 1
fscanf(fr2,"%i",&velikost2);
int **maticeB;
maticeB=(int**)malloc(velikost2*sizeof(int*));
for(i=0;i<velikost2;i++) {
maticeB[i]=(int*)malloc(velikost1*sizeof(int)); }
/************* Nacitame matici B *******************/
printf("Nacitame matici 2\n");
startCteni2=clock();
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++){
fscanf(fr2,"%i",&maticeB[i][j]); } }
konecCteni2=clock();
printf("Nacitani druhe matice trvalo %6.2f sec\n",(konecCteni2-startCteni2)/(double) CLOCKS_PER_SEC);
/*printf("Zde je nactena matice B\n");
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++) {
printf("%i ",maticeB[i][j]); }
printf("\n"); }*/
fclose(fr2);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI C pointeru na pointer **/
printf("Provadime nasobeni matic \n");
int **maticeC;
maticeC=(int**)malloc(velikost1*sizeof(int*));
for(i=0;i<velikost2;i++) {
maticeC[i]=(int*)malloc(velikost2*sizeof(int)); }
/************* Nasobime matici A x B = vznik matice C *******************/
startNasob=clock();
for(i=0;i<velikost1;i++) { // cyklus pro nasobeni matic
for(j=0;j<velikost2;j++) {
maticeC[i][j] = 0;
for(k=0;k<velikost1;k++) {
maticeC[i][j]=maticeC[i][j] + maticeA[i][k] * maticeB[k][j]; } } }
konecNasob = clock();
printf("Doba nasobeni matice %6.2f sec\n",(konecNasob-startNasob)/(double) CLOCKS_PER_SEC);
/*printf("Zde je vypoctena matice\n");
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost2;j++) {
printf("%i ",maticeC[i][j]); }
printf("\n"); }*/
/****************** Ulozime matici do Souboru ***************************/
free(maticeA);maticeA=NULL; // vymazeme hodnoty a referenci
free(maticeB);maticeB=NULL; // vymazeme hodnoty a referenci
char nazevSouboru3 [15];
printf("Vlozte jmeno souboru pro matici 3 (vyslednou):");
scanf("%15s",nazevSouboru3);  // pozor cteme pouze prvnich 15 znaku  --- %15s
FILE *fr3;
fr3 = fopen(nazevSouboru3,"w"); // nacteme soubor 1
fprintf(fr3,"%i\n",velikost1); // ulozime rad matice
startZapis =clock();
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++) {
fprintf(fr3,"%i ",maticeC[i][j]); }
fprintf(fr3,"\n"); }
konecZapis = clock();
printf("Doba ukladani matice %6.2f sec\n",(konecZapis-startZapis)/(double) CLOCKS_PER_SEC);
fclose(fr3);
free(maticeC);maticeC=NULL; // vymazeme hodnoty a referenci
printf("Program ukoncite stiknutim libovolne klavesy");
getch(); // cekame na stiknuti klavesnice
}

A zde je ten naprosto identický kód v Javě

Kód: [Vybrat]
import java.io.*;
import java.util.*;
public class B05_NasobeniMaticInt {
@SuppressWarnings("resource")
private String nacteniNazvu() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Nazev souboru :");
String jmeno = key.nextLine();
return jmeno; }
private int [][] nacteniMatice(String s) {
File NazevSoub = new File(s);
FileReader CteciSoubor=null;
BufferedReader Soubor=null;
int velikost;
try { //Zkousime otevrit pripojeni k souboru
CteciSoubor = new FileReader(NazevSoub);
Soubor = new BufferedReader(CteciSoubor); }
catch (IOException e) {
System.out.println("Nepodarilo se otevri soubor pro cteni");
e.printStackTrace(); }
int [][] matice = null;
try { // Zkusime nacist hodnoty
String retezec = Soubor.readLine(); // nacteme prvni radek kde je pouze velikost matice
velikost = Integer.valueOf(retezec).intValue(); // prevedem velikost na integer
matice = new int [velikost][velikost];
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
retezec = Soubor.readLine();  // nacteme do stringu cely radek
String [] podretezce = retezec.split(" ");  // vytvorime pole hodnot
for(int j=0;j<matice[i].length;j++) {
matice[i][j] = Integer.valueOf(podretezce[j]).intValue(); } } }  // Prevedeme jednotlive prvky pole stringu na integer do jednotlivych casti poli
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try { // Zkusime uzavrit pripojeni k souboru
CteciSoubor.close();
Soubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } // uzavreme soubor
return matice; }
@SuppressWarnings("unused")
private void tiskMatice(int [][] matice) {
System.out.println("Zde je vypsana matice");
for (int i = 0; i < matice.length; i++) {
for (int j = 0; j < matice[i].length; j++) {
System.out.format("%d ", matice[i][j]); }
System.out.println(); } }
private int [][] nasobeniMatic(int [][] maticeA,int [][] maticeB) {
int [][] maticeNasob=new int [maticeA.length][maticeB[0].length]; // u vysledne matice rozhoduji sloupce a pak radky
for(int i=0;i<maticeNasob.length;i++) { // cyklus pro nasobeni matic
for(int j=0;j<maticeNasob[i].length;j++) {
maticeNasob[i][j] = 0;
for(int k=0;k<maticeNasob.length;k++) {
maticeNasob[i][j]=maticeNasob[i][j] + maticeA[i][k] * maticeB[k][j]; } } }
return maticeNasob; }
private void ulozeniMatice(String s, int [][] matice) {
File NazevSoub = new File(s);
FileWriter ZapisovaciSoubor = null;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
try {
ZapisovaciSoubor = new FileWriter(NazevSoub); }
catch (IOException e) {
System.out.println("Nepodarilo se vytvorit soubor ");
e.printStackTrace(); }
try {
ZapisovaciSoubor.write(matice.length+radek);
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
ZapisovaciSoubor.write(matice[i][j]+" "); }
ZapisovaciSoubor.write(radek); } }
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try {
ZapisovaciSoubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } } // uzavreme soubor
@SuppressWarnings("unused")
public static void main(String [] args) {
B05_NasobeniMaticInt objekt = new B05_NasobeniMaticInt();
System.out.println("Program pro nasobeni matic integeru pro nacitani ze souboru");
String jmenoSouboru1,jmenoSouboru2,jmenoSouboru3;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 1");
while(true) { // nekonecna smycka
try {
jmenoSouboru1 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 2");
while(true) { // nekonecna smycka
try {
jmenoSouboru2 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
System.out.println("Provedem nacteni matice do pole :");
int [][] MaticeA,MaticeB,MaticeZnasobena;
long nacteni1 = System.currentTimeMillis();
MaticeA = objekt.nacteniMatice(jmenoSouboru1);
//tiskMatice(MaticeA); // pro kontrolu
long nacteni2 = System.currentTimeMillis();
MaticeB = objekt.nacteniMatice(jmenoSouboru2);
long nactenikonec = System.currentTimeMillis();
System.out.println("Nacitani matice prvni :\t"+(nactenikonec-nacteni2)+" milisekund\nNacteni matice druhe :\t"+(nacteni2-nacteni1)+" milisekund");
long zacatekNasobeni = System.currentTimeMillis();
MaticeZnasobena = objekt.nasobeniMatic(MaticeA,MaticeB);
long konecNasobeni = System.currentTimeMillis();
System.out.println("Nasobeni matic trvalo :\t"+(konecNasobeni-zacatekNasobeni)+" milisekund\nVelikost Matice :"+MaticeZnasobena.length);
//tiskMatice(MaticeZnasobena); // pro kontrolu
System.out.println("Vlozte prosim jmeno souboru do ktereho chcete ulozit vyslednou matici");
while(true) { // nekonecna smycka
try {
jmenoSouboru3 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
long ulozeni1 = System.currentTimeMillis();
objekt.ulozeniMatice(jmenoSouboru3,MaticeZnasobena);
long ulozeni2 = System.currentTimeMillis();
System.out.println("Ulozeni matice trvalo :\t"+(ulozeni2-ulozeni1)); }
}

Upozorňuji že neřeším načítaní ze souboru, ukládání do souboru ale část kódu kde probíhá násobení matic. Dále upozorňuji neberte vážně mé komentáře hlavně Cčku - terminologii daného jazyka neovládám. V té Javě beru i fígle typu nastavení Oracle JVM atd.. Fakt se rád poučím od lidí, kteří se tomu věnují mnohem,mnohem déle. Většinou je to tu plné blbých hospodských keců (typu :Kaufland je nejlevnější, pivo je zdravé atd..) všechno velmi obecné bez konkrétních důkazů. Zatím je závěr pro mě takový že na matematické výpočty je stále Java zásadně pomalejší. Doměnka :(nechce se mi kupovat stroj s 128,..,512 GBRAM abych si to ověřil) U větších matic velikosti 50 000, 100 000, 200 000 to budou skoro řádové rozdíly v času.

Karel

Re:Java: byte to 8 boolean
« Odpověď #53 kdy: 13. 03. 2014, 12:19:10 »
PS. já sám programuji pro zábavu a hlavně z 99% jenom v Javě ale
- zkoušel jste někdo násobení matic (datových typu int) třeba  matice A 20000x20000 s nasobením matice B 20000x20000 v C vs čistě Java(bez JNI) na stejném stroji? Zde je Java skutečně skoro 2x pomalejší. A dle mnou provedených pokusů není problém vysledovat lineární závislost zpomalení na velikosti matic. Není problém vám tu lupnost triviální zdroje ať si to ověříte a budu vděčen když mi někdo ukážete jakoukoliv možnost jak to zrychlit aby to bylo konkurenceschopné.

Tohle sem nikdy neresil v Jave, ale v C#(.NET) jo, a tam jsem to taky vyresil :). Tipnul bych si, ze v Jave to bude velice podobny. Problem je v hlidani, jestli index nezasahuje mimo hranice pole (for cykly jsou proste zlo), ve chvili kdy v C# predelate kod na unsafe s pointrama tak rozdil vykonu mezi C++ a C# je nemeritelny.  Jenze to jde dotahnout jeste dal, v C# i pri velikosti matice 1024*1024 ziskate dalsi 4 nasobny zrychleni jenom pouzitim nativnich knihoven (v mim pripade MathNet.Numerics.MKL). To bych taky povazoval za finalni reseni, sezente si optimalizovanou knihovnu a dosahnete bez prace rychlost na kterou se pravdepodobne rucne nedostanete.

perceptron

Re:Java: byte to 8 boolean
« Odpověď #54 kdy: 13. 03. 2014, 12:49:33 »
vas kod (teraz opomeniem styl) som spustil na svojom stroji a nasledne som pustil verziu napisanu s epml

300x300 = 78 ms
EPML 300x300 = 31 ms

1000 x 1000 = 8320 ms
epml 1000x1000 = 957 ms

epml 5000x5000 = 125512 ms

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #55 kdy: 13. 03. 2014, 12:58:32 »
A zde je ten naprosto identický kód v Javě

Provedl jsem v rychlosti jen jednu úpravu - převod na pole. Pro velikost 2000 trvalo násobení 92518 milisekund, po úpravě 14225 milisekund.

Kód: [Vybrat]
import java.io.*;
import java.util.*;
public class B06_NasobeniMaticInt {
       class Matice {
          final int [] matice;
          final int velikost;

          public Matice(int v) {
             velikost = v;
             matice = new int[velikost*velikost];
          }

          final public int get(int i, int j) {
             return matice[i*velikost+j];
          }

          final public void set(int i, int j, int v) {
              matice[i*velikost+j] = v;
          }
       }

        @SuppressWarnings("resource")
        private String nacteniNazvu() {
                Scanner key = new Scanner(System.in);
                System.out.print("Vlozte Nazev souboru :");
                String jmeno = key.nextLine();
                return jmeno;   }
        private Matice nacteniMatice(String s) {
                File NazevSoub = new File(s);
                FileReader CteciSoubor=null;
                BufferedReader Soubor=null;
                int velikost;
                try { //Zkousime otevrit pripojeni k souboru
                        CteciSoubor = new FileReader(NazevSoub);
                        Soubor = new BufferedReader(CteciSoubor);       }
                catch (IOException e) {
                        System.out.println("Nepodarilo se otevri soubor pro cteni");
                        e.printStackTrace();    }
                Matice matice = null;
                try { // Zkusime nacist hodnoty
                        String retezec = Soubor.readLine();     // nacteme prvni radek kde je pouze velikost matice
                        velikost = Integer.valueOf(retezec).intValue(); // prevedem velikost na integer
                        matice = new Matice(velikost);
                        for(int i=0;i<velikost;i++) {              // nacitani hodnot do matice z klavesnice
                                retezec = Soubor.readLine();            // nacteme do stringu cely radek
                                String [] podretezce = retezec.split(" ");  // vytvorime pole hodnot
                                for(int j=0;j<velikost;j++) {
                                        matice.set(i,j, Integer.valueOf(podretezce[j]).intValue());       }       }       }  // Prevedeme jednotlive prvky pole stringu na integer do jednotlivych casti poli
                catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice");  }
                try { // Zkusime uzavrit pripojeni k souboru
                        CteciSoubor.close();
                        Soubor.close(); }
                catch (IOException e) {
                        System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
                        e.printStackTrace();    }               // uzavreme soubor
                return matice;  }
        @SuppressWarnings("unused")
        private void tiskMatice(Matice matice) {
                System.out.println("Zde je vypsana matice");
                for (int i = 0; i < matice.velikost; i++) {
                        for (int j = 0; j < matice.velikost; j++) {
                                System.out.format("%d ", matice.get(i,j)); }
                        System.out.println();   }       }
        private Matice nasobeniMatic(Matice maticeA,Matice maticeB) {
                Matice maticeNasob=new Matice(maticeA.velikost); // u vysledne matice rozhoduji sloupce a pak radky
                for(int i=0;i<maticeNasob.velikost;i++) { // cyklus pro nasobeni matic
                        for(int j=0;j<maticeNasob.velikost;j++) {
                                int val = 0;
                                for(int k=0;k<maticeNasob.velikost;k++) {
                                        val+= maticeA.get(i,k) * maticeB.get(k,j);    }
                                        maticeNasob.set(i,j, val);
                                        }       }
                return maticeNasob;     }
        private void ulozeniMatice(String s, Matice matice) {
                File NazevSoub = new File(s);
                FileWriter ZapisovaciSoubor = null;
                String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
                try {
                        ZapisovaciSoubor = new FileWriter(NazevSoub);   }
                catch (IOException e) {
                        System.out.println("Nepodarilo se vytvorit soubor ");
                        e.printStackTrace();    }
                try {
                        ZapisovaciSoubor.write(matice.velikost+radek);
                        for(int i=0;i<matice.velikost;i++) { // nacitani hodnot do matice z klavesnice
                                for(int j=0;j<matice.velikost;j++) {
                                        ZapisovaciSoubor.write(matice.get(i,j)+" ");       }
                                        ZapisovaciSoubor.write(radek);  }       }
                catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice");  }
                try {
                        ZapisovaciSoubor.close();       }
                catch (IOException e) {
                        System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
                        e.printStackTrace();    }       }       // uzavreme soubor
        @SuppressWarnings("unused")
        public static void main(String [] args) {
                B06_NasobeniMaticInt objekt = new B06_NasobeniMaticInt();
                System.out.println("Program pro nasobeni matic integeru pro nacitani ze souboru");
                String jmenoSouboru1,jmenoSouboru2,jmenoSouboru3;
                String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
                System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 1");
                while(true) { // nekonecna smycka
                        try {
                                jmenoSouboru1 = objekt.nacteniNazvu();  break;  }
                        catch(RuntimeException E) { System.err.print("Nejedna se o retezec");}  }
                System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 2");
                while(true) { // nekonecna smycka
                        try {
                                jmenoSouboru2 = objekt.nacteniNazvu();  break;  }
                        catch(RuntimeException E) { System.err.print("Nejedna se o retezec");}  }
                System.out.println("Provedem nacteni matice do pole :");
                Matice MaticeA,MaticeB,MaticeZnasobena;
                long nacteni1 = System.currentTimeMillis();
                MaticeA = objekt.nacteniMatice(jmenoSouboru1);
                //tiskMatice(MaticeA); // pro kontrolu
                long nacteni2 = System.currentTimeMillis();
                MaticeB = objekt.nacteniMatice(jmenoSouboru2);
                long nactenikonec = System.currentTimeMillis();
                System.out.println("Nacitani matice prvni :\t"+(nactenikonec-nacteni2)+" milisekund\nNacteni matice druhe :\t"+(nacteni2-nacteni1)+" milisekund");
                long zacatekNasobeni = System.currentTimeMillis();
                MaticeZnasobena = objekt.nasobeniMatic(MaticeA,MaticeB);
                long konecNasobeni = System.currentTimeMillis();
                System.out.println("Nasobeni matic trvalo :\t"+(konecNasobeni-zacatekNasobeni)+" milisekund\nVelikost Matice :"+MaticeZnasobena.velikost);
                //tiskMatice(MaticeZnasobena); // pro kontrolu
                System.out.println("Vlozte prosim jmeno souboru do ktereho chcete ulozit vyslednou matici");
                while(true) { // nekonecna smycka
                        try {
                                jmenoSouboru3 = objekt.nacteniNazvu();  break;  }
                        catch(RuntimeException E) { System.err.print("Nejedna se o retezec");}  }
                long ulozeni1 = System.currentTimeMillis();
                objekt.ulozeniMatice(jmenoSouboru3,MaticeZnasobena);
                long ulozeni2 = System.currentTimeMillis();
                System.out.println("Ulozeni matice trvalo :\t"+(ulozeni2-ulozeni1));    }
}

Kolemjdoucí

Re:Java: byte to 8 boolean
« Odpověď #56 kdy: 13. 03. 2014, 13:26:50 »
Tak začneme : program který vygeneruje soubor obsahujici matici nahodných cisel
:
:

V Javě na rozdíl od C měříte i alokaci výsledné matice což je celkem drahá operace (Java do všech prvků dává default hodnotu, v tomto případě nulu). Dál ve smyčkách vždycky znovu alokujete řídící proměnnou, to by ale mělo být hodně levné. Docela levné by mohlo být i to že si na rozdíl od C nevytahujete hodnotu pro ukončení cyklu do extra proměnné. Nejpodstatnější ale bude že Java je optimalizovaná na dlouhotrvající procesy, takže měřit takovou jednorázovost může být zavádějící protože nezafunguje dobře JIT kompilace. Zkuste přidat další smyčku která bude to násobení opakovat vícekrát a pokud jsem to tipnul správně tak byste měl vidět že první násobení matic bude nejpomalejší a jen co zabere JIT kompilace tak se to zrychlí, ideálně na rychlost toho C.

JSH

Re:Java: byte to 8 boolean
« Odpověď #57 kdy: 13. 03. 2014, 13:35:15 »
Já se asi picnu. Proč mají největší touhu porovnávat rychlost jazyků lidé, kteří je ani neumí naplno využít? Tohle je už druhé porovnávání rychlosti jazyků, které od základu využívá pitomé datové struktury. Ne, matice MxN se NEREPREZENTUJE M poli o N prvcích, ale jedním polem MxN prvků. Z M+1 alokací paměti je najednou jen 1 a přístup k prvku potřebuje o jeden přístup do paměti míň (o jeden potenciální výpadek cache nebo stránky míň). :o

Dynamické pole dynamických polí se hodí pro něco, kde se od začátku počítá s různou délkou těch menších polí. Pokud ty pole budou stejné, tak to úplně zbytečně obecná struktura. Výsledek bude pomalejší a navíc i složitější. V takhle pitomém srovnání budou navíc od začátku znevýhodněné jazyky, které kontrolují meze polí.

JSH

Re:Java: byte to 8 boolean
« Odpověď #58 kdy: 13. 03. 2014, 13:45:35 »
A ještě jedna věc. Násobení velkých matic tímhle primitivním způsobem bude pomalé už z principu. Druhou matici opakovaně procházíte po sloupcích. Kdyžtak tu druhou matici aspoň transponujte ať se k oběma přistupuje sekvenčně. Takhle je všechno schované za výpadky cache u druhé matice.

kuka

Re:Java: byte to 8 boolean
« Odpověď #59 kdy: 13. 03. 2014, 14:22:44 »
Fakt se rád poučím od lidí, kteří se tomu věnují mnohem,mnohem déle. Většinou je to tu plné blbých hospodských keců (typu :Kaufland je nejlevnější, pivo je zdravé atd..) všechno velmi obecné bez konkrétních důkazů. Zatím je závěr pro mě takový že na matematické výpočty je stále Java zásadně pomalejší.

Uz volba nesmyslne datove struktury ukazuje, ze o jave na nizke urovni skoro nic nevis. Co te tedy vede k tomu, abys provadel nejaka srovnani? Jedine co tvuj experiment dokazuje je, ze neumis programovat v jave - co my s tim?