C# 写入文件比较

这篇具有很好参考价值的文章主要介绍了C# 写入文件比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据长度:128188个long

BinaryWriter每次写一个long 耗时14.7828ms
StreamWriter每次写一个long 耗时44.0934 ms
FileStream每次写一个long 耗时20.5142 ms

FileStream固定chunk写入,循环操作数组,耗时13.4126 ms

	byte[] chunk = new byte[datalist.Count * 8];
	for (int i = 0; i < datalist.Count; i++) {
	    long data = datalist[i];
	    var bs = BitConverter.GetBytes(data);
	    var startIndex = i * 8;
	    for (int j = 0; j < 8; j++) {
	        chunk[startIndex + j] = bs[j];
	    }
	}
	fs.Write(chunk, 0, chunk.Length);
	startTime.Stop();
	lg.i($"{((float)startTime.ElapsedTicks / Stopwatch.Frequency) * 1000} ms");
	fs.Flush();
	fs.Close();

FileStream固定chunk写入,直接操作数组,耗时10.2729 ms

	byte[] chunk = new byte[datalist.Count * 8];
	for (int i = 0; i < datalist.Count; i++) {
	    long data = datalist[i];
	    var bs = BitConverter.GetBytes(data);
	    var startIndex = i * 8;
	    chunk[startIndex] = bs[0];
	    chunk[startIndex + 1] = bs[1];
	    chunk[startIndex + 2] = bs[2];
	    chunk[startIndex + 3] = bs[3];
	    chunk[startIndex + 4] = bs[4];
	    chunk[startIndex + 5] = bs[5];
	    chunk[startIndex + 6] = bs[6];
	    chunk[startIndex + 7] = bs[7];
	}
	fs.Write(chunk, 0, chunk.Length);
	startTime.Stop();
	lg.i($"{((float)startTime.ElapsedTicks / Stopwatch.Frequency) * 1000} ms");
	fs.Flush();
	fs.Close();

经排查BitConverter.GetBytes源码如下,是上面比较耗时的地方,并且每次都会创建数组

public static unsafe byte[] GetBytes(long value) 
{
    byte[] bytes = new byte[8];
    fixed(byte* b = bytes)
        *((long*)b) = value;
    return bytes;
}

可以将上面改进一下,直接将代码内联进入上面代码上, 耗时2.8165 ms文章来源地址https://www.toymoban.com/news/detail-720259.html

public static unsafe byte[] GetBytes(List<long> values) {
    byte[] bytes = new byte[values.Count * sizeof(long)];
    fixed (byte* ptr = bytes) {
        long* longPtr = (long*)ptr;
        for (int i = 0; i < values.Count; i++) {
            *longPtr = values[i];
            longPtr++;
        }
    }
    return bytes;
}


var startTime = new Stopwatch();
startTime.Start();
var fs = new FileStream(saveDataPath, FileMode.Append);
byte[] chunk = GetBytes(datalist);
fs.Write(chunk, 0, chunk.Length);
startTime.Stop();
lg.i($"{((float)startTime.ElapsedTicks / Stopwatch.Frequency) * 1000} ms");
fs.Flush();
fs.Close();

到了这里,关于C# 写入文件比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server进阶教程读书笔记

    最近把SQL Server进阶教程重新读了一遍,顺便整理了一下书本中的知识点 CASE WHEN         ❑ 高手使用select做分支,新手用where和having做分支         ❑ 要写ELSE,要写END,避免未匹配上得到NULL         ❑ check到底怎么用?                  在SQL Server中,s

    2024年02月09日
    浏览(46)
  • C# 图解教程 第5版 —— 第16章 接口

    ​ 接口是声明一组函数成员而不进行实现的引用类型,只能用类和结构来实现接口。 使用 IComparable 接口的示例 ​ Array 类的 Sort 方法依赖于 IComparable 接口,其声明在 BCL 中,只包含唯一的 CompareTo 方法。图 16.1 中灰色表示该方法目前未实现。 图16.1 IComparable 接口 ​ 调用 Co

    2024年02月04日
    浏览(31)
  • c#关于文件夹/文件/文本读取遍历,写入还有表格的读取的一些方法

    c#遍历文件夹下的各种文件 将一些log写入到文本文件中: fs.Seek(offset, whence);移动文件读取的指针到指定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始

    2024年02月01日
    浏览(55)
  • C# 图解教程 第5版 —— 第7章 深入理解类

    表7.1 类成员的类型 ​ 类成员声明语句由下列部分组成,方括号表示该成分是可选的。 修饰符 必须放在核心声明之前。 多个修饰符可以任意顺序排列。 例如,下面两行代码在语义上是等价的: 特性 必须放在核心声明之前。 多个特性可以任意顺序排列。 图7.1 特性、修饰符

    2024年02月08日
    浏览(33)
  • C# 图解教程 第5版 —— 第24章 预处理指令

    ​ C# 中没有实际的预处理程序,“预处理”指令由编译器处理,但这个术语被保留了下来。 预处理指令必须和 C# 代码在不同的行。 预处理指令不需要以分号结尾。 包含预处理指令的每一行必须以“#”字符开始。 “#”字符前可以有空格。 在“#”字符和指令之间可以有空格

    2024年01月17日
    浏览(32)
  • node笔记_写文件(异步写入,同步写入,追加写入,流式写入)

    大家好,我是yma16,本期分享node写文件。

    2024年02月06日
    浏览(39)
  • C# 图解教程 第5版 —— 第22章 命名空间和程序集

    ​ 在许多项目中,会使用其他程序集的类或类型,而不仅仅是自己声明的。这些程序集(称为类库)可能来自 BCL 或第三方供应商,也可以是自己创建的。通常这些程序集文件的名称以 .dll 扩展名结尾,而不是 .exe。 图22.1 SuperLib 源代码和结果程序集 ​ 假设还要写一个名为

    2024年01月18日
    浏览(38)
  • 《深入理解Java虚拟机》读书笔记:Class类文件的结构

    Class类文件的结构   Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式——字节码(ByteCode),从而实现了程序的“一次编写,到处运行”。   Java虚拟机提供的语言无关性   “Clas

    2024年02月13日
    浏览(45)
  • C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍

    C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍 图像处理在计算机视觉和计算机图形学等领域发挥着至关重要的作用。本教程将介绍在C#中使用OpenCVSharp和EmguCV这两个流行的图像处理库,它们提供了丰富的功能和强大的性能。 一、OpenCVSharp介绍与特点 OpenCVSharp是OpenCV的

    2024年02月21日
    浏览(35)
  • 《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 6 Frequent Itemsets

    来源:《斯坦福数据挖掘教程·第三版》对应的公开英文书和PPT The market-basket model of data is used to describe a common form of many-many relationship between two kinds of objects. On the one hand, we have items , and on the other we have baskets, sometimes called “ transactions .” Each basket consists of a set of items (an items

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包