LINUX.ORG.RU

История изменений

Исправление asaw, (текущая версия) :

Решение anatoly, как оказалось, неплохо масштабируется на десятки тысяч сопрограмм:

#include <boost/asio/io_service.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/high_resolution_timer.hpp>
#include <boost/chrono/chrono.hpp>
#include <iostream>

int main()
{
    boost::asio::io_service ioservice;

    boost::chrono::high_resolution_clock::duration maxDiff(boost::chrono::high_resolution_clock::duration::zero()),
        cumulativeDelay(boost::chrono::high_resolution_clock::duration::zero());
    size_t count = 0;

    for (int coro = 1; coro != 10000; ++coro) {
        boost::asio::spawn(ioservice,
            [coro, &ioservice, &maxDiff, &cumulativeDelay, &count](boost::asio::yield_context yield) {
            boost::asio::basic_waitable_timer<boost::chrono::high_resolution_clock> timer(ioservice);
            std::cout << "Coroutine " << coro << std::endl;
            for (size_t i = 0; i != 10; i++) {
                auto seconds = coro % 10;
                std::cout << "Coroutine " << coro << ": iteration " << i
                          << "; waiting " << seconds << " seconds..." << std::endl;
                timer.expires_from_now(boost::chrono::seconds(seconds));
                timer.async_wait(yield);
                auto diff = boost::chrono::high_resolution_clock::now() - timer.expires_at();
                cumulativeDelay += diff;
                ++count;
                if (maxDiff < diff)
                    maxDiff = diff;
                std::cout << "Coroutine " << coro << ": iteration " << i <<  "; finished waiting " << seconds
                          << " seconds. The delay was "
                          << boost::chrono::duration_cast<boost::chrono::milliseconds>(diff).count()
                          << " milliseconds." << std::endl;
            }
            std::cout << "Coroutine " << coro << ": exiting..." << std::endl;
            });
    }

    ioservice.run();

    std::cout << "All done.\n"
              << "Worst delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(maxDiff).count()
              << " milliseconds.\n"
              << "Mean delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(cumulativeDelay).count() / count
              << " milliseconds."
              << std::endl;

    return 0;
}
...
All done.
Worst delay was 1207 milliseconds.
Mean delay was 11 milliseconds.

В общем, то, что нужно.

Исправление asaw, :

Решение anatoly, как оказалось, неплохо масштабируется на десятки тысяч сопрограмм:

#include <boost/asio/io_service.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/high_resolution_timer.hpp>
#include <boost/chrono/chrono.hpp>
#include <iostream>

int main()
{
    boost::asio::io_service ioservice;

    boost::chrono::high_resolution_clock::duration maxDiff(boost::chrono::high_resolution_clock::duration::zero()),
            cumulativeDelay(boost::chrono::high_resolution_clock::duration::zero());
    size_t count = 0;

    for (int coro = 1; coro != 10000; ++coro) {
        boost::asio::spawn(ioservice, [coro, &ioservice, &maxDiff, &cumulativeDelay, &count](boost::asio::yield_context yield) {
            boost::asio::basic_waitable_timer<boost::chrono::high_resolution_clock> timer(ioservice);
            std::cout << "Coroutine " << coro << std::endl;
            for (size_t i = 0; i != 10; i++) {
                auto seconds = coro % 10;
                std::cout << "Coroutine " << coro << ": iteration " << i
                          << "; waiting " << seconds << " seconds..." << std::endl;
                timer.expires_from_now(boost::chrono::seconds(seconds));
                timer.async_wait(yield);
                auto diff = boost::chrono::high_resolution_clock::now() - timer.expires_at();
                cumulativeDelay += diff;
                ++count;
                if (maxDiff < diff)
                    maxDiff = diff;
                std::cout << "Coroutine " << coro << ": iteration " << i <<  "; finished waiting " << seconds
                          << " seconds. The delay was "
                          << boost::chrono::duration_cast<boost::chrono::milliseconds>(diff).count()
                          << " milliseconds." << std::endl;
            }
            std::cout << "Coroutine " << coro << ": exiting..." << std::endl;
        });
    }

    ioservice.run();

    std::cout << "All done.\n"
              << "Worst delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(maxDiff).count()
              << " milliseconds.\n"
              << "Mean delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(cumulativeDelay).count() / count
              << " milliseconds."
              << std::endl;

    return 0;
}
...
All done.
Worst delay was 1207 milliseconds.
Mean delay was 11 milliseconds.

В общем, то, что нужно.

Исходная версия asaw, :

Решение anatoly, как оказалось, неплохо масштабируется на десятки тысяч сопрограмм:

#include <boost/asio/io_service.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/high_resolution_timer.hpp>
#include <boost/chrono/chrono.hpp>
#include <iostream>

int main()
{
    boost::asio::io_service ioservice;

    boost::chrono::high_resolution_clock::duration maxDiff(boost::chrono::high_resolution_clock::duration::zero()),
            cumulativeDelay(boost::chrono::high_resolution_clock::duration::zero());
    size_t count = 0;

    for (int coro = 1; coro != 10000; ++coro) {
        boost::asio::spawn(ioservice, [coro, &ioservice, &maxDiff, &cumulativeDelay, &count](boost::asio::yield_context yield) {
            boost::asio::basic_waitable_timer<boost::chrono::high_resolution_clock> timer(ioservice);
            std::cout << "Coroutine " << coro << std::endl;
            for (size_t i = 0; i != 10; i++) {
                auto seconds = coro % 10;
                std::cout << "Coroutine " << coro << ": iteration " << i << "; waiting " << seconds << " seconds..." << std::endl;
                timer.expires_from_now(boost::chrono::seconds(seconds));
                timer.async_wait(yield);
                auto diff = boost::chrono::high_resolution_clock::now() - timer.expires_at();
                cumulativeDelay += diff;
                ++count;
                if (maxDiff < diff)
                    maxDiff = diff;
                std::cout << "Coroutine " << coro << ": iteration " << i <<  "; finished waiting " << seconds
                          << " seconds. The delay was "
                          << boost::chrono::duration_cast<boost::chrono::milliseconds>(diff).count()
                          << " milliseconds." << std::endl;
            }
            std::cout << "Coroutine " << coro << ": exiting..." << std::endl;
        });
    }

    ioservice.run();

    std::cout << "All done.\n"
              << "Worst delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(maxDiff).count()
              << " milliseconds.\n"
              << "Mean delay was "
              << boost::chrono::duration_cast<boost::chrono::milliseconds>(cumulativeDelay).count() / count
              << " milliseconds."
              << std::endl;

    return 0;
}
...
All done.
Worst delay was 1207 milliseconds.
Mean delay was 11 milliseconds.

В общем, то, что нужно.