Java: byte to 8 boolean

podlesh

Re:Java: byte to 8 boolean
« Odpověď #75 kdy: 14. 03. 2014, 14:56:19 »
Nebudete věřit, ale nepřišel jsem sem s cílem všechny přesvědčit aby se vysrali na Javu a šli do C++, do této dlouhé a bohužel zbytečné diskuze jsem byl zatažen poté, co jsem tvrdil že optimalizovat v Javě bitovými operacemi je zbytečná práce, neb je nenažraná, takže jakákoli takto drobná optimalizace se ztratí.
Optimalizace objemu zabrané paměti pomocí bitových operací zcela jistě není zbytečná práce (je docela rozdíl zda program potřebuje 1GB nebo 8GB, zvlášť patrné je to na 32bit architektuře).


xxx

Re:Java: byte to 8 boolean
« Odpověď #76 kdy: 15. 03. 2014, 06:43:02 »

Jsi pěkný kus diskuze přehlédl, ne?

Za prvé nejsem zaměstnanecká lopata, mám vlastní firmu tak se musím starat. Nemám čas být každých 10 sekund na internetu a číst si kecy úrovně hospodských žvástů asi potomků těchto hospodských povalečů. A ani nechci.

Za druhé, kecy jenom prolítávám jak jsem říkal chci důkaz a to znamená zdroják který si vložím do Eclipse a spustím a poběží na stejném kusu HW rychleji než v Cčku. Já jsem ty porovnávací zdroje svého tvrzení předvedl. Od oponentů očekávám totéž.

Za třetí evidetně jsem zklamán. Od lidí co se tu skoro prezentují jako Java senioři bych očekával krom mudrování i výsledky.( možná to je ten rozdíl mezi podnikatelským myšlením[orientovaným na praktické výsledky] a lidmi kteří jsou asi geneticky předurčeni k lopatě )

Za čtvrté Java mě baví, velmi hezky se mi v tom programuje oproti Pascalu který jsem měl na vysoké skoro před 15 lety a rozsahem  JDK nemá naprosto konkurenci ale zatím to prostě vypadá že tento typ problémů konkurenceschopně prostě nedává.( někdo z nás chápe k čemu se ty matice používají např. FEM)

Za páté pokud zde tvz. "Java profíci" mají nějaké tvrzení v obecné rovině a nejsou schopni si jej obhájit na lokálním problému tak sorry ale nejste profíci pořád jste děti co si na něco hrajou. Prosil bych, příště si vaše tvrzení povídejte před zrcadlem, normální lidé na ně nejsou zvědavy.

ZÁVĚR: je to škoda, budu muset používat JNI pro řešení matematických problémů řešených v Javě. Po mnoha provedených pokusech má jenom cca průměrné 5% zpomalení oproti Cčku.
PS. pokud se někoho z vás moje přirovnání dotklo tak se neomlouvám, bylo to tak myšleno.

technomaniak

Re:Java: byte to 8 boolean
« Odpověď #77 kdy: 15. 03. 2014, 06:44:15 »
Sorry spletl jsem si NICK. Ten předchozí příspěvek byl od mě.

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #78 kdy: 15. 03. 2014, 07:29:00 »
Sorry spletl jsem si NICK.

Za druhé, kecy jenom prolítávám jak jsem říkal chci důkaz a to znamená zdroják který si vložím do Eclipse a spustím a poběží na stejném kusu HW rychleji než v Cčku. Já jsem ty porovnávací zdroje svého tvrzení předvedl. Od oponentů očekávám totéž.

Ty jsi tu snad nějaký zdroják dodal? Anebo je krom xxx také NotBeginner tvůj nick?

Za třetí evidetně jsem zklamán. Od lidí co se tu skoro prezentují jako Java senioři bych očekával krom mudrování i výsledky.( možná to je ten rozdíl mezi podnikatelským myšlením[orientovaným na praktické výsledky] a lidmi kteří jsou asi geneticky předurčeni k lopatě )

Já jsem zase zklamán, že Pavel Tišnovský se ti nabídl, že se ti na to podívá, a tys mu ani neodpověděl (pokud nejsi NotBeginner).

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #79 kdy: 15. 03. 2014, 08:22:20 »
Tak začneme : [...]
Zde je zdrojak v Cčku, který je schopen načíst námi vygenerovaný soubor
[...]
A zde je ten naprosto identický kód v Javě
[...]

Tak jsem se na to podíval ještě jednou, opět jsem použil matici 2000x2000. Verze psaná v C/gcc na to potřebovala cca 64 sekund. Ta verze v Javě na to potřebovala 88 sekund. Mnou upravená verze (jedno pole, transpozice před násobením) v Javě to zvládla za 5 sekund. A aby to bylo vtipnější, tak C verze přeložená icc to zvládne za 0.85 sekund.


Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #80 kdy: 15. 03. 2014, 08:52:28 »
A tady je ten upravený kód:

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;
          }

          final public void trans() {
              for(int i = 0; i < velikost; i ++)
                for(int j = 0; j < i; j ++) {
                    int val = matice[i*velikost+j];
                    matice[i*velikost+j] = matice[j*velikost+i];
                    matice[j*velikost+i] = val;
                }
          }
       }

        @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) {
        maticeB.trans();
       
                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(j,k);    }
                                        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));    }
}

Re:Java: byte to 8 boolean
« Odpověď #81 kdy: 15. 03. 2014, 08:56:44 »
Za druhé, kecy jenom prolítávám jak jsem říkal chci důkaz a to znamená zdroják který si vložím do Eclipse a spustím a poběží na stejném kusu HW rychleji než v Cčku.
A to bude důkaz čeho? Tvrzení, které tady nikdo nezmínil a nikdo neobhajuje?

Já jsem ty porovnávací zdroje svého tvrzení předvedl. Od oponentů očekávám totéž.
Nepředvedl. Předvedl jste jeden příklad. To jako důkaz všeobecného tvrzení nestačí.

To, co jste předvedl, je spíš názorná ilustrace toho, že špatně lze psát v libovolném jazyce. A že rozdíly mezi špatně a dobře napsaným programem jsou nesrovnatelně větší, než rozdíly plynoucí z použitých nástrojů. Jediný případ, kdy nástroje mohou ten rozdíl srovnat, je tehdy, pokud dokážou ten špatně napsaný program opravit (při optimalizaci).

Tak jsem se na to podíval ještě jednou, opět jsem použil matici 2000x2000. Verze psaná v C/gcc na to potřebovala cca 64 sekund. Ta verze v Javě na to potřebovala 88 sekund. Mnou upravená verze (jedno pole, transpozice před násobením) v Javě to zvládla za 5 sekund. A aby to bylo vtipnější, tak C verze přeložená icc to zvládne za 0.85 sekund.
Verze přeložená s icc byla ta samá, jako s gcc? Tedy ta s dvourozměrným polem a bez transpozice? To by mne tedy zajímaly ty instrukce, co z icc vylezly. To snad muselo provést tu transformaci i transpozici matice také a použít pak vektorové instrukce.

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #82 kdy: 15. 03. 2014, 09:16:10 »
Verze přeložená s icc byla ta samá, jako s gcc? Tedy ta s dvourozměrným polem a bez transpozice?

Jo, naprosto ta samá.

To by mne tedy zajímaly ty instrukce, co z icc vylezly.

Těch pět řádků v C, co provádí samotné násobení, to rozvinulo na cca 1100 řádků v assembleru :).

Re:Java: byte to 8 boolean
« Odpověď #83 kdy: 15. 03. 2014, 09:43:07 »
Těch pět řádků v C, co provádí samotné násobení, to rozvinulo na cca 1100 řádků v assembleru :).
Aha, takže asi optimalizace způsobem: "Á, násobení matic, a pěkně naivně implementované. Tak proto máme v knihovně daleko lepší algoritmus."

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #84 kdy: 15. 03. 2014, 10:08:27 »
Aha, takže asi optimalizace způsobem: "Á, násobení matic, a pěkně naivně implementované. Tak proto máme v knihovně daleko lepší algoritmus."

Spíše jen důsledek loops unrollingu.

Jakub Galgonek

Re:Java: byte to 8 boolean
« Odpověď #85 kdy: 15. 03. 2014, 10:12:53 »
Za druhé, kecy jenom prolítávám jak jsem říkal chci důkaz a to znamená zdroják který si vložím do Eclipse a spustím a poběží na stejném kusu HW rychleji než v Cčku. Já jsem ty porovnávací zdroje svého tvrzení předvedl. Od oponentů očekávám totéž.

Za třetí evidetně jsem zklamán. Od lidí co se tu skoro prezentují jako Java senioři bych očekával krom mudrování i výsledky.( možná to je ten rozdíl mezi podnikatelským myšlením[orientovaným na praktické výsledky] a lidmi kteří jsou asi geneticky předurčeni k lopatě )

Mimochodem, já tu zdroják vložil (tehdy ještě bez transpozice), dokonce takový, co u mne běží rychleji než tvá verze v C (pokud se použije gcc). Ale pan podnikatel ji asi jaksi přehlédl.

podlesh

Re:Java: byte to 8 boolean
« Odpověď #86 kdy: 15. 03. 2014, 14:16:38 »
Schválně - kolik z vás také napadlo "co dělá Hulán na rootu"?

RAII

Re:Java: byte to 8 boolean
« Odpověď #87 kdy: 15. 03. 2014, 16:11:37 »
Doufám že si spokojenej Jirsáku, důkaz o tom že Java je pomalá si dostal. Neříkám že je špatná, má své výhody, ale je hold pomalá...

perceptron

Re:Java: byte to 8 boolean
« Odpověď #88 kdy: 15. 03. 2014, 16:38:24 »
public class RAII {
  public static void main(String[] args) {
    while(true) {
      System.out.println("Java je pomala");
    }
}


Debata o androide uz tiez bola vycerpana, argumenty zasiahli nerelevantne tvrdenia, tak sa prispevky resetli? generalizacia "java nebezi na maticovom benchmarku rychlejsie nez c (sic!), ergo je pomala"?

srsly? :-)

pan technomaniak, https://gist.github.com/anonymous/9569105

to je ten kod co ide oproti epml, a bezi radovo rychlejsie nez vasa uplne prva verzia.

Re:Java: byte to 8 boolean
« Odpověď #89 kdy: 15. 03. 2014, 16:59:10 »
důkaz o tom že Java je pomalá si dostal.
Nedostal. Všeobecné tvrzení nelze dokázat příkladem. Což už píšu potřetí - přesto to, že jste to dvakrát nepochopil, není důkazem toho, že nechápete vůbec nic.

Mimochodem, varianta napsaná v C běžela 64 sekund, varianta v Javě 5 sekund. OK, můžete tvrdit, že Java je pomalá, ale pak je C superpomalé.

Ve skutečnosti se ukázalo, že zvolený jazyk má na rychlost nepatrný vliv. Nesrovnatelně větší vliv má zvolený algoritmus a odstranění úzkých hrdel při zpracování, která závisí na konkrétní implementaci. V tomhle případě se ukázalo, že je úzkým hrdlem dvojí dereferencování, které lze nahradit jedním, a hlavně zbytečné zahazování dat, která už jsou v cache procesoru. Třeba ta druhá optimalizace by před dvaceti lety byla na platformě x86 nesmyslná, protože procesor žádnou cache neměl.

Pro původního tazatele to znamená, ať se vykašle na nesmysly o tom, že je nějaký jazyk pomalý nebo rychlý, ať se naučí efektivně využívat možností platformy, ve které a pro kterou píše, a psát přehledný kód. A pak ať se naučí odhalovat ta místa programu, která jsou úzkým hrdlem, pochopit proč je dané místo problematické a pak program upravit. A také to mimochodem znamená, že i pro některé optimalizace v Javě, která je zdánlivě vysokoúrovňová, je potřeba znát, jak pracují dnešní procesory - že používají keš hlavní paměti, že používají predikci skoků, jak funguje přepínání mezi vlákny nebo mezi uživatelským prostorem a jádrem. Na druhou stranu tohle už jsou optimalizace, které se využijí jen v některých typech programů.