哇塞,这几种Java文件读写性能差距居然这么大?

news2024/11/20 16:36:02
引言

这是一篇性能比较的文章,不分析实现原理。主要是对比Java几种常见的文件写入方式

测试代码

主要分析Stream、Stream+Buffer和mmap三种方式,对应的大致代码如下

    public static void testBasicFileIO(List<Persona> list, String path) throws Exception {
        File file = new File(path);
        if (file.exists()){
            file.delete();
        }
        FileOutputStream out = new FileOutputStream(file);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            out.write(list.get(i).toString().getBytes());
        }
        long costTime = System.currentTimeMillis()-startTime;
        System.out.println("testBasicFileIO cost:"+costTime);
    }
    
    public static void testBufferedFileIO(List<Persona> list, String path) throws Exception {
        File file = new File(path);
        if (file.exists()){
            file.delete();
        }
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));


        long startTime = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            out.write(list.get(i).toString().getBytes());
        }
        long costTime = System.currentTimeMillis()-startTime;
        System.out.println("testBufferedFileIO cost:"+costTime);
    }
    
    public static void testMmapWrite(List<Persona> list, String path) throws Exception {
        File file = new File(path);
        if (file.exists()){
            file.delete();
        }
        RandomAccessFile raf = new RandomAccessFile(path, "rw");
        FileChannel rafchannel = raf.getChannel();
        //mmap 使得jvm堆和pageCache有一块映射空间
        MappedByteBuffer map = rafchannel.map(FileChannel.MapMode.READ_WRITE, 0, 4096 * 1024 * 250);  // 1000M的pageCache大小

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < list.size(); i++) {
            map.put(list.get(i).toString().getBytes());
        }
        long costTime = System.currentTimeMillis()-startTime;
        System.out.println("mmap cost:"+costTime);
    }
效果比较

写1M数据效果如下
在这里插入图片描述

写10M数据效果如下
在这里插入图片描述

写100M效果如下
在这里插入图片描述

总结

通过比较能看到在高频写数据到磁盘时,mmap的性能非常显著,有类似的场景时可以优先考虑mmap。当然最好是自己做下基准测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flume搭建

压缩包版本&#xff1a;apache-flume-1.9.0-bin.tar 百度盘链接&#xff1a;https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码&#xff1a;ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…

Chatglm3+langchain智能对话,本地文本库构建问答,图片文本库构建与问答搜索

Chatglm3langchain 主要功能&#xff1a; 调用语言模型将不同数据源接入到语言模型的交互中允许语言模型与运行环境交互 Langchain应用场景 **1. 文档问答&#xff1a;**常见的Langchain用例。在特定文档上回答问题&#xff0c;仅利用这些文档中的信息来构建问答答案&#…

KNIME 节点之战(Game of Nodes)锦标赛

“Hark! I summon thee to a contest of nodes. Art thou endowed with the courage for the encounter?” “听着&#xff01;我在此邀请你加入一场节点之战。你有勇气面对吗&#xff1f;” 官方链接 活动概要与参赛守则 诚邀您加入 KNIME 节点之战 —— 首届全球工作流挑战大…

无心剑小诗《致敬任正非》

致敬任正非 您是时代的勇者 科技海洋中砥砺前行 目光如炬&#xff0c;坚定而深邃 照亮了华为的路 引领着创新的方向 您是一颗璀璨的星 商业星空中熠熠生辉 您智慧如奔涌之泉 激荡无穷的力量 驱动着华为的发展 创造了无数奇迹 您是一位无畏的勇士 面对困难挑战&#xff0c;永…

MySQL的ACID、死锁、MVCC问题

1 ACID ACID代表原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性&#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;。一个确保数据安全的事务处理系统&#xff0c;必须满足这些密切相关的标准。 原…

02 - python入门篇

1. python入门 1.1 认识标识符 标识符是由字母、数字和下划线组成标识符的首字符必须是字母或下划线标识符区分大小写 1.2 认识保留字 简单来说就是python把一些字符串在系统中用过了&#xff0c;你后面定义就不能使用人家已经使用过的了。 保留字有哪些 import keyword …

记录一次k8s集群镜像恢复到harbor的过程

之前由于harbor的存储空间不够了&#xff0c;同事干掉了好多镜像&#xff0c;结果把现网生产的镜像也搞掉了。进行了找回操作&#xff0c;这里做下记录。 环境是k8s集群&#xff0c;容器引擎用的containerd。 最初发现这个问题是在增加节点的时候&#xff0c;发现有的节点主机…

蓝桥杯备战——11.NE555测频

1.分析原理图 我们可以看到&#xff0c;上图就是一个NE555构建的方波发生电路&#xff0c;输出方波频率1.44/2(R8Rb3)C,如果有不懂NE555内部结构&#xff0c;工作原理的&#xff0c;可以到B站学习。实在不懂仿真也行&#xff0c;比如我下面就是仿真结果&#xff1a; 然后就是下…

洛谷 P1803 凌乱的yyy / 线段覆盖

本聪明帅气文武双全的史上无敌代码猿来发题解了. 题目背景 快 noip 了&#xff0c;yyy 很紧张&#xff01; 题目描述 现在各大 oj 上有 n 个比赛&#xff0c;每个比赛的开始、结束的时间点是知道的。 yyy 认为&#xff0c;参加越多的比赛&#xff0c;noip 就能考的越好&…

企业架构TOGAF?

企业架构 企业架构&#xff08;Enterprise architecture&#xff09;是指整个公司或企业中软件和其他技术的整体视图和方法。 通常&#xff0c;企业架构不仅仅是组织各种内部基础设施的结构。相反&#xff0c;我们的目标是通过以正确的方式分析、设计、规划和实施正确的技术&…

数据结构—动态查找

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

Java基础 反射详解

目录 简介 反射的基本使用 获取 Class 对象的四种方式 基本使用示例 常用方法 生产中的常用方式 获取注解 SpringIoc容器的制作 反射 抽象工厂模式 双亲委派 反射缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍…

认识文件和目录

单用户&多用户操作系统(科普) 单用户操作系统:指一台计算机在同一时间 只能由一个用户 使用,一个用户独自享用系统的全部硬件和软件资源Windows XP 之前的版本都是单用户操作系统 多用户操作系统:指一台计算机在同一时间可以由 多个用户 使用,多个用户共同享用系统的全…

syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘

问题 使用 go-zero时&#xff0c;执行api命令报错user.api 55:9 syntax error: expected : | IDENT | INT, got (。报错信息提醒文件55行有错&#xff0c;但是源文件55行没有问题。 解决 这里我的goctl版本是1.6.1 执行如下命令&#xff0c;将版本改为1.6.0&#xff0c;即可解…

Maven的安装以及配置(超级详细版)

前言 至于什么是Maven&#xff0c;大家可以理解为之前的Vue一样&#xff0c;也是通过操控对象映射来使用的 他内部还有很多的插件用于实现对应的功能&#xff0c;例如打包插件&#xff0c;或是测试 maven下载 Maven – Download Apache Maven apache下的开源项目&#xff0…

基于C/C++的MFC的IDC_MFCEDITBROWSE2控件不显示ico问题记录

打开资源文件 *.rc文件 &#xff0c;在最上方添加 #if !defined(_AFXDLL) #include "afxribbon.rc" // MFC ribbon and control bar resources #endif 如下图所示&#xff1a;

SpringBoot security 安全认证(二)——登录拦截器

本节内容&#xff1a;实现登录拦截器&#xff0c;除了登录接口之外所有接口访问都要携带Token&#xff0c;并且对Token合法性进行验证&#xff0c;实现登录状态的保持。 核心内容&#xff1a; 1、要实现登录拦截器&#xff0c;从Request请求中获取token&#xff0c;从缓存中获…

liunx服务器下vim无法:wq解决方案

当你vim某一个文件是&#xff0c;由于其他人在操作&#xff0c;或者上次操作中断&#xff0c;造成的 解决方案&#xff0c;不要&#xff0c;vim -r /etc/****&#xff0c;不然你会得到 正确方案 然后在&#xff0c;直接sudo vim /ect/xxx&#xff0c;还出现第一幅图就直接选…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件&#xff0c;该组件能够满足日常的下拉选择框的需求&#xff0c;但当需要用户在ComboBox中通过输入关键字进行自动匹配时&#xff0c;原生的组件虽然提供了editable属性用于输入关键字&#xff0c;但是匹配内容不弹出下拉框&#xff0c;无法…