最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中三種零拷貝的實現(xiàn)示例以及對比詳解

 更新時間:2023年12月21日 10:49:01   作者:Colins~  
這篇文章主要介紹了Java中三種零拷貝的實現(xiàn)示例以及對比詳解,本文主要是介紹幾種零拷貝的實現(xiàn)示例,以及與最傳統(tǒng)的做一個對比,看看在效率上到底有多大的提升,需要的朋友可以參考下

簡介

本文主要是介紹幾種零拷貝的實現(xiàn)示例,以及與最傳統(tǒng)的做一個對比,看看在效率上到底有多大的提升

好了,廢話不多說直接干,本章例子是通過網(wǎng)絡(luò)IO傳輸一個8M大小的文件,對比傳輸效率,由于服務(wù)端接收端不需要修改,所以我們先上服務(wù)端代碼:

public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(8080);
    System.out.println("服務(wù)端:等待連接");
    Socket accept = serverSocket.accept();
    System.out.println("服務(wù)端:" + accept.getRemoteSocketAddress() + "已連接");
    File file = new File("C:\\Users\\Administrator\\Desktop\\ioTest.txt");
    if(!file.exists()){
        file.createNewFile();
    }
    FileOutputStream fileOutputStream = new FileOutputStream(file);
    InputStream bufferedInputStream = accept.getInputStream();
    byte[] bytes = new byte[2048];
    int read;
    while ((read = bufferedInputStream.read(bytes,0,2048)) != -1) {
        fileOutputStream.write(bytes);
    }
    OutputStream outputStream = accept.getOutputStream();
    outputStream.write("接收完畢".getBytes());
    accept.shutdownOutput();
    fileOutputStream.close();
    outputStream.close();
    bufferedInputStream.close();
    accept.close();
}

傳統(tǒng)實現(xiàn)

正常的socket傳輸,耗時:46ms

public static void normal() throws IOException {
        Socket socket = new Socket("127.0.0.1", 8080);
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        long start = System.currentTimeMillis();
        File file = new File("C:\\Users\\Administrator\\Desktop\\222.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bytes1 = new byte[2048];
        while (fileInputStream.read(bytes1, 0, 2048) != -1) {
            outputStream.write(bytes1);
        }
        socket.shutdownOutput();
        System.out.println("耗時:" + (System.currentTimeMillis() - start));
        byte[] bytes = new byte[1024];
        String message = "";
        int read;
        while ((read = inputStream.read(bytes)) != -1) {
            message += new String(bytes, 0, read);
        }
        System.out.println("服務(wù)端發(fā)來消息->" + message);
        inputStream.close();
        outputStream.close();
        socket.close();
    }

MMAP

MMAP原理就是建立了一個文件映射,劃分了一個虛擬空間,往這個空間寫數(shù)據(jù),少了一次拷貝

缺點:空間有限

實踐案例:RocketMq

耗時:32ms

public static void mmp() throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 8080));
        long start = System.currentTimeMillis();
        Path path = Paths.get("C:\\Users\\Administrator\\Desktop\\222.txt");
        FileChannel open = FileChannel.open(path, StandardOpenOption.READ);
        MappedByteBuffer map = open.map(FileChannel.MapMode.READ_ONLY, 0, open.size());
        socketChannel.write(map);
        socketChannel.shutdownOutput();
        System.out.println("耗時:" + (System.currentTimeMillis() - start));
        ByteBuffer allocate = ByteBuffer.allocate(1024);
        int read = socketChannel.read(allocate);
        if (read > 0) {
            allocate.flip();
            byte[] bytes = new byte[allocate.remaining()];
            allocate.get(bytes);
            System.out.println("服務(wù)端發(fā)來消息:" + new String(bytes));
        }
        socketChannel.close();
    }

transferTo

原理就是兩個通道之間直接傳輸數(shù)據(jù),根據(jù)系統(tǒng)支持程度,少了1-2次拷貝

缺點:局限于文件通道

實踐案例:Netty、Kafka

耗時:18ms

 public static void transferTo() throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 8080));
        long start = System.currentTimeMillis();
        Path path = Paths.get("C:\\Users\\Administrator\\Desktop\\222.txt");
        FileChannel open = FileChannel.open(path, StandardOpenOption.READ);
        long l = open.transferTo(0, open.size(), socketChannel);
        socketChannel.shutdownOutput();
        System.out.println("耗時:" + (System.currentTimeMillis() - start));
        ByteBuffer allocate = ByteBuffer.allocate(1024);
        int read = socketChannel.read(allocate);
        if (read > 0) {
            allocate.flip();
            byte[] bytes = new byte[allocate.remaining()];
            allocate.get(bytes);
            System.out.println("服務(wù)端發(fā)來消息:" + new String(bytes));
        }
        socketChannel.close();
    }

堆外內(nèi)存

原理直接使用堆外內(nèi)存,少了一次拷貝

缺點:堆外內(nèi)存開啟耗時,此內(nèi)存不受JVM控制,如垃圾回收等

實踐案例:Netty

耗時:26ms

public static void outSide() throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 8080));
        long start = System.currentTimeMillis();
        Path path = Paths.get("C:\\Users\\Administrator\\Desktop\\222.txt");
        FileChannel open = FileChannel.open(path, StandardOpenOption.READ);
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect((int) open.size());
        open.read(byteBuffer);
        byteBuffer.flip();
        socketChannel.write(byteBuffer);
        socketChannel.shutdownOutput();
        System.out.println("耗時:" + (System.currentTimeMillis() - start));
        ByteBuffer allocate = ByteBuffer.allocate(1024);
        int read = socketChannel.read(allocate);
        if (read > 0) {
            allocate.flip();
            byte[] bytes = new byte[allocate.remaining()];
            allocate.get(bytes);
            System.out.println("服務(wù)端發(fā)來消息:" + new String(bytes));
        }
        socketChannel.close();
    }

總結(jié)

耗時統(tǒng)計不完全準(zhǔn)確,都是多次取平均,具體使用哪種需要看場景來

到此這篇關(guān)于Java中三種零拷貝的實現(xiàn)示例以及對比詳解的文章就介紹到這了,更多相關(guān)Java零拷貝方式對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)機構(gòu)中關(guān)于并查集的詳解

    Java數(shù)據(jù)機構(gòu)中關(guān)于并查集的詳解

    并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問題,如果你還不了解并查集,請看接下來的文章,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09
  • Java中MessageFormat的使用詳解

    Java中MessageFormat的使用詳解

    本文主要介紹了Java中MessageFormat的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 基于java HashMap插入重復(fù)Key值問題

    基于java HashMap插入重復(fù)Key值問題

    這篇文章主要介紹了基于java HashMap插入重復(fù)Key值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join)的功能實現(xiàn)

    MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join)的功能實現(xiàn)

    mybatis-plus作為mybatis的增強工具,簡化了開發(fā)中的數(shù)據(jù)庫操作,這篇文章主要介紹了MyBatis-Plus聯(lián)表查詢(Mybatis-Plus-Join),需要的朋友可以參考下
    2022-08-08
  • Java日常練習(xí)題,每天進步一點點(14)

    Java日常練習(xí)題,每天進步一點點(14)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • java關(guān)于Date日期類型的大小比較

    java關(guān)于Date日期類型的大小比較

    這篇文章主要介紹了java關(guān)于Date日期類型的大小比較,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java自動化實現(xiàn)PowerPoint轉(zhuǎn)換為PDF

    Java自動化實現(xiàn)PowerPoint轉(zhuǎn)換為PDF

    在日常的企業(yè)運營和個人工作中,PowerPoint(PPT/PPTX)文件因其強大的演示功能而被廣泛使用,本文將詳細介紹如何利用 Spire.Presentation for Java 庫,通過簡潔高效的代碼實現(xiàn) PowerPoint 到 PDF 的轉(zhuǎn)換,需要的可以了解下
    2025-08-08
  • Java抽象類Abstract Class示例代碼詳解

    Java抽象類Abstract Class示例代碼詳解

    Java中的抽象類(Abstract Class)是面向?qū)ο缶幊讨械闹匾拍?它通過abstract關(guān)鍵字聲明,用于定義一組相關(guān)類的公共行為和屬性,下面詳細介紹Java抽象類Abstract Class,感興趣的朋友一起看看吧
    2025-09-09
  • 基于spring-security 401 403錯誤自定義處理方案

    基于spring-security 401 403錯誤自定義處理方案

    這篇文章主要介紹了基于spring-security 401 403錯誤自定義處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot整合vue實現(xiàn)上傳下載文件

    springboot整合vue實現(xiàn)上傳下載文件

    這篇文章主要為大家詳細介紹了springboot整合vue實現(xiàn)上傳下載文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

澳门| 广灵县| 叙永县| 辉县市| 阿巴嘎旗| 离岛区| 利川市| 伊川县| 广元市| 庆云县| 台州市| 诏安县| 宜州市| 沅江市| 乐安县| 商丘市| 台州市| 连州市| 阿巴嘎旗| 乡宁县| 宜君县| 西城区| 慈利县| 任丘市| 富民县| 佛学| 孟州市| 科技| 贡觉县| 沧州市| 湘乡市| 图片| 江山市| 简阳市| 家居| 突泉县| 诸暨市| 宝丰县| 寿光市| 玉门市| 张家口市|