Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <chrono>
- #include <cmath>
- #include <iostream>
- #include <thread>
- #include <vector>
- template<clockid_t typ>
- class BasicCas
- {
- protected:
- timespec ts_start;
- timespec ts_stop;
- public:
- void start() noexcept
- {
- clock_gettime(typ, &ts_start);
- }
- void stop() noexcept
- {
- clock_gettime(typ, &ts_stop);
- }
- double interval() noexcept
- {
- return ts_stop.tv_sec - ts_start.tv_sec +
- (ts_stop.tv_nsec - ts_start.tv_nsec) / 1000000000.;
- }
- };
- // pro změření obecného časového intervalu
- using Cas = BasicCas<CLOCK_REALTIME>;
- // pro změření spotřebovaného procesorového času celého procesu
- using CasCpuProcess = BasicCas<CLOCK_PROCESS_CPUTIME_ID>;
- // pro změření spotřebovaného procesorového času jedntlivého vlákna
- using CasCpuThread = BasicCas<CLOCK_THREAD_CPUTIME_ID>;
- bool je_prvocislo(unsigned int cislo) noexcept
- {
- unsigned int mez = static_cast<unsigned int>(sqrt(cislo));
- for (unsigned int i = 2; i <= mez; i++)
- {
- if (0 == cislo % i)
- return false;
- }
- return true;
- }
- void funkce_thread(size_t pocet, int vlakno) noexcept
- {
- Cas cas;
- CasCpuThread cas_thread;
- cas.start();
- cas_thread.start();
- unsigned int pocet_prv = 0;
- for (size_t i = 0; i < pocet; i++)
- {
- if (je_prvocislo(i))
- pocet_prv++;
- }
- using namespace std::chrono_literals;
- std::this_thread::sleep_for(2s); // 2 sekundy které nezaměstnají procesor
- cas_thread.stop();
- cas.stop();
- printf("thread: %d, čas: %.6f, čas cpu thread: %.6f (počet: %u)\n",
- vlakno, cas.interval(), cas_thread.interval(), pocet_prv);
- }
- int main() {
- static constexpr size_t POCET_T = 4;
- std::vector<std::thread> threads;
- threads.reserve(POCET_T); // Not strictly necessary
- Cas cas;
- CasCpuProcess cas_process;
- cas.start();
- cas_process.start();
- for (size_t i = 0; i < POCET_T; i++)
- {
- threads.emplace_back(funkce_thread, 10000000, i);
- }
- for (auto &thread: threads)
- {
- thread.join();
- }
- cas.stop();
- cas_process.stop();
- printf("čas celkem: %.6f, čas cpu procesu: %.6f\n",
- cas.interval(), cas_process.interval());
- printf("----------\nhotovo\n");
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment