zoukankan      html  css  js  c++  java
  • [笔记]Go语言写文件几种方式性能对比

    Go语言中写文件有多种方式,这里进行如下几种方式的速度对比:

    1. 打开文件,写入内容,关闭文件。如此重复多次
    2. 打开文件,写入内容,defer 关闭文件。如此重复多次
    3. 打开文件,重复多次写入内容,defer 关闭文件

    在VMWare下的Ubuntu 14.04下运行的结果表明:

    • 方式1速度最慢,但是慢的很稳定
    • 方式2比方式1略快,但是重复次数多了后会报错,应该是defer被压栈太多导致系统撑不了太多打开的文件
    • 方式3速度约是前两者的2倍,因为减少了很多打开关闭文件的操作

    测试代码如下:

    package main
    
    import (
        "fmt"
        "os"
        "time"
    )
    
    func benchmarkFileWrite(filename string, n int, index int) (d time.Duration) {
        v := "ni shuo wo shi bu shi tai wu liao le a?"
    
        os.Remove(filename)
    
        t0 := time.Now()
        switch index {
    
        case 0: // open file and write, then close, repeat n times
            for i := 0; i < n; i++ {
                file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
                if err != nil {
                    fmt.Println(index, i, "open file failed.", err.Error())
                    break
                }
    
                file.WriteString(v)
                file.WriteString("
    ")
                file.Close()
            }
        case 1: // open file and write, defer close, repeat n times
            for i := 0; i < n; i++ {
                file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
                if err != nil {
                    fmt.Println(index, i, "open file failed.", err.Error())
                    break
                }
                defer file.Close()
    
                file.WriteString(v)
                file.WriteString("
    ")
            }
        case 2: // open file and write n times, then close file
            file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
            if err != nil {
                fmt.Println(index, "open file failed.", err.Error())
                break
            }
            defer file.Close()
    
            for i := 0; i < n; i++ {
                file.WriteString(v)
                file.WriteString("
    ")
            }
        }
    
        t1 := time.Now()
        d = t1.Sub(t0)
        fmt.Printf("time of way(%d)=%v
    ", index, d)
        return d
    }
    
    func main() {
        const k, n int = 3, 1000
        d := [k]time.Duration{}
        for i := 0; i < k; i++ {
            d[i] = benchmarkFileWrite("benchmarkFile.txt", n, i)
        }
    
        for i := 0; i < k-1; i++ {
            fmt.Printf("way %d cost time is %6.1f times of way %d
    ", i, float32(d[i])/float32(d[k-1]), k-1)
        }
    }

    当n=1000时,测试结果如下

      time of way(0)=38.719386ms
      time of way(1)=31.428677ms
      time of way(2)=17.930829ms
      way 0 cost time is    2.2 times of way 2
      way 1 cost time is    1.8 times of way 2

    当n=5000时,测试结果如下(因为方式1报错,所以它的时间是错的)

      time of way(0)=170.003521ms
      1 1021 open file failed. open benchmarkFile.txt: too many open files
      time of way(1)=32.388994ms
      time of way(2)=77.777936ms
      way 0 cost time is    2.2 times of way 2
      way 1 cost time is    0.4 times of way 2
  • 相关阅读:
    单例
    Label自适应高度
    通知中心(以夜间模式为例)
    ios VFL屏幕自适应
    网络请求数据(同步POST,异步POST)
    linux 设备文件
    linux 文件存取 软硬联接的区别
    linux 磁盘管理与文件系统
    linux开机过程
    Build Antlr4 projects with eclipse java project template.
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/4320987.html
Copyright © 2011-2022 走看看