Avatar billede mikkeljans Nybegynder
20. april 2004 - 09:46 Der er 5 kommentarer og
1 løsning

Hukommelse og Regnetid

Jeg har lavet en function som tager alt for lang tid for computeren at udregne.
Nogen der kender nogen gode tricks/regler for hvordan man skal programmere for at holde regnekraften så lav som mulig?
F.eks hvordan håndtere C++ Klasser?..
Er det sådan at jo mere medlemsdata i klassen desto mere fylder den i hukommelsen?. Fylder Klassens functioner noget i hukommelsen?
Hvad er det der specialt tager tid for computeren at udregne?.. Er det at lave en ny klasse? eller udregne nogen formler?

Hvad kunne man evt. have gjort at fejl hvis ens program begynder at kører langsomt?
Avatar billede jpvj Nybegynder
20. april 2004 - 09:55 #1
Du bliver nok nødt til at beskrive hvad du har gjort (design af din klasse, data og metoder).

Jeg har kun erfaring fra Java (et gammelt studie projekt: http://www.mat.dtu.dk/people/T.Hoeholdt/DVD/index.html). Her måtte vi opgive at lægge regnereglerne for legemet ind i klassen. I stedet manipulerede vi data direkte og skrev dem tilbage i objektet.

Det er muligt at C++ er bedre på dette område, men i Java sker en del arbejde hver gang du opretter et objekt og når du kalder dets metoder.
Avatar billede arne_v Ekspert
20. april 2004 - 10:01 #2
objekternes størrelse er lig med summen af medlemmernes størrelse, så flere
felter bruger mere memory

virtuelle metoder fylder en pointer (typisk 4 byte) mens ikke virtuelle metoder
ikke fylder noget

det bliver altid langsomt hvis der ikke er plads i RAM til hele programmet
så det ryger på disk (page/swap fil).

rent beregnings mæssigt er operationer som sqrt, sin, cos, exp, pow etc.
meget meget dyrere end +-*/%

det er umuligt at gætte præcist havd der er galt med dit program uden at se noget
kodes
Avatar billede mikkeljans Nybegynder
20. april 2004 - 10:01 #3
Point Poly::FaceNormal(int Face)
{
    Point Result;
    PointArray VertNormals;
    Ints FaceVerts = faceVerts(Face);
    for (int i=0; i<FaceVerts.Count(); i++)
    {
        Ints SharedEdges = Shared(vertEdges(FaceVerts[i]), faceEdges(Face));
        int Vert1 = connectedVert(FaceVerts[i], SharedEdges[0]);
        int Vert2 = connectedVert(FaceVerts[i], SharedEdges[1]);
        Point* Edge1 = new Point((Verts[Vert1]->X - Verts[FaceVerts[i]]->X),
                                (Verts[Vert1]->Y - Verts[FaceVerts[i]]->Y),
                                (Verts[Vert1]->Z - Verts[FaceVerts[i]]->Z));

        Point* Edge2 = new Point((Verts[Vert2]->X - Verts[FaceVerts[i]]->X),
                                (Verts[Vert2]->Y - Verts[FaceVerts[i]]->Y),
                                (Verts[Vert2]->Z - Verts[FaceVerts[i]]->Z));

        Point* Normal = new Point(((Edge1->Y*Edge2->Z)-(Edge1->Z*Edge2->Y)),
                                ((Edge1->Z*Edge2->X)-(Edge1->X*Edge2->Z)),
                                ((Edge1->X*Edge2->Y)-(Edge1->Y*Edge2->X)));

        double NLength = sqrt((Normal->X*Normal->X)+
                              (Normal->Y*Normal->Y)+
                              (Normal->Z*Normal->Z));

        VertNormals.Add(Normal->X/NLength,
                        Normal->Y/NLength,
                        Normal->Z/NLength);
        delete Edge1;
        delete Edge2;
        delete Normal;
    }



    for (int n=0; n<VertNormals.Count(); n++)
    {
        Result.X = VertNormals[n]->X;
        Result.Y = VertNormals[n]->Y;
        Result.Z = VertNormals[n]->Z;
    }

    Result.X = Result.X / VertNormals.Count();
    Result.Y = Result.Y / VertNormals.Count();
    Result.Z = Result.Z / VertNormals.Count();

    return Result;
}


Functionen laver en del beregninger og den skal helst gøre det her 40 gange i sek.
Tror ikke det bliver muligt så jeg bliver nok nød til at prøve at skære lidt ned på den.
Men hvis jeg ved hvad computeren specialt bruger meget kraft på.. Ville det også være nemmere i fremtiden at lave hurtigere functioner.
Avatar billede arne_v Ekspert
20. april 2004 - 10:34 #4
Det er svært at sige noget udfra den kode, fordi den kalder nogle andr emetoder.

Men umiddelbart ser det ikke specielt slemt ud.
Avatar billede beeblebrox Nybegynder
20. april 2004 - 13:27 #5
Jeg må give arne_v ret. Dette ser ikke slemt ud. Generelt skal man altid se på den inderste løkke. Tid brugt i de andre løkker plejer at være ligegyldigt.

Her du overvejet at problemet måske bare er stort, og derfor bare tager lang tid.
Avatar billede bertelbrander Novice
20. april 2004 - 20:29 #6
Du kan overveje om det er nødvendigt at allokere (new'e) og frigive (delete) 3 gange for hver gennemløb.
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