#include <cstdio>
#include<iostream>
#include <sstream>
#include <chrono>
std:: chrono :: time_point < std:: chrono :: steady_clock > hClock( )
{
return std:: chrono :: steady_clock :: now ( ) ;
}
std:: uint32_t TimeDuration( std:: chrono :: time_point < std:: chrono :: steady_clock > Time)
{
return std:: chrono :: duration_cast < std:: chrono :: nanoseconds > ( hClock( ) - Time) .count ( ) ;
}
void Benchmark( const char * Name, std:: string & str, void ( * func) ( std:: string & str) )
{
auto time = hClock( ) ;
for ( int i = 0 ; i < 100 ; ++ i)
{
func( str) ;
str.clear ( ) ;
}
std:: cout << Name<< " took: " << TimeDuration( time ) / 100 << " nano-seconds.\n " ;
}
void unlocked_bench( std:: string & str)
{
char c = '0' ;
while ( ( c = getchar_unlocked( ) ) && ( c ! = - 1 && c ! = '\n ' && c ! = '\r ' ) )
{
str + = c;
}
}
void getchar_bench( std:: string & str)
{
char c = '0' ;
while ( ( c = getchar ( ) ) && ( c ! = - 1 && c ! = '\n ' && c ! = '\r ' ) )
{
str + = c;
}
}
void getline_bench( std:: string & str)
{
std:: cin .getline ( & str[ 0 ] , str.size ( ) ) ;
}
void scanf_bench( std:: string & str)
{
scanf ( "%[^\n ]100s" , & str[ 0 ] ) ;
}
void fgets_bench( std:: string & str)
{
fgets ( & str[ 0 ] , str.size ( ) , stdin ) ;
}
void cinread_bench( std:: string & str)
{
std:: cin .read ( & str[ 0 ] , str.size ( ) ) ;
}
int main( )
{
std:: string str;
str.reserve ( 100 ) ;
Benchmark( "getchar_unlocked" , str, unlocked_bench) ;
Benchmark( "getchar" , str, getchar_bench) ;
Benchmark( "getline" , str, getline_bench) ;
Benchmark( "scanf" , str, scanf_bench) ;
Benchmark( "fgets" , str, fgets_bench) ;
Benchmark( "cinread" , str, cinread_bench) ;
return 0 ;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgoKc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gaENsb2NrKCkKewogICAgcmV0dXJuIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwp9CgpzdGQ6OnVpbnQzMl90IFRpbWVEdXJhdGlvbihzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiBUaW1lKQp7CiAgICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPihoQ2xvY2soKSAtIFRpbWUpLmNvdW50KCk7Cn0KCgp2b2lkIEJlbmNobWFyayhjb25zdCBjaGFyKiBOYW1lLCBzdGQ6OnN0cmluZyAmc3RyLCB2b2lkKCpmdW5jKShzdGQ6OnN0cmluZyAmc3RyKSkKewogICAgYXV0byB0aW1lID0gaENsb2NrKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKQogICAgewogICAgICAgIGZ1bmMoc3RyKTsKICAgICAgICBzdHIuY2xlYXIoKTsKICAgIH0KICAgIHN0ZDo6Y291dDw8TmFtZTw8IiB0b29rOiAiPDxUaW1lRHVyYXRpb24odGltZSkgLyAxMDA8PCIgbmFuby1zZWNvbmRzLlxuIjsKfQoKdm9pZCB1bmxvY2tlZF9iZW5jaChzdGQ6OnN0cmluZyAmc3RyKQp7CiAgICBjaGFyIGMgPSAnMCc7CiAgICB3aGlsZSgoYyA9IGdldGNoYXJfdW5sb2NrZWQoKSkgJiYgKGMgIT0gLTEgJiYgYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykpCiAgICB7CiAgICAgICAgc3RyICs9IGM7CiAgICB9Cn0KCnZvaWQgZ2V0Y2hhcl9iZW5jaChzdGQ6OnN0cmluZyAmc3RyKQp7CiAgICBjaGFyIGMgPSAnMCc7CiAgICB3aGlsZSgoYyA9IGdldGNoYXIoKSkgICYmIChjICE9IC0xICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdccicpKQogICAgewogICAgICAgIHN0ciArPSBjOwogICAgfQp9Cgp2b2lkIGdldGxpbmVfYmVuY2goc3RkOjpzdHJpbmcgJnN0cikKewogICAgc3RkOjpjaW4uZ2V0bGluZSgmc3RyWzBdLCBzdHIuc2l6ZSgpKTsKfQoKdm9pZCBzY2FuZl9iZW5jaChzdGQ6OnN0cmluZyAmc3RyKQp7CiAgICBzY2FuZigiJVteXG5dMTAwcyIsICZzdHJbMF0pOwp9Cgp2b2lkIGZnZXRzX2JlbmNoKHN0ZDo6c3RyaW5nICZzdHIpCnsKICAgIGZnZXRzKCZzdHJbMF0sIHN0ci5zaXplKCksIHN0ZGluKTsKfQoKdm9pZCBjaW5yZWFkX2JlbmNoKHN0ZDo6c3RyaW5nICZzdHIpCnsKCXN0ZDo6Y2luLnJlYWQoJnN0clswXSwgc3RyLnNpemUoKSk7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpzdHJpbmcgc3RyOwogICAgc3RyLnJlc2VydmUoMTAwKTsKCiAgICBCZW5jaG1hcmsoImdldGNoYXJfdW5sb2NrZWQiLCBzdHIsIHVubG9ja2VkX2JlbmNoKTsKICAgIEJlbmNobWFyaygiZ2V0Y2hhciIsIHN0ciwgZ2V0Y2hhcl9iZW5jaCk7CiAgICBCZW5jaG1hcmsoImdldGxpbmUiLCBzdHIsIGdldGxpbmVfYmVuY2gpOwogICAgQmVuY2htYXJrKCJzY2FuZiIsIHN0ciwgc2NhbmZfYmVuY2gpOwogICAgQmVuY2htYXJrKCJmZ2V0cyIsIHN0ciwgZmdldHNfYmVuY2gpOwogICAgQmVuY2htYXJrKCJjaW5yZWFkIiwgc3RyLCBjaW5yZWFkX2JlbmNoKTsKCiAgICByZXR1cm4gMDsKfQ==
stdin
SGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmUKSGVsbG8gVGhlcmU=
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There
Hello There