zoukankan      html  css  js  c++  java
  • GoLang几种读文件方式的比较

      GoLang提供了很多读文件的方式,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil 库。

    那他们的效率如何呢?用一个简单的程序来评测一下:

    复制代码
    package main
    
    import(
        "fmt"
        "os"
        "flag"
        "io"
        "io/ioutil"
        "bufio"
        "time"
    )
    
    func read1(path string)string{
        fi,err := os.Open(path)
        if err != nil{
            panic(err)
        }
        defer fi.Close()
    
        chunks := make([]byte,1024,1024)
        buf := make([]byte,1024)
        for{
            n,err := fi.Read(buf)
            if err != nil && err != io.EOF{panic(err)}
            if 0 ==n {break}
            chunks=append(chunks,buf[:n]...)
            // fmt.Println(string(buf[:n]))
        }
        return string(chunks)
    }
    
    func read2(path string)string{
        fi,err := os.Open(path)
        if err != nil{panic(err)}
        defer fi.Close()
        r := bufio.NewReader(fi)
        
        chunks := make([]byte,1024,1024)
         
        buf := make([]byte,1024)
        for{
            n,err := r.Read(buf)
            if err != nil && err != io.EOF{panic(err)}
            if 0 ==n {break}
            chunks=append(chunks,buf[:n]...)
            // fmt.Println(string(buf[:n]))
        }
        return string(chunks)
    }
    
    func read3(path string)string{
        fi,err := os.Open(path)
        if err != nil{panic(err)}
        defer fi.Close()
        fd,err := ioutil.ReadAll(fi)
        // fmt.Println(string(fd))
        return string(fd)
    }
    
    func main(){
       
        flag.Parse()
        file := flag.Arg(0)
        f,err := ioutil.ReadFile(file)
        if err != nil{
            fmt.Printf("%s
    ",err)
            panic(err)
        }
        fmt.Println(string(f))
        start := time.Now()
        read1(file)
        t1 := time.Now()
        fmt.Printf("Cost time %v
    ",t1.Sub(start))
        read2(file)
        t2 := time.Now()
        fmt.Printf("Cost time %v
    ",t2.Sub(t1))
        read3(file)
        t3 := time.Now()
        fmt.Printf("Cost time %v
    ",t3.Sub(t2))
    
    }
    复制代码

       运行命令go run read.go filename, 制定需要读取的文件就可以了。这里我比较了读取13.7MB的日志文件,三种方式分别消耗的时间是:

    1. Cost time 105.006ms  
    2. Cost time 68.0039ms  
    3. Cost time 31.0018ms  

       

       读取29.3MB的媒体文件:

    1. Cost time 390.0223ms  
    2. Cost time 194.0111ms  
    3. Cost time 83.0048ms  

        读取302MB的媒体文件

    1. Cost time 40.8043338s  
    2. Cost time 1m5.0407201s  
    3. Cost time 8.8155043s  

      

       这个差距就很明显了,ioutil提供的方法效率就是高。有空可以再从代码层面再去分析一下。

  • 相关阅读:
    vim编辑器下nginx.conf语法高亮
    Spring Boot 警告:An illegal reflective access operation has occurred
    Idea使用 MyBatis Generator 插件快速生成代码
    SpringBoot 自定义线程池处理异步任务
    idea 处理mybatis的mapper.xml警告提示信息让其不显示
    mybatis 报文档根元素 "mapper" 必须匹配 DOCTYPE 根 "null"
    zookeeper生成分布式自增ID
    Navicat卸载注册表 激活码
    mybatis自定义TypeHandler实现list转string
    Java创建ES索引实现
  • 原文地址:https://www.cnblogs.com/yulei126/p/6790322.html
Copyright © 2011-2022 走看看