Avatar billede nanders Nybegynder
27. maj 2009 - 10:32 Der er 12 kommentarer og
1 løsning

Metodekald - beregningstider og håndtering af return værdier

Kære eksperter,

Jeg har lavet et hovedprogram, der holder styr på nogle tal og et beregningsprogram, der kan udføre beregninger. (Spm. følger efter)

public class Hovedprogram // Dette er hovedprogrammet
{
    public Hovedprogram()
    {
        double a=7;
        double b=2;
        double c=3;
       
    double p1 = Beregn.plus(a,b,c);
    double p2 = Beregn.gange(a,b,c);
    double p3 = Beregn.minus(a,b,c);
   
    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
}}

Beregningsprogrammet ser ud som følger

public class Beregn // Dette er beregningsprogrammet
{
    public static double plus(double i,double j,double k)
    {
      return i+j+k;
    }
    public static double minus(double i,double j,double k)
    {
      return -i-j-k;
    }
    public static double gange(double i,double j,double k)
    {
      return i*j*k;
    }
}

Spm 1. Ville det være hurtigere for computeren at beregne såfremt beregningsprogrammet blev splittet op i 3 forskellige beregningsprogrammer, der blev kaldt individuelt fra hovedprogrammet, eller er ovenstående hurtigere eller gør det ingen forskel og hvorfor?

Spm 2. Kunne en enkelt metode erstatte de 3 metoder ovenfor med hele 3 return statements i metoden og kan man så i hovedprogrammet styre værdierne så at p1 får den første return værdi, p2 den anden return værdi og p3 den tredje return værdi?

VH. nanders
Avatar billede dinirex Nybegynder
27. maj 2009 - 10:49 #1
Nu kender jeg ikke ret meget til java, men du kan vel blot bruge pointere?

F.eks.

public class Beregn // Dette er beregningsprogrammet
{
    public static void beregner(double i,double j,double k, doube* p1, double* p2, double* p3)
    {
      p1 = i+j+k;
      p2 = -i-j-k;
      p3 = i*j*k;
    } 
}
Avatar billede nanders Nybegynder
27. maj 2009 - 11:00 #2
Fra hovedprogrammet kalder man med 3 variable, så det du foreslår,dinirex, kan man ikke.

VH. nanders
Avatar billede arne_v Ekspert
27. maj 2009 - 14:02 #3
Derudover har man ikke pointere i Java!
Avatar billede arne_v Ekspert
27. maj 2009 - 14:05 #4
re 1)

Det vil næppe betyde en stor forskel i praksis. Tiden for metode kaldet skal under alle omstændigheder måles i milliarde dele sekunder. Og formentligt vil JVM'en kunne inline kaldet.

re 2)

Hvis du vil returnere flere værdier kan du f.eks. returnere en klasse som indeholder flere værdier.
Avatar billede nanders Nybegynder
28. maj 2009 - 08:51 #5
Arne, tak - jeg har virkelig millioner af beregninger.

Ville du gider du give et eksempel på hvordan det ser ud i hovedprogrammet og beregneren - så at der returneres flere værdier fra f.eks. en metode - f.eks. plus der returnerer både i+j og i+k?

VH. nanders
Avatar billede odsgaard Praktikant
28. maj 2009 - 16:43 #6
Hvis du har brug for at returnere flere beregninger, så kan de fx. returneres i et array

public static double[] plus(double i, double j, double k) {
  double[] result = new double[3];
  result[0] = i + j + k;
  result[1] = i + j;
  result[2] = i + k;
  return result;
}

alternativt, kan du jo vælge at kalde beregn metoden flere gange med 2 parametre i stedet for 3.
Avatar billede arne_v Ekspert
28. maj 2009 - 18:44 #7
Lad os sige at forskellen er 10 nano sekunder og du kalder 10 millioner gange.

Saa er forskellen i eksekveringstid 1/10 sekund.

Betyder det noget?
Avatar billede nanders Nybegynder
29. maj 2009 - 10:34 #8
Tak for svaret. Jeg er meget glad for den hjælp jeg får.

Hvordan håndtere jeg det så ovre i hovedprogrammet, hvor p1 gerne må være result[0], p2 result[1] og p3 result[2] ?

public class Hovedprogram
{
    public Hovedprogram() // Dette er hovedprogrammet
    {
        double a=7;
        double b=2;
        double c=3;
       
    double p1 = Beregn.plus(a,b,c);
   
   
    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
}
}

public class Beregn
{

public static double[] plus(double i, double j, double k)
{
  double[] result = new double[3];
  result[0] = i + j + k;
  result[1] = i + j;
  result[2] = i + k;
  return result;
}
}

Den sidste model jeg lavede tog 9 timer om at beregne 15 dages begivenheder i en reaktor. I den havde jeg ingen metodekald overhovedet. Derfor leder jeg med lys og lygte efter steder hvor jeg kan spare beregninger og tid idet jeg kalde metoder i andre klasser.

Noget jeg har fundet ud af er, at det tager lang tid er at skrive tal til en csv fil. Måske er det også et område, hvor der er noget at hente

VH. nanders
Avatar billede odsgaard Praktikant
29. maj 2009 - 14:04 #9
Hvis du bruger array-løsningen, så får du fat i p1, p2, p3 på følgende måde:

double[] tmp = Beregn.plus(a,b,c);
p1 = tmp[0];
p2 = tmp[1];
p3 = tmp[2];

Det kan godt være, at det er skrivningen til csv-filen der tager lang tid - måske kunne du prøve at skrive til en tekstfil i stedet. Det kan være der er andre, der har forslag til en optimering på det punkt.

/Brian
Avatar billede arne_v Ekspert
31. maj 2009 - 03:38 #10

Den sidste model jeg lavede tog 9 timer om at beregne 15 dages begivenheder i en reaktor. I den havde jeg ingen metodekald overhovedet. Derfor leder jeg med lys og lygte efter steder hvor jeg kan spare beregninger og tid idet jeg kalde metoder i andre klasser.

Noget jeg har fundet ud af er, at det tager lang tid er at skrive tal til en csv fil. Måske er det også et område, hvor der er noget at hente


Jeg er stadig meget skeptisk overfor hvorvidt de metode kald betyder noget.

1)  Hvilke parametre angiver du til java kommandoen ?

2)  Hvordan skriver du CSV filer ?
Avatar billede arne_v Ekspert
03. juli 2009 - 22:34 #11
Kommet videre ?
Avatar billede nanders Nybegynder
25. september 2010 - 23:52 #12
Arne, vil du smide er svar til point?
Avatar billede arne_v Ekspert
26. september 2010 - 00:00 #13
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester