История изменений
Исправление 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.
В общем, то, что нужно.