是不是我的代码有问题?
        long blockSize = (long) 2 << 10;
        long totalSize = 4L << 30;
        long totalCount = totalSize / blockSize;
        SeekableByteChannel outputStream = Files.newByteChannel(Paths.get("D:\\test"), StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
        ByteBuffer data = ByteBuffer.allocate((int) blockSize);
        Random random = new Random(System.currentTimeMillis());
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < totalCount; i++) {
            outputStream.position(Math.abs(random.nextInt()));
            outputStream.write(data);
        }
        outputStream.close();
        long stopTime = System.currentTimeMillis();
        System.out.println(totalSize * 1000.0 / (stopTime - startTime) / (1 << 20));

解决方案 »

  1.   

    楼主是要比较什么?即便是机械硬盘,其读写速度达到100M/S也是正常的吧,楼主应该在SSD上跑一次,就看出效果了,单说机械硬盘慢是没有意义的。没有对比就没有伤害。
      

  2.   

    https://www.baidu.com/s?wd=%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%984k%E8%AF%BB%E5%86%99%E9%80%9F%E5%BA%A6&rsf=64050023&rsp=0&f=1&oq=%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%984k%E9%9A%8F%E6%9C%BA%E8%AF%BB%E5%86%99%E9%80%9F%E5%BA%A6&tn=58025142_5_oem_dg&ie=utf-8&rsv_pq=87edea5200045a89&rsv_t=76b9qYlkpTjcxs4qJuTI1DF3TIvYK2bGOYh8CT2l3ut1qbEwCv4e7zDgeVDFXI1oYjso8DsIEKY&rqlang=cn&rs_src=0http://tieba.baidu.com/p/4869119339http://tieba.baidu.com/p/2883354675人家固态硬盘4k随机读写也才20多M/s
      

  3.   

    现在普通的SATA 串口硬盘起码都是150m/s的速度,SATA 3.0 峰值可以达到 600M/s ,但是因为其他硬件或pc状态限制无法达到。如果你的固态硬盘用的也是SATA 3.0 接口的话,理论上可以到达6g/s 但是实际上也就 最多700m/s,用m.2接口的话会快很多。
      

  4.   

    为什么他们的测评里面固态4k随机读写是20多M/s,我的程序对机械硬盘却可以达到100多M/s,我的代码不是4k随机写吗?还是说他们测评的随机读写的定义不一样?
      

  5.   

    那为什么网上的测评里面那些固态硬盘的4k随机读写才20多M/s,比机械硬盘还慢?那些测试软件的随机读写和上面代码的随机读写是两个定义?
      

  6.   


    “发现上!”???
    你把StandardOpenOption.DELETE_ON_CLOSE注释掉,把文件写到硬盘上,可以看出文件的大小不是4G
      

  7.   


    “发现上!”???
    你把StandardOpenOption.DELETE_ON_CLOSE注释掉,把文件写到硬盘上,可以看出文件的大小不是4G是位置随机的写,会覆盖之前写过的内容,所以文件大小不可能是4G。要测试的不是顺序写,是随机写。
      

  8.   


    “发现上!”???
    你把StandardOpenOption.DELETE_ON_CLOSE注释掉,把文件写到硬盘上,可以看出文件的大小不是4G是位置随机的写,会覆盖之前写过的内容,所以文件大小不可能是4G。要测试的不是顺序写,是随机写。
    人家4k随机读写是对整个硬盘而言,你这个随机读写只是一个文件,差别大了,测出的数据比硬盘测速软件高很正常,除非你这个文件写满这个硬盘。