Vlákno názorů k článku Pohled pod kapotu JVM – přednosti a zápory využití JNI při optimalizacích (3) od technomaniak - Taky jsem s s tím hrál(cca před půl...

  • Článek je starý, nové názory již nelze přidávat.
  • 20. 11. 2013 18:51

    technomaniak (neregistrovaný)

    Taky jsem s s tím hrál(cca před půl rokem) ale *.dll jsem vytvořil v obyčejném Cčku s kompilátorem MinGW. Přenášel jsem nikoliv pole a ale přímo matice,objekty a rozdíl byl skutečně viditelný.

    Stejný algorytmus se stejnou úlohou(načteni obou matic ze souboru) ( notas; 2jádroAMD;2,3Ghz)

    čistě Cčko .... 1,3 hodiny
    Java s JNI ..... 1,4 hodiny
    čistě Java ..... 2,1 hodiny

    nasobení matic 5000x5000(kvůli zjednodušení plné generovanýc h integerů)

  • 21. 11. 2013 9:15

    Pavel Tišnovský
    Zlatý podporovatel

    Diky za informaci. Muzes prosim upresnit o co presne slo? Prece vynasobeni dvou matic 5000x5000 netrva >1 hodinu, urcite se tam delalo mnoho veci navic.

  • 22. 11. 2013 7:19

    technomaniak (neregistrovaný)

    Prostě jsem měl dvě matice každá 5000x5000, plná random integerů a nasobil je mezi sebou. Tak jsem se na to podrobně podíval a zde jsou vysledky co jsem si kvůli závěrům ponechal:

    - za pomoci vlákem jsem to nedělal( moc práce ), přeci jenom programuji rok a půl. A ani nevím jestli Cčko vlákna má a C++ neumím.

    // JAVA
    // souborA .... 500/500 a souborB 500/500 = cca 2,3 sekund 2 382 milisekund
    // souborA .... 1000/1000 a souborB 1000/1000 = cca 24 sekund 24 124 milisekund
    // souborA .... 2000/2000 a souborB 2000/2000 = cca 274 sekund 274 963 milisekund
    // souborA .... 5000/5000 a souborB 5000/5000 = cca 6245 sekund 6 245 725 milisekund

    // JAZYK C
    // souborA .... 500/500 a souborB 500/500 =
    // souborA .... 1000/1000 a souborB 1000/1000 = cca 22,4 sekund 22 400 milisekund
    // souborA .... 2000/2000 a souborB 2000/2000 = cca 296 sekund 296 000 milisekund
    // souborA .... 5000/5000 a souborB 5000/5000 = cca 3937 sekund 3 937 470 milisekund

    // JAVA pres DLL(nasobeni pres C)
    // souborA .... 500/500 a souborB 500/500 = cca 4,3 sekund 4 230 milisekund
    // souborA .... 1000/1000 a souborB 1000/1000 = cca 30 sekund 30 000 milisekund // souborA .... 2000/2000 a souborB 2000/2000 = cca 275 sekund 275 070 milisekund // souborA .... 5000/5000 a souborB 5000/5000 = cca 4194 sekund 4 194 160 milisekund

    metoda v Jave :

    public native int [][] vystupIntPole(int [][] pole1,int velikost1,int [][] pole2,int velikost2);

    header z C:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class NasobeniMatic */

    #ifndef _Included_Naso­beniMatic
    #define _Included_Naso­beniMatic
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class: NasobeniMatic
    * Method: vystupIntPole
    * Signature: ([[II[[II)[[I
    */
    JNIEXPORT jobjectArray JNICALL Java_Nasobeni­Matic_vystupIn­tPole
    (JNIEnv *, jobject, jobjectArray, jint, jobjectArray, jint);

    #ifdef __cplusplus
    }
    #endif
    #endif

    nasobíci algorytmus v Cčku:

    // PROVEDEME NASOBENI MATIC
    startNasob=clock();
    for(i=0;i<pocet­RadkuA;i++) { // cyklus pro nasobeni matic
    for(j=0;j<pocet­SloupcuB;j++) {
    matrixC[i][j] = 0;
    for(k=0;k<pocet­SloupcuB;k++) { // pri chybach v nasobeni zkusit zmenit pocetRadkuA
    matrixC[i][j]=ma­trixC[i][j] + matrixA[i][k] * matrixB[k][j]; } } }
    konecNasob = clock();

    Princi programů byl následující :

    1) načíst matici 1 ze souboru ( zjistil cas jak dlouho to dělá)
    2) načíst matici 2 ze souboru ( zjistil cas jak dlouho to dělá)
    3) provést nasobení + na konci odečíst čas ziskaní před nasobením
    4) toť vše