#include <iostream>
#include <iomanip>
#include <random>
#include <chrono>
#include <algorithm>
#include <numeric>
#include <set>
#include <vector>
#include <cstring>
std:: vector < char > chars( 10 '000' 000 ) ;
namespace {
using namespace std:: chrono ;
struct Timer {
using my_clock = high_resolution_clock;
my_clock:: time_point start;
Timer( ) : start{ my_clock:: now ( ) } { }
auto finish( ) {
return duration_cast< microseconds> ( my_clock:: now ( ) - start) ;
}
} ;
}
void benchmark_strchr( const std:: vector < char > & chars, const char * allowed_chars) {
size_t cnt = 0 ;
Timer t;
for ( auto c : chars) {
if ( strchr ( allowed_chars, c) ) {
cnt++ ;
}
}
auto d = t.finish ( ) ;
std:: cout << "strchr found " << std:: setw ( 9 ) << cnt << " in " << std:: setw ( 9 ) << d.count ( ) << " us" << std:: endl ;
}
void benchmark_set( const std:: vector < char > & chars, std:: set < char > allowed_chars) {
size_t cnt = 0 ;
Timer t;
for ( auto c : chars) {
if ( allowed_chars.find ( c) ! = allowed_chars.end ( ) ) {
cnt++ ;
}
}
auto d = t.finish ( ) ;
std:: cout << "set found " << std:: setw ( 9 ) << cnt << " in " << std:: setw ( 9 ) << d.count ( ) << " us" << std:: endl ;
}
int main( )
{
std:: random_device rd;
std:: uniform_int_distribution < int > dist( 'A' , 'z' ) ;
for ( auto & c : chars) {
c = dist( rd) ;
}
benchmark_strchr( chars, "ab" ) ;
benchmark_set( chars, { 'a' ,'b' } ) ;
benchmark_strchr( chars, "abcdef" ) ;
benchmark_set( chars, { 'a' ,'b' ,'c' ,'d' ,'e' ,'f' } ) ;
benchmark_strchr( chars, "abcdefghijkl" ) ;
benchmark_set( chars, { 'a' ,'b' ,'c' ,'d' ,'e' ,'f' ,'g' ,'h' ,'i' ,'j' ,'k' ,'l' } ) ;
benchmark_strchr( chars, "abcdefghijklmnopqrstuvwxyz" ) ;
benchmark_set( chars, { 'a' ,'b' ,'c' ,'d' ,'e' ,'f' ,'g' ,'h' ,'i' ,'j' ,'k' ,'l' ,'m' ,'n' ,'o' ,'p' ,'q' ,'r' ,'s' ,'t' ,'u' ,'v' ,'w' ,'x' ,'y' ,'z' } ) ;
std:: vector < char > all_ascii( 125 ) ;
std:: iota ( all_ascii.begin ( ) , all_ascii.end ( ) , ( char ) 1 ) ;
all_ascii.back ( ) = '\0 ' ;
benchmark_strchr( chars, all_ascii.data ( ) ) ;
benchmark_set( chars, std:: set < char > ( all_ascii.begin ( ) ,all_ascii.end ( ) ) ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxjaHJvbm8+CgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bnVtZXJpYz4KCiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RyaW5nPgoKCnN0ZDo6dmVjdG9yPGNoYXI+IGNoYXJzKDEwJzAwMCcwMDApOwoKCgpuYW1lc3BhY2Ugewp1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CnN0cnVjdCBUaW1lciB7Cgl1c2luZyBteV9jbG9jayA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKCW15X2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0OwoJVGltZXIoKSA6c3RhcnR7IG15X2Nsb2NrOjpub3coKSB9IHt9CglhdXRvIGZpbmlzaCgpIHsKCQlyZXR1cm4gZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KG15X2Nsb2NrOjpub3coKSAtIHN0YXJ0KTsKCX0KfTsKCn0KCnZvaWQgYmVuY2htYXJrX3N0cmNocihjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgY2hhcnMsIGNvbnN0IGNoYXIqIGFsbG93ZWRfY2hhcnMpIHsKCXNpemVfdCBjbnQgPSAwOwoJVGltZXIgdDsKCWZvciAoYXV0byBjIDogY2hhcnMpIHsKCQlpZiAoc3RyY2hyKGFsbG93ZWRfY2hhcnMsIGMpKSB7CgkJCWNudCsrOwoJCX0KCX0KCWF1dG8gZCA9IHQuZmluaXNoKCk7CglzdGQ6OmNvdXQgPDwgInN0cmNociBmb3VuZCAiIDw8IHN0ZDo6c2V0dyg5KSA8PCBjbnQgPDwgIiBpbiAiIDw8IHN0ZDo6c2V0dyg5KSA8PCBkLmNvdW50KCkgPDwgIiB1cyIgPDwgc3RkOjplbmRsOwp9CgoKdm9pZCBiZW5jaG1hcmtfc2V0KGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXI+JiBjaGFycywgc3RkOjpzZXQ8Y2hhcj4gYWxsb3dlZF9jaGFycykgewoJc2l6ZV90IGNudCA9IDA7CglUaW1lciB0OwoJZm9yIChhdXRvIGMgOiBjaGFycykgewoJCWlmIChhbGxvd2VkX2NoYXJzLmZpbmQoYykgIT0gYWxsb3dlZF9jaGFycy5lbmQoKSkgewoJCQljbnQrKzsKCQl9Cgl9CglhdXRvIGQgPSB0LmZpbmlzaCgpOwoJc3RkOjpjb3V0IDw8ICJzZXQgICAgZm91bmQgIiA8PCBzdGQ6OnNldHcoOSkgPDwgY250IDw8ICIgaW4gIiA8PCBzdGQ6OnNldHcoOSkgPDwgZC5jb3VudCgpIDw8ICIgdXMiIDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKQp7CglzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QoJ0EnLCAneicpOwoJZm9yIChhdXRvJiBjIDogY2hhcnMpIHsKCQljID0gZGlzdChyZCk7Cgl9CgoJYmVuY2htYXJrX3N0cmNocihjaGFycywgImFiIik7CgliZW5jaG1hcmtfc2V0KGNoYXJzLCB7ICdhJywnYid9KTsKCWJlbmNobWFya19zdHJjaHIoY2hhcnMsICJhYmNkZWYiKTsKCWJlbmNobWFya19zZXQoY2hhcnMsIHsgJ2EnLCdiJywnYycsJ2QnLCdlJywnZid9KTsKCWJlbmNobWFya19zdHJjaHIoY2hhcnMsICJhYmNkZWZnaGlqa2wiKTsKCWJlbmNobWFya19zZXQoY2hhcnMsIHsgJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsJ2cnLCdoJywnaScsJ2onLCdrJywnbCcgfSk7CgliZW5jaG1hcmtfc3RyY2hyKGNoYXJzLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKCWJlbmNobWFya19zZXQoY2hhcnMsIHsgJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsJ2cnLCdoJywnaScsJ2onLCdrJywnbCcsJ20nLCduJywnbycsJ3AnLCdxJywncicsJ3MnLCd0JywndScsJ3YnLCd3JywneCcsJ3knLCd6JyB9KTsKCQoJc3RkOjp2ZWN0b3I8Y2hhcj4gYWxsX2FzY2lpKDEyNSk7CQoJc3RkOjppb3RhKGFsbF9hc2NpaS5iZWdpbigpLCBhbGxfYXNjaWkuZW5kKCksIChjaGFyKTEpOwoJYWxsX2FzY2lpLmJhY2soKSA9ICdcMCc7CgliZW5jaG1hcmtfc3RyY2hyKGNoYXJzLCBhbGxfYXNjaWkuZGF0YSgpKTsKCWJlbmNobWFya19zZXQoY2hhcnMsIHN0ZDo6c2V0PGNoYXI+KGFsbF9hc2NpaS5iZWdpbigpLGFsbF9hc2NpaS5lbmQoKSkpOwp9