Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Muistien rasitus esimerkkiä?

CoolC++ [05.02.2008 19:14:24]

#

Kysäisisin, että pystyykö muistia rasittamaan, jollakin yksinkertaisella c++:ohjelmalla? Antaen ajan ja tuloksen rasituksesta? Rossua voi tällä koodilla, mutta entäs miten onnistuisi muistien?

#include <stdio.h>
#include <time.h>
#include <iostream.h>

int m = 1;

void taso(int a) {

    if (a == 20) return;
    m++;
    taso(a + 1);
    taso(a + 1);
    taso(a + 1);
}

void lasku(void) {
    /* tähän voi laittaa mitä tahansa laskuja */
    taso(1);
    taso(1);
    taso(1);
    printf("%i\n", m);
}

int main(void) {
    clock_t alku, loppu;
    alku = clock();
    cout << ("Test started:\n\nWait little time...\n\n");
    cout << ("Score: ");
    lasku();
    cout << ("Time: ");
    loppu = clock();
    printf("%.3f\n\n", ((float)(loppu - alku) / CLOCKS_PER_SEC));
    system ("pause");
    return 0;
}

Itelläni antaa tosin "Score: 1743392200", tuloksen, joka ei tosin tuokaan ole ihan täydellinen koodi, koska se antaa hirveen suuren score tulos lukeman vaikka saisi enintään olla jotakin alle 10k yksikköillä. Antaen mielluummin kokonais tuloksen ilman pisteitä. Enintään 10 0000 pointsia.

Mutta saman tyyppinen muistien rasitus esimerkkiä?

Kray [05.02.2008 21:23:00]

#

Varaat ja vapautat muistia sarjassa?

Gaxx [05.02.2008 23:13:06]

#

Varmaan käynyt joku ajatusvirhe, sillä tuohan antaa aina "scoreksi" tuon 1743392200. Sen sijaan käytetty aika vaihtelee koneesta riippuen :)

Käytönnössä prosessorin suorituskyvyn testaaminen on muutakin, kuin vain kokonaislukujen laskunopeuden testaamista. Lisäksi tuossa on aika monta funktiokutsua, joten väittäisin suurimmain osan ajasta kuluvan niihin.

Joku vähän enemmän prosessorien arkkitehtuurista voi kertoa enemmän :)

Metabolix [06.02.2008 09:56:16]

#

Testaaminen moniajokäyttöjärjestelmän sisällä on jokseenkin älytöntä, kun mukaan tulee väkisin käyttöjärjestelmän asioita.

Muistia (siirtoväylää) voi tietysti yrittää rasittaa varaamalla ison palasen ja kirjoittamalla siihen jotain sotkua edestakaisin, mutta taas täytyy muistaa käyttöjärjestelmän vaikutus ajankäytössä ja siinä, että jos muisti loppuu, käytetään kovalevyä jatkeena.

Testiohjelmat olisi järkevää kirjoittaa assemblylla (ainakin siis testaavilta osiltaan), jotta olisi tiedossa, mitä koodin aikana oikein tapahtuu. Tuo esimerkkiohjelmasi testaa luultavasti lähinnä prosessorin välimuistien nopeutta, ja C:llä tehty muistintestausohjelma voisi päätyä testaamaan myös prosessoria (ilman optimointilippua käännettynä) tai kadota, kun kääntäjä toteaa, että tässäpä on turha silmukka.

Päärynämies [06.02.2008 23:36:28]

#

Ja muistintestauksessa eri järjestelmissä tietysti vaikuttaa myös se, miten käyttöjärjestelmä jakaa muistia esim. malloc -funktiota kutsuttaessa. Tässäkin on eroja eri käyttöjärjestelmien ja niiden versioiden välillä.

Ja tosiaan kuten Metabolix jo mainitsi, niin nykyisillä moniajokäyttöjärjestelmillä tuollainen prosessorin kuormitus yksinkertaisilla laskutoimituksilla ei anna kovin luotettavaa kuvaa, sillä järjestelmässäsi pyörii muitakin prosesseja ja erilaisia käyttöjärjestelmän keskeytyksiä ja muita voi sattua täysin "satunnaisesti". Voit kokeilla vaikka ajaa tuon saman testisi samalla kun teet jotain raskasta videonpakkausta tai vastaavaa paljon tehoja syövää tehtävää. Huomaat varmasti eroa.

Ja jos oikeasti vähänkään luotettavamman testin haluat prosessorin kuormituksesta, niin olisi hyvä tutustua siihen miten prosessorit toimivat (nykyiset ja vanhemmat), erilaisiin välimuisteihin, erilaisiin väyliin emolevyllä.

Jos vielä tuota koodiasi kommentoi hieman, niin erimerkiksi tuossa silmukassa, jossa otetaan aikaa, ei pitäisi suorittaa mitään tulostusoperaatioita, koska niissä vaikuttavat monet muutkin asiat kuin suorittimen nopeus.

Jos oikeasti haluat C:llä tai C++:lla tehdä testausohjelmia, niin on sinun tunnettava kääntäjäsi todella hyvin ja itse kieli myös tietysti. Myös tuntemus käyttöjärjestelmän toiminnasta, samoin kuin alla olevan raudan toiminnasta on välttämätöntä.

Lisäksi on huomioitavana niin monta muuta asiaa, että nuo olivat vasta sellaista yleiskatsausta.

Eli loppuyhteenvetona, että onhan noita numeroita kiva laskea, mutta mitään luotettavaa testausta tuolla on turha suorittaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta