Guest User

benchmark

a guest
Sep 23rd, 2024
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.22 KB | Source Code | 0 0
  1. #!/bin/bash
  2.  
  3. mkdir -p /tmp/rando
  4. cd /tmp/rando    
  5.  
  6. echo 'BEGIN{
  7.    tgt_len=20;
  8.    for (i=48; i<=122; i++) {
  9.        char = sprintf("%c", i)
  10.        if ( char ~ /[[:alnum:]]/ ) {
  11.            chars[++numChars] = char
  12.        }
  13.    }
  14. }
  15.  
  16. {
  17.    split($0, ec, "")
  18.    for (c in ec) if (!(c in chars)) {printf "Not in alnum: %s\n", c; exit}
  19.    if (length($0)!=20) {printf "%s: length %s\n", $0, length($0); exit}
  20.    if (seen[$0]++) {printf "%s: duplicate key\n", $0; exit}
  21. }
  22. END{
  23.    printf "Lines: %s\n", NR
  24.    cnt=3; for (e in seen) {print e; if (cnt--==0) break  }
  25. }
  26. ' > test.awk
  27.  
  28. echo '
  29. function fill_buf() {
  30.    buf_=""
  31.    buf_idx=1
  32.    min=48
  33.    max=123
  34.    arg=1024
  35.    cmd="od -A n -t u1 -N " arg " /dev/urandom"  # this is POSIX
  36.    #             ^  ^                unsigned character
  37.    #                   ^  ^          count of i*4 bytes
  38.    while((cmd | getline line)>0) {
  39.        split(line, la)
  40.        for (e in la) {
  41.        if (la[e]<min || la[e]>max) continue
  42.        c=sprintf("%c", la[e])
  43.        if (c~/[[:alnum:]]/) buf_=buf_ c
  44.        }
  45.    }
  46.    close(cmd)
  47. }
  48.  
  49. function rand_string(i) {
  50.    if (length(buf_)-buf_idx<i) {fill_buf()}
  51.    rtr=substr(buf_, buf_idx, i)
  52.    buf_idx+=i
  53.    return rtr
  54. }
  55.  
  56. BEGIN {for(i=1;i<=1000;i++) print rand_string(20) }' >awk_od
  57.  
  58.  
  59. echo '
  60. function fill_buf(w,         cmd, line, arg) {
  61.    # buf and buf_idx purposely global
  62.    
  63.    split("", buf)  
  64.    buf_idx=1
  65.    arg=int(w+w*0.2)
  66.    cmd="base64 -w " arg " -i /dev/urandom | head -n 10000"
  67.    while((cmd | getline line)>0) {
  68.        gsub(/[^[:alnum:][:space:]]/, "", line)
  69.        if (length(line)<w) continue
  70.        buf[buf_idx++]=substr(line, 1, w)
  71.    }
  72.    close(cmd)
  73.    buf_idx=1
  74. }
  75.  
  76. function rand_string(w) {
  77.    # Note: if you use length(buf) PRIOR to it being used as an array --
  78.    # it is marked forever as a scalar
  79.    if (buf_idx==0 || length(buf)-buf_idx==-1) fill_buf(w)
  80.    return buf[buf_idx++]
  81. }
  82.  
  83. BEGIN {
  84. for(i=1;i<=10000;i++) print rand_string(20)
  85. }' >awk_base
  86.  
  87.  
  88. echo '
  89. function rand_string(n,         s,i) {
  90.    for ( i=1; i<=n; i++ ) {
  91.        s = s chars[int(1+rand()*numChars)]
  92.    }
  93.    return s
  94. }
  95. BEGIN{
  96.    srand(r)      # Use srand ONCE only
  97.    for (i=48; i<=122; i++) {
  98.        char = sprintf("%c", i)
  99.        if ( char ~ /[[:alnum:]]/ ) {
  100.            chars[++numChars] = char
  101.        }
  102.    }
  103.  
  104.    for (i=1; i<=10000; i++) {print rand_string(20)}
  105. }' >awk_edmorton
  106.    
  107. echo '
  108. function rand_string(i) {
  109.    s=""
  110.    min=48
  111.    max=123
  112.    #srand(res)
  113.    while (length(s)<i) {
  114.        c=sprintf("%c", int(min+rand()*(max-min+1)))
  115.        if (c~/[[:alnum:]]/) s=s c
  116.    }
  117.    return s
  118. }
  119. BEGIN{
  120.    srand(r)
  121.    for (i=1; i<=10000; i++) {print rand_string(20)}
  122. }' >awk_abd1    
  123.    
  124. echo '
  125. function fill_buf(low, high,          i, char) {
  126.    for(i=low; i<=high; i++) {
  127.        char = sprintf("%c", i)
  128.        if ( char ~ /[[:alnum:]]/ ) {
  129.            chars[++numChars] = char
  130.        }
  131.    }
  132. }
  133. function rand_string(n,         s,i) {
  134.    if (numChars=="") fill_buf(48,123)
  135.    for ( i=1; i<=n; i++ ) {
  136.        s = s chars[int(1+rand()*numChars)]
  137.    }
  138.    return s
  139. }
  140. BEGIN{
  141.    srand(r)      # Use srand ONCE only
  142.    for (i=1; i<=10000; i++) {print rand_string(20)}
  143. }' >awk_abd2    
  144.    
  145.            
  146. echo '
  147. def rand_string(len, min=48, max=123, pat=/[[:alnum:]]/)
  148.    # @tgt ||= means only run the first time this function is called
  149.    @tgt ||= (min..max).map(&:chr).grep(pat)
  150.    (1..len).map{ @tgt.sample }.join
  151. end
  152.  
  153. 10_000.times{puts rand_string(20)}' >ruby1_abd
  154.  
  155. echo 'use 5.20.0;
  156. my @alpha = ("a".."z", "A".."Z", "0".."9");
  157. for (1..10000) {
  158.    my @ou;
  159.    push(@ou, @alpha[rand @alpha]) for (1..20);
  160.    say @ou;
  161. }' >perl_abd
  162.  
  163. cat << "EOF" >routines.sh
  164. #!/bin/bash
  165.  
  166. case "$1" in
  167.    
  168.     ruby1)
  169.         echo "ruby1_abd"
  170.         ruby ruby1_abd
  171.     ;;
  172.    
  173.     ruby2)
  174.         echo "ruby2_abd"
  175.         ruby ruby2_abd
  176.     ;;
  177.        
  178.    
  179.     perl)
  180.         echo "perl"
  181.         perl -f perl_abd
  182.     ;;
  183.  
  184.     awk1)
  185.         echo "awk Ed Morton"
  186.         awk -v r=$RANDOM -f awk_edmorton
  187.     ;;
  188.    
  189.     awk2)
  190.         echo "awk abd original"
  191.         awk -f awk_abd1  
  192.     ;;
  193.  
  194.     awk3)
  195.         echo "awk abd ed like"
  196.         awk -f awk_abd2  
  197.     ;;
  198.  
  199.     gawk1)
  200.         gawk -v r=$RANDOM -f awk_edmorton
  201.     ;;
  202.  
  203.     gawk2)
  204.         gawk -v r=$RANDOM -f awk_abd2
  205.     ;;
  206.  
  207.     gawk3)
  208.         awk -v r=$RANDOM -f awk_base
  209.     ;;
  210.  
  211.     awk4)
  212.         echo "awk abd ed like"
  213.         awk -f awk_base  
  214.     ;;
  215.  
  216.  
  217. esac
  218. EOF
  219.  
  220. chmod +x routines.sh
  221.  
  222. cat << "EOF" >tst.pl
  223. #!/usr/bin/perl
  224.  
  225. use strict;
  226. use warnings;
  227.  
  228. use Benchmark qw(:all) ;
  229. use Benchmark ":hireswallclock";
  230.  
  231. cmpthese(50, {
  232.     "ruby abd" => sub { `./routines.sh ruby1` },
  233.     "perl abd" => sub { `./routines.sh perl` },
  234.     "awk EdM" => sub { `./routines.sh awk1` },
  235.     "awk abd 1" => sub { `./routines.sh awk2` },
  236.     "awk abd 2" => sub { `./routines.sh awk3` },
  237.     "gawk EdM" => sub { `./routines.sh gawk1` },
  238.     "gawk abd base64" => sub { `./routines.sh gawk1` },
  239.     "awk abd base64" => sub { `./routines.sh gawk1` },
  240.     "gawk abd 2" => sub { `./routines.sh gawk2` },
  241.     });
  242. EOF
  243.  
  244. perl tst.pl
Add Comment
Please, Sign In to add comment