Jazyk podobný C#

Re:Jazyk podobný C#
« Odpověď #75 kdy: 20. 01. 2014, 16:00:34 »
Tvrdí, že Java potažmo libovolný JIT je rychlejší než C, protože má víc informací než C kompilátor.
Netvrdí. Tvrdí, že zpomalení způsobené překladem bajtkódu do nativního kódu může být kompenzováno nebo dokonce překonáno tím, že kód vytvořený JIT kompilátorem může být efektivnější, než kód vytvořený statickým kompilátorem při překladu ze zdrojového kódu.

Já se k Vám nemohu připojit, ano, JIT může vyhodit určitou část kódu, ale tu může vyhodit i překladač C a Java už z principu nemůže být rychlejší než dobrý C kód.
Jednak JIT může překládat kód pro platformu, na které právě běží. C kód je často překládán pro nějakou obecnou platformu, aby nebylo nutné distribuovat spoustu variant binárek. Za druhé, JIT má informace z běhu programu, které C kompilátor nemá. V případě C se to obchází tím, že se kód spustí v profileru, používá se typickým způsobem a podle toho se upraví zdrojový kód. Jenže typické způsoby použití se od sebe mohou lišit. Takže efektivní nativní kód jedné aplikace se může lišit podle způsobu použití. Opět by bylo možné přeložit C s různými optimalizacemi a uživatel by si vybral – ale jednak nikdo nemá čas něco takového vyrábět, jednak uživatelé si nechtějí z něčeho takového vybírat.

V teoretické rovině máte pravdu, že JIT nemůže být rychlejší, než ten nejefektivnější kód v C. Přinejhorším se v tom C dá naprogramovat vlastní VM s vlastním JIT kompilátorem. Prakticky se ale něco takového dělá jen velmi výjimečně a je snaha tyhle věci zobecňovat a dostat je už do vývojářských nástrojů (právě ty různé VM).

Ono porovnávat rychlost na CPU nemá moc smysl, ale když už se to dělá, porovnává se běžně napsaný kód jedním způsobem a druhým způsobem. Tedy žádná vlastní VM s JIT v C a žádné JNI v Javě. A v téhle praktické rovině platí, že zátěž, kterou způsobuje překlad bajtkódu, je oproti ostatním vlivům zanedbatelná.


prezek

  • ***
  • 229
    • Zobrazit profil
Re:Jazyk podobný C#
« Odpověď #76 kdy: 20. 01. 2014, 16:06:22 »
tak jsem zusil jak je ta Java rychlejší, když ví víc, než programátor, a nějak to nevyšlo
Kód: [Vybrat]
#include <stdio.h>

int main(int argc, char **argv) {

    int cnd = 0;
    int i;
    if (argc == 2)cnd = 1;
    int counter = 0;
    for (i = 0; i < 2000000000; i++) {
        if (cnd) {
            counter++;
        } else {
            counter--;
        }
    }
    printf("%d\n", counter);
}
Kód: [Vybrat]
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
   

    public static void main(String[] args) {
        // TODO code application logic here
        boolean upCounting=false;
        if(args.length==2)upCounting=true;
        final boolean cnd = upCounting;
        int counter = 0;       
        for (int i = 0; i < 2000000000; i++) {
            if (cnd) {
                counter++;
            } else {
                counter--;
            }
        }
        System.out.println(counter);
    }
}

C jsem přeložil gcc -Os -o pok1 pok1.c a javu za mě nějak zpatlalo NetBeans.
Výsleldek je real    0m4.272s pro javu a real    0m2.078s pro C. Takže C je 2-krát rychlejší. Java mě pozitivně překvapila, čekal jsem, že na tom bude mnohem hůř. Jestli je nějaká možnost, jak javu donutit ještě více optimalizovat, tak sem s ní.

死神

  • ***
  • 159
    • Zobrazit profil
Re:Jazyk podobný C#
« Odpověď #77 kdy: 20. 01. 2014, 16:10:32 »
Místo těhle zábavných a nesmyslných útržků kódu zkuste přijít s kódem, který opravdu běží v javě rychleji než jeho ekvivalent v c. Pořád tu operujete s tím, že to jde, tak přece nemůže být až takový problém to na něčem malém demonstrovat. Nebo ne?

http://paulbuchheit.blogspot.cz/2007/06/java-is-faster-than-c.html

Supr, takže java 6,875 versus c 6.12, to mi nepřijde rychlejší. Kromě toho: "In the computer industry, there are three kinds of lies: lies, damn lies, and benchmarks." To je ten třetí případ.

shini

Re:Jazyk podobný C#
« Odpověď #78 kdy: 20. 01. 2014, 16:17:16 »
tak jsem zusil jak je ta Java rychlejší, když ví víc, než programátor, a nějak to nevyšlo
Kód: [Vybrat]
#include <stdio.h>

Výsleldek je [b]real    0m4.272s [/b] pro javu a [b]real    0m2.078s[/b] pro C. Takže C je 2-krát rychlejší. Java mě pozitivně překvapila, čekal jsem, že na tom bude mnohem hůř. Jestli je nějaká možnost, jak javu donutit ještě více optimalizovat, tak sem s ní.
[/quote]

Neukazuje to jen, ze JVM chvili trva, nez nastartuje?

gamer

Re:Jazyk podobný C#
« Odpověď #79 kdy: 20. 01. 2014, 16:23:44 »
Supr, takže java 6,875 versus c 6.12, to mi nepřijde rychlejší. Kromě toho: "In the computer industry, there are three kinds of lies: lies, damn lies, and benchmarks." To je ten třetí případ.
Že nerozumíš psanému textu, to už není můj problém.


prezek

  • ***
  • 229
    • Zobrazit profil
Re:Jazyk podobný C#
« Odpověď #80 kdy: 20. 01. 2014, 16:44:40 »
Místo těhle zábavných a nesmyslných útržků kódu zkuste přijít s kódem, který opravdu běží v javě rychleji než jeho ekvivalent v c. Pořád tu operujete s tím, že to jde, tak přece nemůže být až takový problém to na něčem malém demonstrovat. Nebo ne?

http://paulbuchheit.blogspot.cz/2007/06/java-is-faster-than-c.html

U mě je největší rozdíl mezi tím, jestli se výsledek vykresluje, nebo jen počítají * a mezery. Při výpisu trval běh desítky sekund a byl ovlivněný systémovým voláním. Při počítání * a ' ' je u mě C rychlejší i bez optimalizace na platformu (gcc -O3 -o pok1 pok1.c). Java Elapsed 1.651 a C Elapsed 1.49

Jakub Galgonek

Re:Jazyk podobný C#
« Odpověď #81 kdy: 20. 01. 2014, 16:52:19 »
U mě je největší rozdíl mezi tím, jestli se výsledek vykresluje, nebo jen počítají * a mezery. Při výpisu trval běh desítky sekund a byl ovlivněný systémovým voláním. Při počítání * a ' ' je u mě C rychlejší i bez optimalizace na platformu (gcc -O3 -o pok1 pok1.c). Java Elapsed 1.651 a C Elapsed 1.49

Také jsem si to přiohnul, aby to moc neprintilo:

Java Elapsed 1.045
C/gcc Elapsed 0.96
C/icc Elapsed 0.90

perceptron

Re:Jazyk podobný C#
« Odpověď #82 kdy: 20. 01. 2014, 17:34:28 »
porovnavanie na hracickovych programoch, co bezia sekundu, srsly?

jit sa tam ani nezahreje


Re:Jazyk podobný C#
« Odpověď #83 kdy: 20. 01. 2014, 17:36:36 »
Java Elapsed 1.045
C/gcc Elapsed 0.96
C/icc Elapsed 0.90
Takže rozdíl mezi Javou a C je v tomto případě skoro stejný, jako rozdíl mezi dvěma kompilátory C. Na tom je vidět, jak nesmyslné je porovnávat programovací jazyky z hlediska rychlosti spuštěného kódu.

Daniel Kozak

Re:Jazyk podobný C#
« Odpověď #84 kdy: 20. 01. 2014, 17:57:57 »
Napriklad u me  je rozdil mezi Java kodem a kodem napsanem v jazyce D vic nez 100% ve prospech jazyka D.
Takze porovnavat jazyky dle rychlosti kodu smysl urcite ma. Teda ono spis jde o porvnani jednotlivych implementaci kompilatoru ci JIT (prece jen samotny jazyk nezarucuje ze bude vysledny program nezet rychleji  :)).

Kazdopadne na takto trivialnim priklade se toho moc nepozna. Napriklad u nas v praci jsme prepisovali kod s PHP do jazyka D. A ackoliv ruzne mikrobenchmarky ukazovali ze jazyk D je neporovnatelne rychlejsi, tak realne zrychleni bylo mozna jen tak 3x az 5x. Duvod je prosty, samotny problem rychlosti aplikace je zcela jinde (databazove operace a zpusob jak je aplikcae navrzena - pro kazdy soubor ktery se ma zpracovat se spousti novy program).

Jakub Galgonek

Re:Jazyk podobný C#
« Odpověď #85 kdy: 20. 01. 2014, 18:03:13 »
jit sa tam ani nezahreje

Je to čas až toho třetího běhu a upavil jsem CompileThreshold, aby si JIT zahrál. Ale jinak jo, chtělo by to větší příklad.

Pavec

Re:Jazyk podobný C#
« Odpověď #86 kdy: 20. 01. 2014, 20:42:16 »
Java Elapsed 1.045
C/gcc Elapsed 0.96
C/icc Elapsed 0.90
Takže rozdíl mezi Javou a C je v tomto případě skoro stejný, jako rozdíl mezi dvěma kompilátory C. Na tom je vidět, jak nesmyslné je porovnávat programovací jazyky z hlediska rychlosti spuštěného kódu.
V tomto pripade bych zduraznil. JVM se dobre optimalizuji prave takove jednoduche smycky s par vyrazama (aritmetika, jednoduche operace s retezci). Daleko horsi to je u strukturovanejsiho nehomogenniho kodu s hlubokymi vnorenimi volanimi. Jinymi slovy tyhle mikrobenchmarky nic nevypovidaji o rychlosti behu "realnych" aplikaci. Puvodni autor zvolil teda hodne spatny priklad pro porovnani.

Re:Jazyk podobný C#
« Odpověď #87 kdy: 20. 01. 2014, 21:17:17 »
V tomto pripade bych zduraznil. JVM se dobre optimalizuji prave takove jednoduche smycky s par vyrazama (aritmetika, jednoduche operace s retezci). Daleko horsi to je u strukturovanejsiho nehomogenniho kodu s hlubokymi vnorenimi volanimi. Jinymi slovy tyhle mikrobenchmarky nic nevypovidaji o rychlosti behu "realnych" aplikaci. Puvodni autor zvolil teda hodne spatny priklad pro porovnani.
Jako benchmark jazyků je to rozhodně špatný příklad. Prohodit ten if a smyčku může kompilátor klidně na základě analýzy kódu, k tomu běhové informace nepotřebuje. A vůbec bych se nedivil, kdyby třeba icc tu smyčku spočítalo už v době kompilace a vygenerovalo jenom if se dvěma konstantama.

Spíš to ukazuje, že ten strašák "musí nastartovat JVM a přeložit kód" je nesmysl. A docela by mne zajímalo, co se vlastně změřilo - třeba jak moc by ta čísla byla jiná, kdyby se ta konstanta vydělila dvěma nebo by se naopak načítala dvě počítadla najednou.

Pavel Tisnovsky

Re:Jazyk podobný C#
« Odpověď #88 kdy: 20. 01. 2014, 22:19:01 »
tak jsem zusil jak je ta Java rychlejší, když ví víc, než programátor, a nějak to nevyšlo
Kód: [Vybrat]
#include <stdio.h>

int main(int argc, char **argv) {

    int cnd = 0;
    int i;
    if (argc == 2)cnd = 1;
    int counter = 0;
    for (i = 0; i < 2000000000; i++) {
        if (cnd) {
            counter++;
        } else {
            counter--;
        }
    }
    printf("%d\n", counter);
}
Kód: [Vybrat]
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
   

    public static void main(String[] args) {
        // TODO code application logic here
        boolean upCounting=false;
        if(args.length==2)upCounting=true;
        final boolean cnd = upCounting;
        int counter = 0;       
        for (int i = 0; i < 2000000000; i++) {
            if (cnd) {
                counter++;
            } else {
                counter--;
            }
        }
        System.out.println(counter);
    }
}

C jsem přeložil gcc -Os -o pok1 pok1.c a javu za mě nějak zpatlalo NetBeans.
Výsleldek je real    0m4.272s pro javu a real    0m2.078s pro C. Takže C je 2-krát rychlejší. Java mě pozitivně překvapila, čekal jsem, že na tom bude mnohem hůř. Jestli je nějaká možnost, jak javu donutit ještě více optimalizovat, tak sem s ní.

Tak tady skutečně Java příjemně překvapila, když si uvědomíte, že v čase je zahrnuto i spuštění JVM, JIT atd.

Jinak pro informaci do další diskuze.

1) Javovský bytekód Tvého příkladu vypadá následovně:
http://fpaste.org/70140/13902523/

2) Takto to vypadá po JITování client JVM (i386, tedy 32bit):
http://fpaste.org/70141/02523841/

3) A takto, když se na to pustí server JVM (trošku pomícháno s println...)
http://fpaste.org/70142/39025240/

Jen poznámka na okraj - JIT zde neprovedl žádné optimalizace, protože celá smyčka proběhla jen jednou. Kdyby byla umístěna do samostatné metody a volala se vícekrát, tak se JIT trošku zapotí a vygeneruje odlišný kód... lze snadno odzkoušet.

perceptron

Re:Jazyk podobný C#
« Odpověď #89 kdy: 20. 01. 2014, 22:55:04 »
Citace
Tak tady skutečně Java příjemně překvapila, když si uvědomíte, že v čase je zahrnuto i spuštění JVM, JIT atd.
ono je dost mozne, ze JVM je uz spustena (spolu s NetBeansom), co moze "deformovat" vysledky.