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ů)
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_NasobeniMatic
#define _Included_NasobeniMatic
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NasobeniMatic
* Method: vystupIntPole
* Signature: ([[II[[II)[[I
*/
JNIEXPORT jobjectArray JNICALL Java_NasobeniMatic_vystupIntPole
(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<pocetRadkuA;i++) { // cyklus pro nasobeni matic
for(j=0;j<pocetSloupcuB;j++) {
matrixC[i][j] = 0;
for(k=0;k<pocetSloupcuB;k++) { // pri chybach v nasobeni zkusit zmenit pocetRadkuA
matrixC[i][j]=matrixC[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