[笔记]Go语言写文件几种方式性能对比

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

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

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

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

测试代码如下:

package mainimport ("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 timesfor 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("\n")file.Close()}case 1: // open file and write, defer close, repeat n timesfor 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("\n")}case 2: // open file and write n times, then close filefile, 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("\n")}}t1 := time.Now()d = t1.Sub(t0)fmt.Printf("time of way(%d)=%v\n", index, d)return d
}func main() {const k, n int = 3, 1000d := [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\n", i, float32(d[i])/float32(d[k-1]), k-1)}
}

 

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

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

 

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

  time of way(0)=170.003521ms1 1021 open file failed. open benchmarkFile.txt: too many open filestime of way(1)=32.388994mstime of way(2)=77.777936msway 0 cost time is    2.2 times of way 2way 1 cost time is    0.4 times of way 2

 

转载于:https://www.cnblogs.com/journeyonmyway/p/4320987.html

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

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

相关文章

【机器学习】sklearn数据集获取、分割、分类和回归

sklearn数据集1、数据集划分1.1 获取数据1.2 获取数据返回的类型举个栗子&#xff1a;1.3 对数据集进行分割举个栗子&#xff1a;2、 sklearn分类数据集3、 sklearn回归数据集1、数据集划分 机器学习一般的数据集会划分为两个部分&#xff1a; 训练数据&#xff1a;用于训练&a…

LeetCode 1846. 减小和重新排列数组后的最大元素

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 arr 。请你对 arr 执行一些操作&#xff08;也可以不进行任何操作&#xff09;&#xff0c;使得数组满足以下条件&#xff1a; arr 中 第一个 元素必须为 1 。任意相邻两个元素的差的绝对值 小于等于 1 &#xff0c;也就是…

ftp可以传输什么类型文件_FTP文件传输工具-ForkLift for Mac

orklift mac版是一款运行在Mac平台上的FTP文件传输工具。ForkLift拥有经典的两栏界面布局&#xff0c;简洁小巧。且支持FTP&#xff0c;SFTP&#xff0c;WebDAV&#xff0c;S3&#xff0c;iDisk&#xff0c;SMB&#xff0c;AFP和NIS协议&#xff0c;可以方便用户对本地以及远程…

1过程流程图 3 apqp_为什么过程开发的平面布置图要遵循精益原则?

今日话题为什么过程开发的平面布置图要遵循精益原则&#xff1f;问为什么过程开发的平面布置图要遵循精益原则&#xff1f;答工艺工程师根据过程流程图制定平面布置图&#xff0c;采用精益制造的原则&#xff0c;对加工与装配工位、物流路线、存储位置进行规划&#xff0c;以确…

把Scala代码当作脚本运行

1. 在类UNIX系统上作为脚本运行 在类Unix系统上&#xff0c;你可以设置一个shell前导词来执行脚本。如下例&#xff1a; Script.scala #!/usr/bin/env scala !# println("Hello" args(0)) 先输入chmod x Script.scala&#xff0c;确保对Script.scala文件有执行权限。…

LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)

文章目录1. 题目2. 解题1. 题目 一个酒店里有 n 个房间&#xff0c;这些房间用二维整数数组 rooms 表示&#xff0c;其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。 同时给你 k 个查询&…

用python写一个手机app签到脚本_利用Python实现App自动签到领取积分

要自动签到&#xff0c;最简单的是打开页面分析请求&#xff0c;然后我们用脚本实现请求的自动化。但是发现食行没有页面&#xff0c;只有 APP&#xff0c;这不是一个好消息&#xff0c;这意味着需要抓包处理了。有需要Python学习资料的小伙伴吗?小编整理【一套Python资料、源…

el表达式 循环_EL表达式和JSTL标签库(百战程序员047天)

1.EL表达式介绍&#xff1a;是一种非常简洁的表达式&#xff0c;语法简单&#xff0c;便于使用&#xff0c;灵感来源于ECMAScript和Xpath的表达式语言样式&#xff1a;${表达式}作用&#xff1a;简化jsp中获取作用域或者请求数据的写法。获取请求数据EL表达式1)获取请求数据(1)…

【机器学习】sklearn k-近邻算法

sklearn k-近邻算法1. sklearn k-近邻算法API2. k近邻算法实例-预测入住位置核心思想&#xff1a;你的“邻居”来推断出你的类别定义&#xff1a;如果一个样本在特征空间中的 k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。…

openresty package.path require 报错

在文件中 package.path /usr/local/share/lua/5.1/?.lua;/usr/local/openresty/lualib/resty/?.lua; package.cpath /usr/local/lib/lua/5.1/?.so;执行local mysql require "mysql" --正确local mysql require "resty.mysql" --报错去掉 package.pa…

LeetCode 1849. 将字符串拆分为递减的连续值(回溯)

文章目录1. 题目2. 解题1. 题目 给你一个仅由数字组成的字符串 s 。 请你判断能否将 s 拆分成两个或者多个 非空子 字符串 &#xff0c;使子字符串的 数值 按 降序 排列&#xff0c;且每两个 相邻子字符串 的数值之 差 等于 1 。 例如&#xff0c;字符串 s "0090089&q…

axure选中后横线切换_Axure8.0|动态面板内容简单切换技巧

无论做web段还是移动端&#xff0c;常常会用到动态面板固定在某个区域来变换内容&#xff0c;达到节省空间的作用&#xff0c;今天分享的就是如何实现这种方式。预览效果&#xff1a;一、元件准备以IT/互联网、设计创作、职场金融这三组为例&#xff0c;所涉及到的元件分别为it…

flutter text 最大长度_Flutter小技巧之TextField换行自适应

无论哪种界面框架输入文本框都是非常重要的控件, 但是发现flutter中的输入框TextField介绍的虽然多,但是各个属性怎么组合满足需要很多文章却说不清楚, 再加上控件版本变更频繁很多功能的介绍都是比较陈旧的属性.现在就需要一个类似微信的输入文本框, 这样一个非常实用的效果fl…

【机器学习】分类算法sklearn-朴素贝叶斯算法

分类算法-朴素贝叶斯算法1. 概率基础2. 朴素贝叶斯介绍3. sklearn朴素贝叶斯实现API4. 朴素贝叶斯算法案例1. 概率基础 概率定义为一件事情发生的可能性&#xff1a;扔出一个硬币&#xff0c;结果头像朝上&#xff1b;某天是晴天 联合概率和条件概率“”&#xff1a; 联合概率…

收集的电影网站

迅播影院-Gvod Player-Gvod电影-迅雷电影下载动漫下载|BT|漫画|动画|游戏 - 极影动漫一路电影网&#xff0d;高清电影下载_1080p电影下载_蓝光电影下载_3d电影下载天天美剧人人影视电影天堂电影FMTorrentProject - Torrent Search EngineBT Kitty - Professional torrent searc…

LeetCode 1851. 包含每个查询的最小区间(排序 + 离线查询 + 优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 intervals &#xff0c;其中 intervals[i] [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti&#xff08;包含两侧取值&#xff0c;闭区间&#xff09;。 区间的 长度 定义为区间中包含的整数数目&#xff…

canvas 判断哪个元素被点击_监听 Canvas 内部元素点击事件的三种方法

canvas内部元素不能像DOM元素一样方便的添加交互事件监听&#xff0c;因为canvas内不存在“元素”这个概念&#xff0c;他们仅仅是canvas绘制出来的图形。这对于交互开发来说是一个必经障碍&#xff0c;想要监听图形的点击事件思路很简单&#xff0c;只要监听canvas元素本身的点…

git 查看某些文档的历史版本_Git 教程(二)log 命令的使用

使用 Git 进行版本控制时&#xff0c;要习惯他的工作流程&#xff0c;Git 的工作流程是&#xff0c;先在工作区创建项目并编写代码&#xff0c;然后将写好的文件添加到暂存区&#xff0c;最后将暂存区里的文件提交到历史版本库。如下图所示&#xff1a;每向版本历史库做一次提交…

【机器学习】sclearn分类算法-决策树、随机森林

分类算法-决策树、随机森林1.决策树1.1 认识决策树1.2 信息论基础-银行贷款分析1.3 决策树的生成1.4 决策树的划分依据之一-信息增益1.5 sklearn决策树API1.6 泰坦尼克号乘客生存分类2. 集成学习方法-随机森林1.决策树 1.1 认识决策树 决策树思想的来源非常朴素&#xff0c;程…

在Java中正确使用注释

Java提供了3种类型的注释&#xff1a; 单行注释&#xff08;C风格&#xff09; 在Java中最简单的注释是单行注释。它以两个正斜杠开始并到行尾结束。例如&#xff1a; // this is a single-line commentx 1; // a single-line comment after code 多行注释&#xff08;C风格&a…