I/O Performance

          Although the performance of "old" stream I/O has been improved by implementing it with nio,
          mapped file access tends to be dramatically faster, this program does a  simple performance comparison:
          package think.in.java.io;

          import java.io.BufferedInputStream;
          import java.io.BufferedOutputStream;
          import java.io.DataInputStream;
          import java.io.DataOutputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.RandomAccessFile;
          import java.nio.IntBuffer;
          import java.nio.channels.FileChannel;

          public class MappedIO {
              
          private static int numOfInts = 4000000;
              
          private static int numOfUbuffInts = 200000;
              
              
          private abstract static class Tester{
                  
          private String name;
                  
          public Tester(String name){
                      
          this.name = name;
                  }
                  
                  
          public void runTest(){
                      System.out.print(name 
          + "");
                      
          try {
                          
          long start = System.nanoTime();
                          test();
                          
          double duration = System.nanoTime() - start;
                          System.out.format(
          "%.2f\n", duration/1.0e9);
                      } 
          catch (IOException e) {
                          
          throw new RuntimeException(e);
                      }
                  }
                  
                  
          public abstract void test() throws IOException;
              }
              
              
          private static Tester[] tests = {
                  
          new Tester("Stream Write") {
                      @Override
                      
          public void test() throws IOException {
                          DataOutputStream dos 
          = new DataOutputStream(
                                  
          new BufferedOutputStream(
                                          
          new FileOutputStream(new File("temp.tmp"))));
                          
          for(int i=0; i<numOfInts; i++){
                              dos.writeInt(i);
                          }
                          dos.close();
                      }
                  },
                  
          new Tester("Mapped Write") {
                      @Override
                      
          public void test() throws IOException {
                          FileChannel fc 
          = new RandomAccessFile("temp.tmp""rw").getChannel();
                          IntBuffer ib 
          = fc.map(
                                  FileChannel.MapMode.READ_WRITE, 
          0, fc.size()).asIntBuffer();
                          
          for(int i=0; i<numOfInts; i++){
                              ib.put(i);
                          }
                          fc.close();
                      }
                  },
                  
          new Tester("Stream Read"){
                      @Override
                      
          public void test() throws IOException {
                          DataInputStream dis 
          = new DataInputStream(
                                  
          new BufferedInputStream(
                                  
          new FileInputStream(new File("temp.tmp"))));
                          
          for(int i=0; i<numOfInts; i++){
                              dis.readInt();
                          }
                          dis.close();
                      }
                  },
                  
          new Tester("Mapped Read") {
                      @Override
                      
          public void test() throws IOException {
                          FileChannel fc 
          = new FileInputStream(new File("temp.tmp")).getChannel();
                          IntBuffer ib 
          = fc.map(
                                  FileChannel.MapMode.READ_ONLY, 
          0, fc.size()).asIntBuffer();
                          
          while(ib.hasRemaining()){
                              ib.get();
                          }
                          fc.close();
                      }
                  }
              };

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  
          for(Tester test : tests){
                      test.runTest();
                  }
              }

          }

          // Output:
          Stream Write: 0.73
          Mapped Write: 
          0.06
          Stream Read: 
          0.70
          Mapped Read: 
          0.06

          posted on 2012-11-07 16:00 鹽城小土包 閱讀(157) 評論(0)  編輯  收藏 所屬分類: J2EE

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案(14)

          文章分類(18)

          文章檔案(18)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 晋城| 原阳县| 阳原县| 江门市| 新泰市| 阿巴嘎旗| 汝城县| 天祝| 浠水县| 凤山市| 齐齐哈尔市| 昌乐县| 安乡县| 安陆市| 三台县| 汕尾市| 商河县| 常山县| 湛江市| 吉安市| 大连市| 吴忠市| 巴楚县| 美姑县| 溆浦县| 大同县| 瑞丽市| 石台县| 泸西县| 宜章县| 泾源县| 邹城市| 承德市| 临安市| 图木舒克市| 黔西县| 鄂尔多斯市| 武鸣县| 巴塘县| 安康市| 屏边|