#include <iostream>
#include <iomanip>
#include <chrono>
#include <cmath>
using namespace std;
using namespace chrono;
class Stat
{
public :
Stat( ) : x( 0 ) ,x2( 0 ) ,n( 0 ) { }
void add( double y) { x + = y; x2 + = y* y; n++ ; }
pair< double ,double > get( ) const
{
pair< double ,double > p;
p.first = x/ n;
p.second = sqrt ( ( n* x2- x* x) / n/ ( n- 1 ) ) ;
return p;
}
private :
double x, x2;
int n;
} ;
class Experiment
{
public :
Experiment( void ( * f) ( int ) , int cnt, int n)
: f( f) ,cnt( cnt) ,n( n)
{
}
pair< double ,double > doit( ) ;
private :
void ( * f) ( int ) ;
int cnt, n;
} ;
pair< double ,double > Experiment:: doit ( )
{
using Clock = high_resolution_clock;
Stat st;
for ( int i = 0 ; i < cnt; ++ i)
{
Clock:: time_point start_ = Clock:: now ( ) ;
f( n) ;
Clock:: time_point stop_ = Clock:: now ( ) ;
Clock:: duration dt = stop_ - start_;
st.add ( static_cast < double > ( duration_cast< microseconds> ( dt) .count ( ) ) ) ;
}
return st.get ( ) ;
}
int sum = 0 ; // Просто чтоб оптимизатор не выбросил...
void foo( int n)
{
int s = 0 ;
for ( int i = 0 ; i < n; ++ i)
for ( int j = 0 ; j < n; ++ j)
s + = i* j;
sum + = s;
}
int main( )
{
for ( int n = 100 ; n < 1000 ; n+ = 100 )
{
Experiment ex( foo,
5 , // Число повторов
n) ;
auto p = ex.doit ( ) ;
cout << " N = " << fixed << setw( 7 ) << n <<
" time = " << fixed << setprecision( 1 ) << setw( 12 ) << p.first
<< " +- " << p.second << " mks\n " ;
}
cout << sum;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGNtYXRoPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIGNocm9ubzsKCmNsYXNzIFN0YXQKewpwdWJsaWM6CiAgICBTdGF0KCk6eCgwKSx4MigwKSxuKDApe30KICAgIHZvaWQgYWRkKGRvdWJsZSB5KSB7IHggKz0geTsgeDIgKz0geSp5OyBuKys7IH0KCiAgICBwYWlyPGRvdWJsZSxkb3VibGU+IGdldCgpIGNvbnN0CiAgICB7CiAgICAgICAgcGFpcjxkb3VibGUsZG91YmxlPiBwOwogICAgICAgIHAuZmlyc3QgPSB4L247CiAgICAgICAgcC5zZWNvbmQgPSBzcXJ0KChuKngyLXgqeCkvbi8obi0xKSk7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CnByaXZhdGU6CiAgICBkb3VibGUgeCwgeDI7CiAgICBpbnQgbjsKfTsKCmNsYXNzIEV4cGVyaW1lbnQKewpwdWJsaWM6CiAgICBFeHBlcmltZW50KHZvaWQgKCpmKShpbnQpLCBpbnQgY250LCBpbnQgbikKICAgIDpmKGYpLGNudChjbnQpLG4obikKICAgIHsKICAgIH0KICAgIHBhaXI8ZG91YmxlLGRvdWJsZT4gZG9pdCgpOwpwcml2YXRlOgogICAgdm9pZCAoKmYpKGludCk7CiAgICBpbnQgY250LCBuOwp9OwoKCnBhaXI8ZG91YmxlLGRvdWJsZT4gRXhwZXJpbWVudDo6ZG9pdCgpCnsKICAgIHVzaW5nIENsb2NrID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOwogICAgU3RhdCBzdDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbnQ7ICsraSkKICAgIHsKICAgICAgICBDbG9jazo6dGltZV9wb2ludCBzdGFydF8gPSBDbG9jazo6bm93KCk7CiAgICAgICAgZihuKTsKICAgICAgICBDbG9jazo6dGltZV9wb2ludCBzdG9wXyA9IENsb2NrOjpub3coKTsKICAgICAgICBDbG9jazo6ZHVyYXRpb24gZHQgPSBzdG9wXyAtIHN0YXJ0XzsKICAgICAgICBzdC5hZGQoc3RhdGljX2Nhc3Q8ZG91YmxlPihkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oZHQpLmNvdW50KCkpKTsKICAgIH0KICAgIHJldHVybiBzdC5nZXQoKTsKfQoKaW50IHN1bSA9IDA7ICAvLyDQn9GA0L7RgdGC0L4g0YfRgtC+0LEg0L7Qv9GC0LjQvNC40LfQsNGC0L7RgCDQvdC1INCy0YvQsdGA0L7RgdC40LsuLi4KCnZvaWQgZm9vKGludCBuKQp7CiAgICBpbnQgcyA9IDA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBuOyArK2opCiAgICAgICAgICAgIHMgKz0gaSpqOwogICAgc3VtICs9IHM7Cn0KCmludCBtYWluKCkKewoKICAgIGZvcihpbnQgbiA9IDEwMDsgbiA8IDEwMDA7IG4rPSAxMDApCiAgICB7CiAgICAgICAgRXhwZXJpbWVudCBleChmb28sCiAgICAgICAgICAgICAgICAgICAgICA1LCAvLyDQp9C40YHQu9C+INC/0L7QstGC0L7RgNC+0LIKICAgICAgICAgICAgICAgICAgICAgIG4pOwogICAgICAgIGF1dG8gcCA9IGV4LmRvaXQoKTsKCiAgICAgICAgY291dCA8PCAiIE4gPSAiIDw8IGZpeGVkIDw8IHNldHcoNykgPDwgbiA8PAogICAgICAgICAgICAiICAgdGltZSA9ICAiIDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbigxKSA8PCBzZXR3KDEyKSA8PCBwLmZpcnN0CiAgICAgICAgICAgIDw8ICIgKy0gIiA8PCBwLnNlY29uZCA8PCAiIG1rc1xuIjsKICAgIH0KICAgIGNvdXQgPDwgc3VtOwp9Cgo=