亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 和 Java 之間的 IO 性能

Go 和 Java 之間的 IO 性能

Go
慕少森 2023-05-22 16:07:44
我在我的 Mac(Majave 版本)4Cpus/i5 和 16G 內存上進行了 go(1.11) 和 java(1.8) 之間的簡單性能測試,我發現,讀取一個小文件,golang 比 java 快 6~7 倍。下面是我的測試代碼,我想確認一下是我的測試代碼錯了還是漏了什么?爪哇與并發.ExecutorServiceimport java.io.*;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;class TaskWithResult implements Callable<String> {        private static String readToString() {        String fileName = "/Users/pis/IdeaProjects/Test/src/data/test.txt";        File file = new File(fileName);        Long filelength = file.length();        byte[] filecontent = new byte[filelength.intValue()];        try {            FileInputStream in = new FileInputStream(file);            in.read(filecontent);            in.close();        } catch (IOException e) {            e.printStackTrace();        }        SimpleDateFormat myFmt=new SimpleDateFormat("yyyy-MM-dd HH: mm: ss: SSS: ");        Date d1 = new Date();        return myFmt.format(d1);    }    /**     * 任務的具體過程,一旦任務傳給ExecutorService的submit方法,     * 則該方法自動在一個線程上執行     */    public String call() throws Exception {        String result = readToString();        System.out.println(result);        //該返回結果將被Future的get方法得到        return result;    }}public class readFile{    public static void main(String args[]){        ExecutorService es = Executors.newFixedThreadPool(5);        List<Future<String>> resultList = new ArrayList<Future<String>>();        SimpleDateFormat myFmt=new SimpleDateFormat("yyyy-MM-dd HH: mm: ss: SSS");        Date d1 = new Date();        System.out.println("Start Time:"+myFmt.format(d1));        for (int i = 0; i < 1000; i++){            //使用ExecutorService執行Callable類型的任務,并將結果保存在future變量中            Future<String> future = es.submit(new TaskWithResult());            //將任務執行結果存儲到List中            resultList.add(future);        }    }
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

我看到了幾個問題,無論是從概念的角度還是技術的角度。


您使用一個通道來返回您的結果集(不錯,有點),但是您只是簡單地丟棄了結果。此外,您使用的是無緩沖通道,因此您在那里有一個瓶頸。請注意,這本身并不是問題,因為管道是構建程序的一種好方法——恕我直言,您只是在這里以錯誤的方式使用了它。符合的東西


package main


import (

    "fmt"

    "sync"

    "time"

)


func main() {

    le := 1000


    // We want to wait until the operations finish

    var wg sync.WaitGroup


    // We "prealloc" err, since we do not want le * allocations

    var err error



    start := time.Now()

    for i := 0; i < le; i++ {


        // Add an operation to wait for to the group

        wg.Add(1)

        go func() {

            // Ensure the WaitGroup is notified we are done (bar a panic)

            defer wg.Done()


            // Short notation, since we are not interested in the result set

            if _,err = ioutil.ReadFile(fileName);err!=nil{

             fmt.Println("read file error")

            }


        }()


    }


    // Wait until all operations are finished.

    wg.Wait()

    fmt.Printf("%d iterations took %s", le, time.Since(start))

}

將是我的解決方案。如果我有想法做這樣的事情。


但是如果我們深入研究代碼,基本上這里唯一可用的組件是ioutil.ReadFile. 將其用于值得進行基準測試的程序部分首先是一個非常糟糕的想法?。它應該用于相當小的文件(例如配置文件)——它本身并不是您要進行基準測試的程序的一部分。


您要做的基準測試是您剛剛讀取的文件的處理邏輯。讓我給你舉個例子:假設你想讀入一堆小的 JSON 文件,解組它們,修改它們,再次編組它們并將它們發送到 REST API。那么,在這種情況下,您想對程序的哪一部分進行基準測試?我敢打賭處理文件的邏輯。因為那是您可以實際優化的程序部分。您既不能優化ioutil.ReadFile也不能優化服務器。除非你碰巧也寫了這個。在這種情況下,您可能希望從服務器包中對服務器邏輯進行基準測試。


最后但同樣重要的是,您的問題標題為“Go 和 Java 之間的 IO 性能”。要實際測量 IO 性能,您需要非常大的 IO 操作。我傾向于為此使用 ISO 圖像 - 我傾向于使用真實世界的數據。


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號