Last active
August 29, 2015 14:01
-
-
Save rklemme/fad399b5e7cc4d3b6d0c to your computer and use it in GitHub Desktop.
Test program to investigate effects of buffering and buffer sizes for char based input from file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Start | |
Reading /tmp/tmp-char-ascii-4004479685424479203.txt bytes: 104857602 chars: 104857602 | |
reader=SINGLE char= 0 byte= 0 3716927.000us | |
reader=SINGLE char= 0 byte= 1024 3685206.000us | |
reader=SINGLE char= 0 byte= 2048 3278808.000us | |
reader=SINGLE char= 0 byte= 8192 3560530.000us | |
reader=SINGLE char= 1024 byte= 0 809555.000us | |
reader=SINGLE char= 1024 byte= 1024 782035.000us | |
reader=SINGLE char= 1024 byte= 2048 1172425.000us | |
reader=SINGLE char= 1024 byte= 8192 1312639.000us | |
reader=SINGLE char= 2048 byte= 0 929860.000us | |
reader=SINGLE char= 2048 byte= 1024 1040306.000us | |
reader=SINGLE char= 2048 byte= 2048 1314209.000us | |
reader=SINGLE char= 2048 byte= 8192 1070333.000us | |
reader=SINGLE char= 8192 byte= 0 1442043.000us | |
reader=SINGLE char= 8192 byte= 1024 808655.000us | |
reader=SINGLE char= 8192 byte= 2048 813564.000us | |
reader=SINGLE char= 8192 byte= 8192 1147072.000us | |
reader=LINE char= 0 byte= 0 373626.000us | |
reader=LINE char= 0 byte= 1024 340572.000us | |
reader=LINE char= 0 byte= 2048 345767.000us | |
reader=LINE char= 0 byte= 8192 346670.000us | |
reader=LINE char= 1024 byte= 0 341090.000us | |
reader=LINE char= 1024 byte= 1024 340530.000us | |
reader=LINE char= 1024 byte= 2048 374522.000us | |
reader=LINE char= 1024 byte= 8192 352931.000us | |
reader=LINE char= 2048 byte= 0 357639.000us | |
reader=LINE char= 2048 byte= 1024 333741.000us | |
reader=LINE char= 2048 byte= 2048 374869.000us | |
reader=LINE char= 2048 byte= 8192 352889.000us | |
reader=LINE char= 8192 byte= 0 324838.000us | |
reader=LINE char= 8192 byte= 1024 334371.000us | |
reader=LINE char= 8192 byte= 2048 391492.000us | |
reader=LINE char= 8192 byte= 8192 362879.000us | |
reader=BUFFERED char= 0 byte= 0 159865.000us | |
reader=BUFFERED char= 0 byte= 1024 159965.000us | |
reader=BUFFERED char= 0 byte= 2048 156932.000us | |
reader=BUFFERED char= 0 byte= 8192 158182.000us | |
reader=BUFFERED char= 1024 byte= 0 159310.000us | |
reader=BUFFERED char= 1024 byte= 1024 171722.000us | |
reader=BUFFERED char= 1024 byte= 2048 233843.000us | |
reader=BUFFERED char= 1024 byte= 8192 227361.000us | |
reader=BUFFERED char= 2048 byte= 0 259845.000us | |
reader=BUFFERED char= 2048 byte= 1024 280532.000us | |
reader=BUFFERED char= 2048 byte= 2048 279555.000us | |
reader=BUFFERED char= 2048 byte= 8192 264532.000us | |
reader=BUFFERED char= 8192 byte= 0 280157.000us | |
reader=BUFFERED char= 8192 byte= 1024 192594.000us | |
reader=BUFFERED char= 8192 byte= 2048 192070.000us | |
reader=BUFFERED char= 8192 byte= 8192 193734.000us | |
reader=BUFFERED64K char= 0 byte= 0 187646.000us | |
reader=BUFFERED64K char= 0 byte= 1024 188163.000us | |
reader=BUFFERED64K char= 0 byte= 2048 188192.000us | |
reader=BUFFERED64K char= 0 byte= 8192 188268.000us | |
reader=BUFFERED64K char= 1024 byte= 0 187956.000us | |
reader=BUFFERED64K char= 1024 byte= 1024 188154.000us | |
reader=BUFFERED64K char= 1024 byte= 2048 188242.000us | |
reader=BUFFERED64K char= 1024 byte= 8192 188245.000us | |
reader=BUFFERED64K char= 2048 byte= 0 187445.000us | |
reader=BUFFERED64K char= 2048 byte= 1024 188316.000us | |
reader=BUFFERED64K char= 2048 byte= 2048 188197.000us | |
reader=BUFFERED64K char= 2048 byte= 8192 187968.000us | |
reader=BUFFERED64K char= 8192 byte= 0 187751.000us | |
reader=BUFFERED64K char= 8192 byte= 1024 188160.000us | |
reader=BUFFERED64K char= 8192 byte= 2048 188005.000us | |
reader=BUFFERED64K char= 8192 byte= 8192 188349.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=false 263796.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=false 200440.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=false 160536.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=false 255369.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=false 201430.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=false 162975.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=false 254948.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=false 201614.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=false 162386.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=true 490805.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=true 436848.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=true 399712.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=true 486611.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=true 438617.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=true 401804.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=true 486368.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=true 439289.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=true 400586.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=false 924439.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=false 921108.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=false 915415.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=false 968312.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=false 928766.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=false 921730.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=false 942170.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=false 887546.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=false 861686.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=true 1251148.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=true 1247842.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=true 1203504.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=true 1242397.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=true 1061240.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=true 1154534.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=true 1142865.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=true 1129508.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=true 1167778.000us | |
Reading /tmp/tmp-char-utf-727134951993887351.txt bytes: 308402234 chars: 104857602 | |
reader=SINGLE char= 0 byte= 0 6551863.000us | |
reader=SINGLE char= 0 byte= 1024 6749784.000us | |
reader=SINGLE char= 0 byte= 2048 6759489.000us | |
reader=SINGLE char= 0 byte= 8192 7159491.000us | |
reader=SINGLE char= 1024 byte= 0 3317198.000us | |
reader=SINGLE char= 1024 byte= 1024 3003561.000us | |
reader=SINGLE char= 1024 byte= 2048 3258627.000us | |
reader=SINGLE char= 1024 byte= 8192 3364398.000us | |
reader=SINGLE char= 2048 byte= 0 2977592.000us | |
reader=SINGLE char= 2048 byte= 1024 2998418.000us | |
reader=SINGLE char= 2048 byte= 2048 3155971.000us | |
reader=SINGLE char= 2048 byte= 8192 4832263.000us | |
reader=SINGLE char= 8192 byte= 0 3255589.000us | |
reader=SINGLE char= 8192 byte= 1024 3266768.000us | |
reader=SINGLE char= 8192 byte= 2048 3043318.000us | |
reader=SINGLE char= 8192 byte= 8192 3367848.000us | |
reader=LINE char= 0 byte= 0 2185056.000us | |
reader=LINE char= 0 byte= 1024 2133979.000us | |
reader=LINE char= 0 byte= 2048 2606057.000us | |
reader=LINE char= 0 byte= 8192 2271582.000us | |
reader=LINE char= 1024 byte= 0 2349179.000us | |
reader=LINE char= 1024 byte= 1024 2134017.000us | |
reader=LINE char= 1024 byte= 2048 2415891.000us | |
reader=LINE char= 1024 byte= 8192 2427238.000us | |
reader=LINE char= 2048 byte= 0 2123470.000us | |
reader=LINE char= 2048 byte= 1024 2607496.000us | |
reader=LINE char= 2048 byte= 2048 2180722.000us | |
reader=LINE char= 2048 byte= 8192 2422312.000us | |
reader=LINE char= 8192 byte= 0 2418166.000us | |
reader=LINE char= 8192 byte= 1024 2766880.000us | |
reader=LINE char= 8192 byte= 2048 2289213.000us | |
reader=LINE char= 8192 byte= 8192 2366282.000us | |
reader=BUFFERED char= 0 byte= 0 1939557.000us | |
reader=BUFFERED char= 0 byte= 1024 1941291.000us | |
reader=BUFFERED char= 0 byte= 2048 1941830.000us | |
reader=BUFFERED char= 0 byte= 8192 2151863.000us | |
reader=BUFFERED char= 1024 byte= 0 1940264.000us | |
reader=BUFFERED char= 1024 byte= 1024 1943842.000us | |
reader=BUFFERED char= 1024 byte= 2048 1941973.000us | |
reader=BUFFERED char= 1024 byte= 8192 2082716.000us | |
reader=BUFFERED char= 2048 byte= 0 1974395.000us | |
reader=BUFFERED char= 2048 byte= 1024 1978193.000us | |
reader=BUFFERED char= 2048 byte= 2048 1976079.000us | |
reader=BUFFERED char= 2048 byte= 8192 2110660.000us | |
reader=BUFFERED char= 8192 byte= 0 1974551.000us | |
reader=BUFFERED char= 8192 byte= 1024 1976740.000us | |
reader=BUFFERED char= 8192 byte= 2048 1977695.000us | |
reader=BUFFERED char= 8192 byte= 8192 2109207.000us | |
reader=BUFFERED64K char= 0 byte= 0 1937762.000us | |
reader=BUFFERED64K char= 0 byte= 1024 1938648.000us | |
reader=BUFFERED64K char= 0 byte= 2048 1937123.000us | |
reader=BUFFERED64K char= 0 byte= 8192 2072527.000us | |
reader=BUFFERED64K char= 1024 byte= 0 1938306.000us | |
reader=BUFFERED64K char= 1024 byte= 1024 1938458.000us | |
reader=BUFFERED64K char= 1024 byte= 2048 1939081.000us | |
reader=BUFFERED64K char= 1024 byte= 8192 2072575.000us | |
reader=BUFFERED64K char= 2048 byte= 0 1937438.000us | |
reader=BUFFERED64K char= 2048 byte= 1024 1938456.000us | |
reader=BUFFERED64K char= 2048 byte= 2048 1938324.000us | |
reader=BUFFERED64K char= 2048 byte= 8192 2072919.000us | |
reader=BUFFERED64K char= 8192 byte= 0 1937550.000us | |
reader=BUFFERED64K char= 8192 byte= 1024 1938823.000us | |
reader=BUFFERED64K char= 8192 byte= 2048 1937946.000us | |
reader=BUFFERED64K char= 8192 byte= 8192 2072847.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=false 2289810.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=false 2098415.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=false 1970832.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=false 2285700.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=false 2098866.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=false 1970693.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=false 2288119.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=false 2098341.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=false 1967583.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=true 2903005.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=true 2741875.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=true 2618314.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=true 2901713.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=true 2744965.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=true 2620742.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=true 2902874.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=true 2753153.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=true 2618146.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=false 3075911.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=false 2933735.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=false 2663972.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=false 2937459.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=false 2711801.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=false 2588752.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=false 2989592.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=false 2883411.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=false 2686119.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=true 3553686.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=true 3676156.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=true 3583337.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=true 3771090.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=true 3384421.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=true 3357113.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=true 3829637.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=true 3617603.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=true 3350561.000us | |
Finish |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Start | |
Reading /tmp/tmp-char-ascii-1536373161176149564.txt bytes: 104857602 chars: 104857602 | |
reader=SINGLE char= 0 byte= 0 4309208.000us | |
reader=SINGLE char= 0 byte= 1024 4212608.000us | |
reader=SINGLE char= 0 byte= 2048 4084157.000us | |
reader=SINGLE char= 0 byte= 8192 3861968.000us | |
reader=SINGLE char= 1024 byte= 0 900993.000us | |
reader=SINGLE char= 1024 byte= 1024 891053.000us | |
reader=SINGLE char= 1024 byte= 2048 888447.000us | |
reader=SINGLE char= 1024 byte= 8192 904940.000us | |
reader=SINGLE char= 2048 byte= 0 888169.000us | |
reader=SINGLE char= 2048 byte= 1024 1267161.000us | |
reader=SINGLE char= 2048 byte= 2048 1459287.000us | |
reader=SINGLE char= 2048 byte= 8192 1934340.000us | |
reader=SINGLE char= 8192 byte= 0 1929112.000us | |
reader=SINGLE char= 8192 byte= 1024 1975659.000us | |
reader=SINGLE char= 8192 byte= 2048 1976461.000us | |
reader=SINGLE char= 8192 byte= 8192 1925895.000us | |
reader=LINE char= 0 byte= 0 604009.000us | |
reader=LINE char= 0 byte= 1024 592278.000us | |
reader=LINE char= 0 byte= 2048 561253.000us | |
reader=LINE char= 0 byte= 8192 593876.000us | |
reader=LINE char= 1024 byte= 0 599101.000us | |
reader=LINE char= 1024 byte= 1024 582607.000us | |
reader=LINE char= 1024 byte= 2048 566616.000us | |
reader=LINE char= 1024 byte= 8192 626960.000us | |
reader=LINE char= 2048 byte= 0 652301.000us | |
reader=LINE char= 2048 byte= 1024 623658.000us | |
reader=LINE char= 2048 byte= 2048 727884.000us | |
reader=LINE char= 2048 byte= 8192 544272.000us | |
reader=LINE char= 8192 byte= 0 686681.000us | |
reader=LINE char= 8192 byte= 1024 572193.000us | |
reader=LINE char= 8192 byte= 2048 659594.000us | |
reader=LINE char= 8192 byte= 8192 557222.000us | |
reader=BUFFERED char= 0 byte= 0 480135.000us | |
reader=BUFFERED char= 0 byte= 1024 466782.000us | |
reader=BUFFERED char= 0 byte= 2048 478772.000us | |
reader=BUFFERED char= 0 byte= 8192 464892.000us | |
reader=BUFFERED char= 1024 byte= 0 484146.000us | |
reader=BUFFERED char= 1024 byte= 1024 486030.000us | |
reader=BUFFERED char= 1024 byte= 2048 471020.000us | |
reader=BUFFERED char= 1024 byte= 8192 483952.000us | |
reader=BUFFERED char= 2048 byte= 0 504089.000us | |
reader=BUFFERED char= 2048 byte= 1024 503178.000us | |
reader=BUFFERED char= 2048 byte= 2048 497017.000us | |
reader=BUFFERED char= 2048 byte= 8192 501930.000us | |
reader=BUFFERED char= 8192 byte= 0 498995.000us | |
reader=BUFFERED char= 8192 byte= 1024 499851.000us | |
reader=BUFFERED char= 8192 byte= 2048 504605.000us | |
reader=BUFFERED char= 8192 byte= 8192 494743.000us | |
reader=BUFFERED64K char= 0 byte= 0 518512.000us | |
reader=BUFFERED64K char= 0 byte= 1024 519428.000us | |
reader=BUFFERED64K char= 0 byte= 2048 515154.000us | |
reader=BUFFERED64K char= 0 byte= 8192 515697.000us | |
reader=BUFFERED64K char= 1024 byte= 0 514617.000us | |
reader=BUFFERED64K char= 1024 byte= 1024 515713.000us | |
reader=BUFFERED64K char= 1024 byte= 2048 523133.000us | |
reader=BUFFERED64K char= 1024 byte= 8192 515543.000us | |
reader=BUFFERED64K char= 2048 byte= 0 515111.000us | |
reader=BUFFERED64K char= 2048 byte= 1024 515732.000us | |
reader=BUFFERED64K char= 2048 byte= 2048 515109.000us | |
reader=BUFFERED64K char= 2048 byte= 8192 515627.000us | |
reader=BUFFERED64K char= 8192 byte= 0 516117.000us | |
reader=BUFFERED64K char= 8192 byte= 1024 515470.000us | |
reader=BUFFERED64K char= 8192 byte= 2048 515019.000us | |
reader=BUFFERED64K char= 8192 byte= 8192 515165.000us | |
Reading /tmp/tmp-char-utf-8255120276968437831.txt bytes: 308402234 chars: 104857602 | |
reader=SINGLE char= 0 byte= 0 6809385.000us | |
reader=SINGLE char= 0 byte= 1024 6504751.000us | |
reader=SINGLE char= 0 byte= 2048 6636271.000us | |
reader=SINGLE char= 0 byte= 8192 6649756.000us | |
reader=SINGLE char= 1024 byte= 0 3073988.000us | |
reader=SINGLE char= 1024 byte= 1024 3069266.000us | |
reader=SINGLE char= 1024 byte= 2048 3646530.000us | |
reader=SINGLE char= 1024 byte= 8192 3172781.000us | |
reader=SINGLE char= 2048 byte= 0 3030564.000us | |
reader=SINGLE char= 2048 byte= 1024 3065943.000us | |
reader=SINGLE char= 2048 byte= 2048 3054389.000us | |
reader=SINGLE char= 2048 byte= 8192 3412974.000us | |
reader=SINGLE char= 8192 byte= 0 3057997.000us | |
reader=SINGLE char= 8192 byte= 1024 3068520.000us | |
reader=SINGLE char= 8192 byte= 2048 3056691.000us | |
reader=SINGLE char= 8192 byte= 8192 3196040.000us | |
reader=LINE char= 0 byte= 0 2486703.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 0 byte= 1024 2416226.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 0 byte= 2048 2339396.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 0 byte= 8192 2533178.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 1024 byte= 0 2339283.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 1024 byte= 1024 2583537.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 1024 byte= 2048 2464098.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 1024 byte= 8192 2768545.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 2048 byte= 0 2647517.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 2048 byte= 1024 2390487.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712]reader= | |
LINE char= 2048 byte= 2048 2771559.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 2048 byte= 8192 3024743.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 8192 byte= 0 2426423.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 8192 byte= 1024 2932872.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 8192 byte= 2048 2353860.000us | |
ERROR: expected: FileMeta [fileName=/tmp/tmp-char-utf-8255120276968437831.txt, charCount=104857602, charCrc=2265273366982090496] | |
got : FileMeta [fileName=null, charCount=104857583, charCrc=-4649463682814067712] | |
reader=LINE char= 8192 byte= 8192 2804264.000us | |
reader=BUFFERED char= 0 byte= 0 3151093.000us | |
reader=BUFFERED char= 0 byte= 1024 3145268.000us | |
reader=BUFFERED char= 0 byte= 2048 3147903.000us | |
reader=BUFFERED char= 0 byte= 8192 2300414.000us | |
reader=BUFFERED char= 1024 byte= 0 3141852.000us | |
reader=BUFFERED char= 1024 byte= 1024 3068794.000us | |
reader=BUFFERED char= 1024 byte= 2048 2981447.000us | |
reader=BUFFERED char= 1024 byte= 8192 3138823.000us | |
reader=BUFFERED char= 2048 byte= 0 3147216.000us | |
reader=BUFFERED char= 2048 byte= 1024 3172621.000us | |
reader=BUFFERED char= 2048 byte= 2048 3172594.000us | |
reader=BUFFERED char= 2048 byte= 8192 3354887.000us | |
reader=BUFFERED char= 8192 byte= 0 3163720.000us | |
reader=BUFFERED char= 8192 byte= 1024 3203037.000us | |
reader=BUFFERED char= 8192 byte= 2048 3166248.000us | |
reader=BUFFERED char= 8192 byte= 8192 3351748.000us | |
reader=BUFFERED64K char= 0 byte= 0 3128867.000us | |
reader=BUFFERED64K char= 0 byte= 1024 3131647.000us | |
reader=BUFFERED64K char= 0 byte= 2048 2870754.000us | |
reader=BUFFERED64K char= 0 byte= 8192 2465051.000us | |
reader=BUFFERED64K char= 1024 byte= 0 2111038.000us | |
reader=BUFFERED64K char= 1024 byte= 1024 3009588.000us | |
reader=BUFFERED64K char= 1024 byte= 2048 3133589.000us | |
reader=BUFFERED64K char= 1024 byte= 8192 3318486.000us | |
reader=BUFFERED64K char= 2048 byte= 0 2917318.000us | |
reader=BUFFERED64K char= 2048 byte= 1024 3135227.000us | |
reader=BUFFERED64K char= 2048 byte= 2048 3132798.000us | |
reader=BUFFERED64K char= 2048 byte= 8192 3320105.000us | |
reader=BUFFERED64K char= 8192 byte= 0 3127585.000us | |
reader=BUFFERED64K char= 8192 byte= 1024 2924861.000us | |
reader=BUFFERED64K char= 8192 byte= 2048 2776100.000us | |
reader=BUFFERED64K char= 8192 byte= 8192 3314881.000us | |
Reading /tmp/tmp-char-ascii-1536373161176149564.txt bytes: 104857602 chars: 104857602 | |
reader=NioCharReader char= 1024 byte= 1024 direct=false 623960.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=true 813146.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=false 371722.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=true 593066.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=false 314906.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=true 563235.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=false 405766.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=true 872756.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=false 420242.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=true 898717.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=false 481413.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=true 837116.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=false 517692.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=true 763231.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=false 361425.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=true 602259.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=false 323609.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=true 563538.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=false 1167672.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=true 1273258.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=false 1091277.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=true 1188911.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=false 1036657.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=true 1207161.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=false 1127132.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=true 1281427.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=false 1197076.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=true 1392777.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=false 919724.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=true 1164638.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=false 1125513.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=true 1503200.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=false 970854.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=true 1390800.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=false 922418.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=true 1195013.000us | |
Reading /tmp/tmp-char-utf-8255120276968437831.txt bytes: 308402234 chars: 104857602 | |
reader=NioCharReader char= 1024 byte= 1024 direct=false 2466832.000us | |
reader=NioCharReader char= 1024 byte= 1024 direct=true 3092318.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=false 2185235.000us | |
reader=NioCharReader char= 1024 byte= 2048 direct=true 3398682.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=false 2983615.000us | |
reader=NioCharReader char= 1024 byte= 8192 direct=true 2958349.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=false 2332864.000us | |
reader=NioCharReader char= 2048 byte= 1024 direct=true 3105869.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=false 2265091.000us | |
reader=NioCharReader char= 2048 byte= 2048 direct=true 2922959.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=false 2332361.000us | |
reader=NioCharReader char= 2048 byte= 8192 direct=true 4167623.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=false 3425569.000us | |
reader=NioCharReader char= 8192 byte= 1024 direct=true 4559130.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=false 3297374.000us | |
reader=NioCharReader char= 8192 byte= 2048 direct=true 4340816.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=false 3184622.000us | |
reader=NioCharReader char= 8192 byte= 8192 direct=true 4173856.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=false 3416056.000us | |
reader=NioLineReader char= 1024 byte= 1024 direct=true 3685802.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=false 2794199.000us | |
reader=NioLineReader char= 1024 byte= 2048 direct=true 5183371.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=false 3025162.000us | |
reader=NioLineReader char= 1024 byte= 8192 direct=true 4110376.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=false 2995525.000us | |
reader=NioLineReader char= 2048 byte= 1024 direct=true 5035473.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=false 2913143.000us | |
reader=NioLineReader char= 2048 byte= 2048 direct=true 3583224.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=false 2911121.000us | |
reader=NioLineReader char= 2048 byte= 8192 direct=true 4764181.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=false 2944323.000us | |
reader=NioLineReader char= 8192 byte= 1024 direct=true 4340211.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=false 2810150.000us | |
reader=NioLineReader char= 8192 byte= 2048 direct=true 5011093.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=false 2985626.000us | |
reader=NioLineReader char= 8192 byte= 8192 direct=true 4190362.000us | |
Finish |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package file; | |
import java.io.BufferedInputStream; | |
import java.io.BufferedOutputStream; | |
import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStreamWriter; | |
import java.io.Reader; | |
import java.io.Writer; | |
import java.nio.ByteBuffer; | |
import java.nio.CharBuffer; | |
import java.nio.channels.FileChannel; | |
import java.nio.charset.Charset; | |
import java.nio.charset.CharsetDecoder; | |
import java.nio.charset.CharsetEncoder; | |
import java.nio.charset.CoderResult; | |
import java.nio.file.StandardOpenOption; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.Random; | |
import java.util.concurrent.TimeUnit; | |
public final class TestBufferingForCharIO { | |
private static final char NL = '\n'; | |
private static final long FILE_CHAR_LEN = 100L * 1024 * 1024; | |
private static final long LINE_LEN = 80L; | |
private static final Charset UTF8 = Charset.forName("UTF-8"); | |
private static final CharsetEncoder UTF8_ENCODER = UTF8.newEncoder(); | |
private static final int[] BUFFER_SIZES = { 0, 1024, 2048, 8192 }; | |
private static final int[] NIO_BUFFER_SIZES = { 1024, 2048, 8192 }; | |
private static final int REPEATS = 4; | |
private static class CharSource { | |
private final Random rnd = new Random(0); | |
private final char min; | |
private final char max; | |
public CharSource(char min, char max) { | |
if (min > max) { | |
throw new IllegalArgumentException(); | |
} | |
this.min = min; | |
this.max = max; | |
} | |
public char nextChar() { | |
char ch; | |
do { | |
ch = (char) (min + rnd.nextInt(max - min + 1)); | |
} while (!UTF8_ENCODER.canEncode(ch)); | |
return ch; | |
} | |
} | |
private static final class FileMeta { | |
private final File fileName; | |
private final long charCount; | |
private final long charCrc; | |
public FileMeta(File fileName, long charCount, long charCrc) { | |
this.fileName = fileName; | |
this.charCount = charCount; | |
this.charCrc = charCrc; | |
} | |
public File getFileName() { | |
return fileName; | |
} | |
public long getCharCount() { | |
return charCount; | |
} | |
public long getCharCrc() { | |
return charCrc; | |
} | |
@Override | |
public String toString() { | |
final StringBuilder sb = new StringBuilder(); | |
sb.append("FileMeta [fileName="); | |
sb.append(fileName); | |
sb.append(", charCount="); | |
sb.append(charCount); | |
sb.append(", charCrc="); | |
sb.append(charCrc); | |
sb.append("]"); | |
return sb.toString(); | |
} | |
} | |
private static void readBuffered(final Reader r, final int bufferSize) throws IOException { | |
final char[] buffer = new char[bufferSize]; | |
for (int i; (i = r.read(buffer)) != -1;) { | |
for (int j = 0; j < i; ++j) { | |
@SuppressWarnings("unused") | |
final char ch = buffer[j]; // access array | |
} | |
} | |
} | |
private enum Rdr { | |
SINGLE { | |
@Override | |
public void readAll(Reader r) throws IOException { | |
while (r.read() != -1) | |
; | |
} | |
}, | |
LINE { | |
@Override | |
public void readAll(Reader r) throws IOException { | |
@SuppressWarnings("resource") | |
final BufferedReader br = r instanceof BufferedReader ? (BufferedReader) r : new BufferedReader(r, 1024); | |
while (br.readLine() != null) | |
; | |
} | |
}, | |
BUFFERED { | |
@Override | |
public void readAll(Reader r) throws IOException { | |
readBuffered(r, 1024); | |
} | |
}, | |
BUFFERED64K { | |
@Override | |
public void readAll(Reader r) throws IOException { | |
readBuffered(r, 65536); | |
} | |
}; | |
public abstract void readAll(Reader r) throws IOException; | |
} | |
private static abstract class NioReader { | |
public void begin() { | |
// NOP | |
} | |
public abstract void readChunk(CharBuffer b); | |
public void finish(CharBuffer b) { | |
// NOP | |
} | |
@Override | |
public String toString() { | |
return getClass().getSimpleName(); | |
} | |
} | |
private static class NioCharReader extends NioReader { | |
@Override | |
public void readChunk(CharBuffer b) { | |
while (b.hasRemaining()) { | |
b.get(); | |
} | |
} | |
}; | |
private static class NioLineReader extends NioReader { | |
private final StringBuilder sb = new StringBuilder(); | |
@Override | |
public void begin() { | |
sb.setLength(0); | |
} | |
@Override | |
public void finish(CharBuffer b) { | |
readChunk(b); | |
if (sb.length() > 0) { | |
line(); | |
} | |
} | |
@Override | |
public void readChunk(CharBuffer b) { | |
while (b.hasRemaining()) { | |
final char ch = b.get(); | |
if (ch == NL) { | |
line(); | |
} else { | |
sb.append(ch); | |
} | |
} | |
} | |
private String line() { | |
final String s = sb.toString(); | |
sb.setLength(0); | |
return s; | |
} | |
}; | |
public static void main(String[] args) throws IOException { | |
System.out.println("Start"); | |
final FileMeta[] filesToRead = { createTestFile("ascii", FILE_CHAR_LEN, new CharSource(' ', (char) 127)), | |
createTestFile("utf", FILE_CHAR_LEN, new CharSource(Character.MIN_VALUE, Character.MAX_VALUE)) }; | |
for (final FileMeta fileToRead : filesToRead) { | |
fileToRead.getFileName().deleteOnExit(); | |
} | |
final List<NioReader> nioRdrs = Arrays.asList(new NioCharReader(), new NioLineReader()); | |
for (final FileMeta fileMeta : filesToRead) { | |
final File fileToRead = fileMeta.getFileName(); | |
System.out.println("Reading " + fileToRead + " bytes: " + fileToRead.length() + " chars: " | |
+ fileMeta.getCharCount()); | |
for (final Rdr r : Rdr.values()) { | |
for (final int charBuffer : BUFFER_SIZES) { | |
for (final int byteBuffer : BUFFER_SIZES) { | |
long t = Long.MAX_VALUE; | |
for (int i = 0; i < REPEATS; ++i) { | |
t = Math.min(t, readFile(fileMeta, byteBuffer, charBuffer, r)); | |
} | |
System.out.printf("reader=%-14s char=%6d byte=%6d %15.3fus\n", r, charBuffer, byteBuffer, (double) t); | |
} | |
} | |
} | |
System.out.println(); | |
for (final NioReader r : nioRdrs) { | |
for (final boolean direct : new boolean[] { false, true }) { | |
for (final int charBuffer : NIO_BUFFER_SIZES) { | |
for (final int byteBuffer : NIO_BUFFER_SIZES) { | |
long t = Long.MAX_VALUE; | |
for (int i = 0; i < REPEATS; ++i) { | |
t = Math.min(t, readFileNio(fileMeta, direct, byteBuffer, charBuffer, r)); | |
} | |
System.out.printf("reader=%-14s char=%6d byte=%6d direct=%-6s %15.3fus\n", r, charBuffer, byteBuffer, | |
direct, (double) t); | |
} | |
} | |
} | |
} | |
System.out.println(); | |
} | |
System.out.println("Finish"); | |
} | |
private static FileMeta createTestFile(String label, final long roughCharCount, CharSource source) throws IOException { | |
final File f = File.createTempFile("tmp-char-" + label + "-", ".txt"); | |
final Writer fw = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(f), 4096), UTF8); | |
try { | |
long count = 0; | |
while (count < roughCharCount) { | |
final char ch = source.nextChar(); | |
assert Character.isDefined(ch); | |
assert UTF8_ENCODER.canEncode(ch); | |
fw.append(ch); | |
if (++count % LINE_LEN == 0) { | |
fw.append(NL); | |
++count; | |
} | |
} | |
fw.append(NL); | |
++count; | |
fw.flush(); | |
return new FileMeta(f, count, 0); | |
} finally { | |
fw.close(); | |
} | |
} | |
@SuppressWarnings("resource") | |
private static long readFile(final FileMeta fileMeta, final int byteBufferSize, final int charBufferSize, | |
final Rdr reader) throws IOException { | |
final File f = fileMeta.getFileName(); | |
final InputStream bytesIn = new FileInputStream(f); | |
final InputStream bufferedBytesIn = byteBufferSize == 0 ? bytesIn | |
: new BufferedInputStream(bytesIn, byteBufferSize); | |
final Reader charIn = new InputStreamReader(bufferedBytesIn, UTF8); | |
final Reader bufferedCharIn = charBufferSize == 0 ? charIn : new BufferedReader(charIn, charBufferSize); | |
try { | |
final long t1 = System.nanoTime(); | |
reader.readAll(bufferedCharIn); | |
assert bufferedCharIn.read() == -1; | |
final long t2 = System.nanoTime(); | |
return TimeUnit.NANOSECONDS.toMicros(t2 - t1); | |
} finally { | |
bufferedCharIn.close(); | |
} | |
} | |
private static long readFileNio(final FileMeta fileMeta, final boolean direct, final int byteBuffer, | |
final int charBuffer, final NioReader r) throws IOException { | |
final File fileToRead = fileMeta.getFileName(); | |
final FileChannel fc = FileChannel.open(fileToRead.toPath(), StandardOpenOption.READ); | |
try { | |
final ByteBuffer bb = direct ? ByteBuffer.allocateDirect(byteBuffer) : ByteBuffer.allocate(byteBuffer); | |
final CharBuffer cb = CharBuffer.allocate(charBuffer); | |
final CharsetDecoder decoder = UTF8.newDecoder(); | |
final long t1 = System.nanoTime(); | |
r.begin(); | |
bb.flip(); | |
while (fc.read((ByteBuffer) bb.compact()) != -1) { | |
bb.flip(); | |
CoderResult cr = CoderResult.OVERFLOW; | |
while (cr == CoderResult.OVERFLOW && bb.hasRemaining()) { | |
cb.clear(); | |
cr = decoder.decode(bb, cb, false); | |
cb.flip(); | |
// processing | |
r.readChunk(cb); | |
assert !cb.hasRemaining(); | |
} | |
if (cr.isError()) { | |
cr.throwException(); | |
} | |
} | |
bb.flip(); | |
cb.clear(); | |
decoder.decode(bb, cb, true); | |
cb.flip(); | |
r.finish(cb); | |
assert !cb.hasRemaining(); | |
final long t2 = System.nanoTime(); | |
return TimeUnit.NANOSECONDS.toMicros(t2 - t1); | |
} finally { | |
fc.close(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package file; | |
import java.io.BufferedInputStream; | |
import java.io.BufferedOutputStream; | |
import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStreamWriter; | |
import java.io.Reader; | |
import java.io.Writer; | |
import java.nio.ByteBuffer; | |
import java.nio.CharBuffer; | |
import java.nio.channels.FileChannel; | |
import java.nio.charset.Charset; | |
import java.nio.charset.CharsetDecoder; | |
import java.nio.charset.CharsetEncoder; | |
import java.nio.charset.CoderResult; | |
import java.nio.file.StandardOpenOption; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.Random; | |
import java.util.concurrent.TimeUnit; | |
public final class TestBufferingForCharIOWithCRC { | |
private static final char NL = '\n'; | |
private static final long FILE_CHAR_LEN = 100L * 1024 * 1024; | |
private static final long LINE_LEN = 80L; | |
private static final Charset UTF8 = Charset.forName("UTF-8"); | |
private static final CharsetEncoder UTF8_ENCODER = UTF8.newEncoder(); | |
private static final int[] BUFFER_SIZES = { 0, 1024, 2048, 8192 }; | |
private static final int[] NIO_BUFFER_SIZES = { 1024, 2048, 8192 }; | |
private static final int REPEATS = 1; | |
private static class CharSource { | |
private final Random rnd = new Random(0); | |
private final char min; | |
private final char max; | |
public CharSource(char min, char max) { | |
if (min > max) { | |
throw new IllegalArgumentException(); | |
} | |
this.min = min; | |
this.max = max; | |
} | |
public char nextChar() { | |
char ch; | |
do { | |
ch = (char) (min + rnd.nextInt(max - min + 1)); | |
} while (!UTF8_ENCODER.canEncode(ch)); | |
return ch; | |
} | |
} | |
private static final class CharCRC { | |
private long count; | |
private long crc; | |
public CharCRC reset() { | |
crc = count = 0; | |
return this; | |
} | |
public char add(final char c) { | |
crc = (crc << 3) ^ (crc >> 11) ^ c; | |
++count; | |
return c; | |
} | |
public <C extends CharSequence> C add(final C cs) { | |
for (int i = 0; i < cs.length(); ++i) { | |
add(cs.charAt(i)); | |
} | |
return cs; | |
} | |
public long getCount() { | |
return count; | |
} | |
public long getCrc() { | |
return crc; | |
} | |
public FileMeta createMeta() { | |
return createMeta(null); | |
} | |
public FileMeta createMeta(final File fileName) { | |
return new FileMeta(fileName, count, crc); | |
} | |
} | |
private static final class FileMeta { | |
private final File fileName; | |
private final long charCount; | |
private final long charCrc; | |
public FileMeta(File fileName, long charCount, long charCrc) { | |
this.fileName = fileName; | |
this.charCount = charCount; | |
this.charCrc = charCrc; | |
} | |
public File getFileName() { | |
return fileName; | |
} | |
public long getCharCount() { | |
return charCount; | |
} | |
public long getCharCrc() { | |
return charCrc; | |
} | |
@Override | |
public String toString() { | |
final StringBuilder sb = new StringBuilder(); | |
sb.append("FileMeta [fileName="); | |
sb.append(fileName); | |
sb.append(", charCount="); | |
sb.append(charCount); | |
sb.append(", charCrc="); | |
sb.append(charCrc); | |
sb.append("]"); | |
return sb.toString(); | |
} | |
} | |
private static FileMeta readBuffered(final Reader r, final int bufferSize) throws IOException { | |
final CharCRC crc = new CharCRC(); | |
final char[] buffer = new char[bufferSize]; | |
for (int i; (i = r.read(buffer)) != -1;) { | |
for (int j = 0; j < i; ++j) { | |
crc.add(buffer[j]); | |
} | |
} | |
return crc.createMeta(); | |
} | |
private enum Rdr { | |
SINGLE { | |
@Override | |
public FileMeta readAll(Reader r) throws IOException { | |
final CharCRC crc = new CharCRC(); | |
for (int i; (i = r.read()) != -1;) { | |
crc.add((char) i); | |
} | |
return crc.createMeta(); | |
} | |
}, | |
LINE { | |
@Override | |
public FileMeta readAll(Reader r) throws IOException { | |
final CharCRC crc = new CharCRC(); | |
@SuppressWarnings("resource") | |
final BufferedReader br = r instanceof BufferedReader ? (BufferedReader) r : new BufferedReader(r, 1024); | |
for (String s; (s = br.readLine()) != null;) { | |
crc.add(s); | |
crc.add(NL); | |
} | |
return crc.createMeta(); | |
} | |
}, | |
BUFFERED { | |
@Override | |
public FileMeta readAll(Reader r) throws IOException { | |
return readBuffered(r, 1024); | |
} | |
}, | |
BUFFERED64K { | |
@Override | |
public FileMeta readAll(Reader r) throws IOException { | |
return readBuffered(r, 65536); | |
} | |
}; | |
public abstract FileMeta readAll(Reader r) throws IOException; | |
} | |
private static abstract class NioReader { | |
protected final CharCRC crc = new CharCRC(); | |
public void begin() { | |
crc.reset(); | |
} | |
public abstract void readChunk(CharBuffer b); | |
public FileMeta finish(CharBuffer b) { | |
crc.add(b); | |
return new FileMeta(null, crc.getCount(), crc.getCrc()); | |
} | |
@Override | |
public String toString() { | |
return getClass().getSimpleName(); | |
} | |
} | |
private static class NioCharReader extends NioReader { | |
@Override | |
public void readChunk(CharBuffer b) { | |
while (b.hasRemaining()) { | |
crc.add(b.get()); | |
} | |
} | |
}; | |
private static class NioLineReader extends NioReader { | |
private final StringBuilder sb = new StringBuilder(); | |
@Override | |
public void begin() { | |
super.begin(); | |
sb.setLength(0); | |
} | |
@Override | |
public FileMeta finish(CharBuffer b) { | |
readChunk(b); | |
if (sb.length() > 0) { | |
line(); | |
} | |
return crc.createMeta(); | |
} | |
@Override | |
public void readChunk(CharBuffer b) { | |
while (b.hasRemaining()) { | |
final char ch = crc.add(b.get()); | |
if (ch == NL) { | |
line(); | |
} else { | |
sb.append(ch); | |
} | |
} | |
} | |
private String line() { | |
final String s = sb.toString(); | |
sb.setLength(0); | |
return s; | |
} | |
}; | |
public static void main(String[] args) throws IOException { | |
System.out.println("Start"); | |
final FileMeta[] filesToRead = { createTestFile("ascii", FILE_CHAR_LEN, new CharSource(' ', (char) 127)), | |
createTestFile("utf", FILE_CHAR_LEN, new CharSource(Character.MIN_VALUE, Character.MAX_VALUE)) }; | |
for (final FileMeta fileToRead : filesToRead) { | |
fileToRead.getFileName().deleteOnExit(); | |
} | |
for (final FileMeta fileMeta : filesToRead) { | |
final File fileToRead = fileMeta.getFileName(); | |
System.out.println("Reading " + fileToRead + " bytes: " + fileToRead.length() + " chars: " | |
+ fileMeta.getCharCount()); | |
for (final Rdr r : Rdr.values()) { | |
for (final int charBuffer : BUFFER_SIZES) { | |
for (final int byteBuffer : BUFFER_SIZES) { | |
long t = Long.MAX_VALUE; | |
for (int i = 0; i < REPEATS; ++i) { | |
t = Math.min(t, readFile(fileMeta, byteBuffer, charBuffer, r)); | |
} | |
System.out.printf("reader=%-14s char=%6d byte=%6d %15.3fus\n", r, charBuffer, byteBuffer, (double) t); | |
} | |
} | |
} | |
System.out.println(); | |
} | |
final List<NioReader> nioRdrs = Arrays.asList(new NioCharReader(), new NioLineReader()); | |
for (final FileMeta fileMeta : filesToRead) { | |
final File fileToRead = fileMeta.getFileName(); | |
System.out.println("Reading " + fileToRead + " bytes: " + fileToRead.length() + " chars: " | |
+ fileMeta.getCharCount()); | |
for (final NioReader r : nioRdrs) { | |
for (final int charBuffer : NIO_BUFFER_SIZES) { | |
for (final int byteBuffer : NIO_BUFFER_SIZES) { | |
for (final boolean direct : new boolean[] { false, true }) { | |
long t = Long.MAX_VALUE; | |
for (int i = 0; i < REPEATS; ++i) { | |
t = Math.min(t, readFileNio(fileMeta, direct, byteBuffer, charBuffer, r)); | |
} | |
System.out.printf("reader=%-14s char=%6d byte=%6d direct=%-6s %15.3fus\n", r, charBuffer, byteBuffer, | |
direct, (double) t); | |
} | |
} | |
} | |
} | |
System.out.println(); | |
} | |
System.out.println("Finish"); | |
} | |
private static FileMeta createTestFile(String label, final long roughCharCount, CharSource source) throws IOException { | |
final File f = File.createTempFile("tmp-char-" + label + "-", ".txt"); | |
final Writer fw = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(f), 4096), UTF8); | |
try { | |
final CharCRC crc = new CharCRC(); | |
while (crc.getCount() < roughCharCount) { | |
final char ch = source.nextChar(); | |
assert Character.isDefined(ch); | |
assert UTF8_ENCODER.canEncode(ch); | |
fw.append(crc.add(ch)); | |
if (crc.getCount() % LINE_LEN == 0) { | |
fw.append(crc.add(NL)); | |
} | |
} | |
fw.append(crc.add(NL)); | |
return crc.createMeta(f); | |
} finally { | |
fw.close(); | |
} | |
} | |
@SuppressWarnings("resource") | |
private static long readFile(final FileMeta fileMeta, final int byteBufferSize, final int charBufferSize, | |
final Rdr reader) throws IOException { | |
final File f = fileMeta.getFileName(); | |
final InputStream bytesIn = new FileInputStream(f); | |
final InputStream bufferedBytesIn = byteBufferSize == 0 ? bytesIn | |
: new BufferedInputStream(bytesIn, byteBufferSize); | |
final Reader charIn = new InputStreamReader(bufferedBytesIn, UTF8); | |
final Reader bufferedCharIn = charBufferSize == 0 ? charIn : new BufferedReader(charIn, charBufferSize); | |
try { | |
final long t1 = System.nanoTime(); | |
final FileMeta readMeta = reader.readAll(bufferedCharIn); | |
assert bufferedCharIn.read() == -1; | |
final long t2 = System.nanoTime(); | |
crcCheck(fileMeta, readMeta); | |
return TimeUnit.NANOSECONDS.toMicros(t2 - t1); | |
} finally { | |
bufferedCharIn.close(); | |
} | |
} | |
private static long readFileNio(final FileMeta fileMeta, final boolean direct, final int byteBuffer, | |
final int charBuffer, final NioReader r) throws IOException { | |
final File fileToRead = fileMeta.getFileName(); | |
final FileChannel fc = FileChannel.open(fileToRead.toPath(), StandardOpenOption.READ); | |
try { | |
final ByteBuffer bb = direct ? ByteBuffer.allocateDirect(byteBuffer) : ByteBuffer.allocate(byteBuffer); | |
final CharBuffer cb = CharBuffer.allocate(charBuffer); | |
final CharsetDecoder decoder = UTF8.newDecoder(); | |
final long t1 = System.nanoTime(); | |
r.begin(); | |
bb.flip(); | |
while (fc.read((ByteBuffer) bb.compact()) != -1) { | |
bb.flip(); | |
CoderResult cr = CoderResult.OVERFLOW; | |
while (cr == CoderResult.OVERFLOW && bb.hasRemaining()) { | |
cb.clear(); | |
cr = decoder.decode(bb, cb, false); | |
cb.flip(); | |
// processing | |
r.readChunk(cb); | |
assert !cb.hasRemaining(); | |
} | |
if (cr.isError()) { | |
cr.throwException(); | |
} | |
} | |
bb.flip(); | |
cb.clear(); | |
decoder.decode(bb, cb, true); | |
cb.flip(); | |
final FileMeta readMeta = r.finish(cb); | |
assert !cb.hasRemaining(); | |
final long t2 = System.nanoTime(); | |
crcCheck(fileMeta, readMeta); | |
return TimeUnit.NANOSECONDS.toMicros(t2 - t1); | |
} finally { | |
fc.close(); | |
} | |
} | |
private static void crcCheck(final FileMeta fileMeta, final FileMeta readMeta) { | |
if (readMeta.getCharCrc() != fileMeta.getCharCrc()) { | |
System.err.println("ERROR:\texpected: " + fileMeta + "\n\tgot : " + readMeta); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment