C++ Academy · Oppitunti

Kestot ja kellot

Mittaa aikavälejä

Oppitunti 1/413 vaihetta

Kestot ja kellot on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Miksi <chrono>?

<chrono>-kirjasto tarjoaa C++:lle tyyppiturvallisen tavan käsitellä aikaa. Raakojen kokonaislukujen sijaan käytätte vahvasti tyypitettyjä kestoja ja ajanhetkiä, jolloin kääntäjä havaitsee yksiköihin liittyvät virheet.

  • Sekunnit ja millisekunnit eivät enää mene sekaisin.
  • Yksiköt ovat osa tyyppijärjestelmää.
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    seconds s{5};
    std::cout << "Duration: " << s.count() << " seconds\n";
    return 0;
}

Mikä on kesto?

std::chrono::duration esittää ajanjaksoa. Se tallentaa tikkojen lukumäärän sekä tikin jaksoa kuvaavan suhteen. Ennalta määritetyt aliakset kattavat yleiset yksiköt.

  • hours, minutes, seconds
  • milliseconds, microseconds, nanoseconds
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    std::cout << ms.count() << " ms\n";
    return 0;
}

Kestoliteraalit

std::chrono_literals-nimiavaruuden avulla voitte kirjoittaa kestoja jälkiliitteillä, kuten 5s tai 200ms, jolloin koodi muistuttaa tavallista tekstiä.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono_literals;
    auto wait = 3s;
    auto blink = 250ms;
    std::cout << wait.count() << "s, " << blink.count() << "ms\n";
    return 0;
}

Kestojen muuntaminen

duration_cast muuntaa yksiköstä toiseen. Muunnettaessa tarkemmasta yksiköstä karkeampaan tulos katkaistaan, joten 1500 ms muuttuu arvoksi 1 s.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    seconds s = duration_cast<seconds>(ms);
    std::cout << s.count() << " whole seconds\n";
    return 0;
}

Kestoilla tehtävät laskutoimitukset

Kestot tukevat operaattoreita +, -, * ja /. Eri yksiköitä yhdistettäessä käytetään automaattisesti tarkempaa yhteistä yksikköä.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto total = minutes{2} + seconds{30};
    std::cout << total.count() << " seconds total\n";
    return 0;
}

Liukulukukestot

Voitte käyttää liukulukuesitystä säilyttääksenne murto-osat muunnoksen aikana ja välttääksenne kokonaislukukestojen katkaisun.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    duration<double> secs = ms;
    std::cout << secs.count() << " seconds\n";
    return 0;
}

Mikä on kello?

Kello tarjoaa nykyisen ajan. Standardikirjasto sisältää kolme kelloa:

  • system_clock — järjestelmän kellonaika
  • steady_clock — ei kulje koskaan taaksepäin, joten se sopii ajoitukseen
  • high_resolution_clock — pienin käytettävissä oleva tikki
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto now = steady_clock::now();
    std::cout << "Got a time point: " << (now.time_since_epoch().count() > 0) << '\n';
    return 0;
}

system_clock

system_clock seuraa reaalimaailman kalenteriaikaa, ja se voidaan muuntaa näyttämistä varten muotoon time_t. Aika saattaa hypätä, jos järjestelmän kelloa säädetään.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto secs = duration_cast<seconds>(tp.time_since_epoch());
    std::cout << "Seconds since epoch is positive: " << (secs.count() > 0) << '\n';
    return 0;
}

steady_clock

steady_clock on monotoninen: se kulkee vain eteenpäin vakionopeudella. Käyttäkää sitä aina kuluneen ajan mittaamiseen, älkää koskaan system_clock-kelloa.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto a = steady_clock::now();
    auto b = steady_clock::now();
    std::cout << "Monotonic: " << std::boolalpha << (b >= a) << '\n';
    return 0;
}

Kellon resoluutio

Jokainen kello tarjoaa period-jäsenensä käännösaikaisena suhteena. Voitte tarkistaa käännösaikana myös, onko kello vakaa.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    std::cout << "steady_clock is_steady: " << std::boolalpha << steady_clock::is_steady << '\n';
    std::cout << "system_clock is_steady: " << system_clock::is_steady << '\n';
    return 0;
}

Osien yhdistäminen

Yhdistäkää kellot ja kestot: lukekaa kaksi ajanhetkeä ja laskekaa niiden ero valitsemassanne yksikössä esitettynä kestona.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto start = steady_clock::now();
    long sum = 0;
    for (int i = 0; i < 1000000; ++i) sum += i;
    auto end = steady_clock::now();
    auto us = duration_cast<microseconds>(end - start);
    std::cout << "Loop took at least 0 us: " << (us.count() >= 0) << '\n';
    return 0;
}

Pikatarkistus

Testatkaa ymmärrystänne siitä, mitä kelloa ajoituksen mittaamiseen kannattaa käyttää.

Kertaus

Opitte, että <chrono> tarjoaa:

  • kestoja — tyyppiturvallisia ajanjaksoja, joissa voidaan käyttää literaaleja, kuten 5s
  • duration_cast-funktion yksiköiden muuntamiseen (kokonaisluvut katkaistaan)
  • kelloja — system_clock, steady_clock, high_resolution_clock
  • käyttäkää steady_clock-kelloa aikavälien mittaamiseen

Seuraavaksi esitätte tietyt ajanhetket aikapisteinä.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Kestot ja kellot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Kestot ja kellot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kestot ja kellot”?

Mittaa aikavälejä Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Kestot ja kellot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kestot ja kellot
  2. Aikapisteet
  3. Koodin suorituskyvyn mittaaminen
  4. Kalenteri ja aikavyöhykkeet
← Takaisin: C++ Academy