#!/usr/bin/env bash # set to 1 to replace NULL's with newlines rmNullFlag=0 printf '\n\ngenerating random data for test...' case ${rmNullFlag} in 1) dd if=/dev/urandom bs=8M count=1 status=none | tr '\0' '\n' >./data ;; *) dd if=/dev/urandom bs=8M count=1 status=none of=./data ;; esac printf '...DONE!\n\ndata saved at: %s\n\n' "$(realpath ./data)" fSize=$(wc -c <./data) T_all=() shopt -s extglob printN() ( shopt -s extglob N=14 for a in "$@"; do b=".${a##*.}"; c="${a%%.*}"; [[ "$b" == '.' ]] && b=''; L=$(($N-${#b})) (( $L < 0 )) && L=0 printf ' %'"$L"'i%s ' "$c" "$b" done A=("$2" "$3" "$4") A=("${A[@]#0}") A=("${A[@]//./}") A=("${A[@]##@(+(0))}") if (( ${A[0]} < ${A[1]} )) && (( ${A[0]} < ${A[2]} )); then printf ' %'"$N"'s\n' '(read -N)' elif (( ${A[1]} < ${A[0]} )) && (( ${A[1]} < ${A[2]} )); then printf ' %'"$N"'s\n' '(head -c)' elif (( ${A[2]} < ${A[0]} )) && (( ${A[2]} < ${A[1]} )); then printf ' %'"$N"'s\n' '(dd)' fi ) printf ' |------ TIME TAKEN TO READ ./data (sec) ------|\n' printf ' BLOCK SIZE (b) read -N head -c dd (fastest) \n' printf ' -------------- -------------- -------------- -------------- -------------- \n' for kk in {36..69}; do bs=$(( ( (1<<($kk/3)) + (1<<(($kk+1)/3)) + (1<<(($kk+2)/3)) ) / 3 )) nCur=$(( fSize / bs )) (( ( fSize % bs ) == 0 )) || ((nCur++)) T_cur=("${bs}.") T_cur+=( "$( ( T0="$EPOCHREALTIME" for (( nn=0; nn/dev/null done T1="$EPOCHREALTIME" bc <<<"${T1} - ${T0}" ) {fd}<./data )" ) T_cur+=( "$( ( T0="$EPOCHREALTIME" for (( nn=0; nn/dev/null done T1="$EPOCHREALTIME" bc <<<"${T1} - ${T0}" ) {fd}<./data )" ) T_all+=("${T_cur[@]}") printN "${T_cur[@]}" done :<<'EOF' rmNullFlag=0 |------ TIME TAKEN TO READ ./data (sec) ------| BLOCK SIZE (b) read -N head -c dd (fastest) -------------- -------------- -------------- -------------- -------------- 4096 0.577881 2.134629 2.168254 (read -N) 5461 0.557558 1.602566 1.629856 (read -N) 6826 0.538112 1.280189 1.303446 (read -N) 8192 0.530139 1.065451 1.087590 (read -N) 10922 0.514165 0.804109 0.820346 (read -N) 13653 0.508414 0.640662 0.657800 (read -N) 16384 0.500664 0.536005 0.548859 (read -N) 21845 0.495177 0.405616 0.415390 (head -c) 27306 0.490175 0.325530 0.333126 (head -c) 32768 0.487833 0.271419 0.276325 (head -c) 43690 0.484696 0.206399 0.210568 (head -c) 54613 0.482145 0.165755 0.168272 (head -c) 65536 0.482808 0.149508 0.140054 (dd) 87381 0.479665 0.107188 0.107122 (dd) 109226 0.478867 0.086265 0.085535 (dd) 131072 0.480094 0.072135 0.071459 (dd) 174762 0.477128 0.056593 0.055208 (dd) 218453 0.476941 0.045745 0.044129 (dd) 262144 0.477399 0.038158 0.036055 (dd) 349525 0.475730 0.030647 0.029279 (dd) 436906 0.480612 0.025987 0.023573 (dd) 524288 0.477439 0.020297 0.019031 (dd) 699050 0.475734 0.017253 0.015830 (dd) 873813 0.478771 0.014791 0.012921 (dd) 1048576 0.476697 0.011928 0.010202 (dd) 1398101 0.475635 0.010953 0.009336 (dd) 1747626 0.475849 0.008811 0.007100 (dd) 2097152 0.475845 0.007603 0.005881 (dd) 2796202 0.476504 0.007733 0.005987 (dd) 3495253 0.478992 0.006673 0.004991 (dd) 4194304 0.479504 0.005505 0.003776 (dd) 5592405 0.477868 0.005567 0.003801 (dd) 6990506 0.480158 0.005538 0.003770 (dd) 8388608 0.477551 0.004360 0.002619 (dd) EOF :<<'EOF' rmNullFlag=1 |------ TIME TAKEN TO READ ./data (sec) ------| BLOCK SIZE (b) read -N head -c dd (fastest) -------------- -------------- -------------- -------------- -------------- 4096 0.833129 2.106632 2.149970 (read -N) 5461 0.823946 1.586183 1.623270 (read -N) 6826 0.794278 1.272382 1.299200 (read -N) 8192 0.790966 1.064696 1.082916 (read -N) 10922 0.816010 0.799905 0.816509 (head -c) 13653 0.783264 0.641369 0.654673 (head -c) 16384 0.782390 0.534950 0.542706 (head -c) 21845 0.779226 0.404086 0.412532 (head -c) 27306 0.777967 0.323494 0.331067 (head -c) 32768 0.777287 0.271159 0.275422 (head -c) 43690 0.776213 0.204751 0.207842 (head -c) 54613 0.775093 0.164437 0.166445 (head -c) 65536 0.774723 0.137104 0.137659 (head -c) 87381 0.774198 0.104845 0.105304 (head -c) 109226 0.774609 0.083466 0.083733 (head -c) 131072 0.774235 0.069515 0.069417 (dd) 174762 0.774603 0.054610 0.053492 (dd) 218453 0.774398 0.044036 0.043168 (dd) 262144 0.774451 0.036942 0.035567 (dd) 349525 0.772987 0.029198 0.027936 (dd) 436906 0.777925 0.024359 0.022866 (dd) 524288 0.774515 0.019757 0.018363 (dd) 699050 0.775500 0.017015 0.015379 (dd) 873813 0.776066 0.013899 0.012214 (dd) 1048576 0.776521 0.011743 0.010066 (dd) 1398101 0.777348 0.011011 0.009102 (dd) 1747626 0.779205 0.008809 0.007027 (dd) 2097152 0.778963 0.007659 0.005868 (dd) 2796202 0.787139 0.007770 0.005883 (dd) 3495253 0.789371 0.006696 0.004895 (dd) 4194304 0.801932 0.005510 0.003783 (dd) 5592405 0.790147 0.005533 0.003767 (dd) 6990506 0.807509 0.005536 0.003816 (dd) 8388608 0.792601 0.004455 0.002652 (dd) EOF