C# ,大量拼接字符串,类型转化能进行优化吗?怎么优化

舌尖上的中国001 2020-04-22 08:48:25
大概这样一个程序:1、50个其他的类型(bool,float,ulong等等)转化成字符串
2、各个类型转化成字符串后加逗号分隔。直接存储CSV文件
3、1秒中50次到100次不等,不能用线程操作
各位,这样能优化吗?怎么优化
...全文
260 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2020-04-23
  • 打赏
  • 举报
回复
字符串拼接用stringbuilder
类型转换用表达式树动态编译
wanghui0380 2020-04-23
  • 打赏
  • 举报
回复
对,这就可以二进制写,也可以二进制读了 T type--------对应数据结构,那要的基础类型数据都在,当然这里他展示的是复合类型。所以他这个type给的是复合类型,告诉你他是由多个基础类型复合而成的结构,so,你要做好呕吐的心理准备,下面要进行让人郁闷的循环嵌套解析工作了 L----------------长度,拿到这长度。就可以读到这个里面的数据 然后就郁闷了 继续,循环递归解析,他这个嵌套内容
wanghui0380 2020-04-23
  • 打赏
  • 举报
回复
做过几次snmp的协议解析,直接做吐了。 那个asn.1的BER编码就是你的想法,那编码太要命了,基本形状是这样子。一层一层的长度,类型,值的三元描述,都是byte[]哦,而且还可以嵌套,要人命啊
秋的红果实 2020-04-23
  • 打赏
  • 举报
回复
你是不是要涉及到序列化 类型转化效率,决定于C#本身,组装string可以用builderstring 50个类型,应该还有自定义类型吧,不只是基本类型,lz什么需求,会用到这么多类型?
wanghui0380 2020-04-23
  • 打赏
  • 举报
回复
实在想自己写一行 仿照linux标准包文件,tar格式 结构1:长度,时间戳,数据对应type 结构体2 数据内容(结构体的byte[]) 结构1:长度,时间戳,数据对应type 结构体2 数据内容(结构体的byte[]) 预读取结构体描述,使用描述得到长度和对应type,拿到长度,获取长度,根据type --------------------- 额写到这里我突然不想写,这不就是那个让人无语的SNMP协议么 ------------------------------------------------------------------- 好吧既然是这样,还要啥snmp协议啊,你直接用protocolbuf协议就好,protocolbuf序列二进制,这没有tostring了把,而且能转换标准类型了把,能加入复合类型把
  • 打赏
  • 举报
回复
引用 7 楼 wanghui0380 的回复:
[quote=引用 6 楼 舌尖上的中国001 的回复:] [quote=引用 2 楼 wanghui0380 的回复:] 随便写了个例子,有段时间没用那东西。有个输出头控制忘了在那里设置了,每次输出把头给带上了 你就将就着看,另外我倒是用了线程,不用线程我不好模拟你那个定时。
var rnd = new Random();

            // Create data frame with properties as column names

            FileInfo fileinfo = new FileInfo("test.csv");
            if (!fileinfo.Exists)
            {
                fileinfo.Create(); //第一次进入建立文件会占用,我懒得处理,你运行第2遍看
            }

            Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    using (StreamWriter sw = fileinfo.AppendText())
                    {

                        var objects = Enumerable.Range(0, 10).Select(i =>
                            new { time = DateTime.Now, Key = "ID_" + i.ToString(), Number = rnd.Next() });
                        var dfObjects = Frame.FromRecords(objects);
                        dfObjects.SaveCsv(sw,includeRowKeys:false, separator: ',');
                    }

                    await Task.Delay(200);
                }


            });
这个有提升吗?我看还是拼接字符串,类型转化成ToString()[/quote] 这有些无厘头了,你要cvs,还要,号分割。然后不要tostring。就算版主说stringBuilder,最后不也得tostring so,你要的不是cvs,我还告诉你,你要的是啥。你要的是 struct字节。那就别纠结了cvs了。换用基于索引和hashtree的BerkeleyDB直接放结构体的byte[][/quote]这么一说我就明白了,谢谢大佬解答
wanghui0380 2020-04-23
  • 打赏
  • 举报
回复
引用 6 楼 舌尖上的中国001 的回复:
[quote=引用 2 楼 wanghui0380 的回复:] 随便写了个例子,有段时间没用那东西。有个输出头控制忘了在那里设置了,每次输出把头给带上了 你就将就着看,另外我倒是用了线程,不用线程我不好模拟你那个定时。
var rnd = new Random();

            // Create data frame with properties as column names

            FileInfo fileinfo = new FileInfo("test.csv");
            if (!fileinfo.Exists)
            {
                fileinfo.Create(); //第一次进入建立文件会占用,我懒得处理,你运行第2遍看
            }

            Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    using (StreamWriter sw = fileinfo.AppendText())
                    {

                        var objects = Enumerable.Range(0, 10).Select(i =>
                            new { time = DateTime.Now, Key = "ID_" + i.ToString(), Number = rnd.Next() });
                        var dfObjects = Frame.FromRecords(objects);
                        dfObjects.SaveCsv(sw,includeRowKeys:false, separator: ',');
                    }

                    await Task.Delay(200);
                }


            });
这个有提升吗?我看还是拼接字符串,类型转化成ToString()[/quote] 这有些无厘头了,你要cvs,还要,号分割。然后不要tostring。就算版主说stringBuilder,最后不也得tostring so,你要的不是cvs,我还告诉你,你要的是啥。你要的是 struct字节。那就别纠结了cvs了。换用基于索引和hashtree的BerkeleyDB直接放结构体的byte[]
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
随便写了个例子,有段时间没用那东西。有个输出头控制忘了在那里设置了,每次输出把头给带上了 你就将就着看,另外我倒是用了线程,不用线程我不好模拟你那个定时。
var rnd = new Random();

            // Create data frame with properties as column names

            FileInfo fileinfo = new FileInfo("test.csv");
            if (!fileinfo.Exists)
            {
                fileinfo.Create(); //第一次进入建立文件会占用,我懒得处理,你运行第2遍看
            }

            Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    using (StreamWriter sw = fileinfo.AppendText())
                    {

                        var objects = Enumerable.Range(0, 10).Select(i =>
                            new { time = DateTime.Now, Key = "ID_" + i.ToString(), Number = rnd.Next() });
                        var dfObjects = Frame.FromRecords(objects);
                        dfObjects.SaveCsv(sw,includeRowKeys:false, separator: ',');
                    }

                    await Task.Delay(200);
                }


            });
这个有提升吗?我看还是拼接字符串,类型转化成ToString()
  • 打赏
  • 举报
回复
引用 4 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
字符串拼接用stringbuilder 类型转换用表达式树动态编译
表达式树动态编译....没用过,方便举个例子或者给个链接吗?
  • 打赏
  • 举报
回复
使用StringBuilder后,还有8KB左右的GC。都是vector3.vector2向量转换成string有4KB多的GC。因为csv文件是都好分割。我还要将(1,2,3)表示3维向量的字符串中的都好替换,使用Replace()。会产生1KB多的GC。
  • 打赏
  • 举报
回复
引用 10 楼 秋的红果实 的回复:
你是不是要涉及到序列化 类型转化效率,决定于C#本身,组装string可以用builderstring 50个类型,应该还有自定义类型吧,不只是基本类型,lz什么需求,会用到这么多类型?
有向量,其他基本都是内置的。大概有重复的类型,但是没有string,一次循环就要转化50次。可能我表达不是太清晰
  • 打赏
  • 举报
回复
引用 9 楼 wanghui0380 的回复:
实在想自己写一行 仿照linux标准包文件,tar格式 结构1:长度,时间戳,数据对应type 结构体2 数据内容(结构体的byte[]) 结构1:长度,时间戳,数据对应type 结构体2 数据内容(结构体的byte[]) 预读取结构体描述,使用描述得到长度和对应type,拿到长度,获取长度,根据type --------------------- 额写到这里我突然不想写,这不就是那个让人无语的SNMP协议么 ------------------------------------------------------------------- 好吧既然是这样,还要啥snmp协议啊,你直接用protocolbuf协议就好,protocolbuf序列二进制,这没有tostring了把,而且能转换标准类型了把,能加入复合类型把
我也想用ProtocolBuf,客户哪边不方便看。所以考虑的csv.它直接用excel看就行
jhonsonzhang 2020-04-23
  • 打赏
  • 举报
回复
应该是可以优化速度的。定义基础类,把文件类型作为属性。定义操作的解析类,根据类型对文本进行解析和转换。重点是使用linq lamada语句,效率会大幅提升。
wanghui0380 2020-04-22
  • 打赏
  • 举报
回复
当然根据这种方式,我们自己仿照一个简单对付着用的其实也行。反射取属性和value(默认枚举没控枚举旗标,自己想控自己设置),采用默认格式化(这个我就不想废啥脑筋了,顶多你加入CultureInfo格式参数在外面控制)
   Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    using (StreamWriter sw = fileinfo.AppendText())
                    {


                        var date = new { Key = "ID_" + DateTime.Now, Number = rnd.Next() };


                        sw.WriteLine(date.markcvsstr(','));


                    }

                    await Task.Delay(200);
                }


            });


  public static class MyClass
    {
        public static string markcvsstr(this object obj, char sp)
        {
            return string.Join(sp.ToString(),properys(obj));

            IEnumerable<object> properys(object obj1)
            {
                foreach (var propertyInfo in obj.GetType().GetProperties())
                {
                    yield return propertyInfo.GetValue(obj1);
                }
            }
        }
    }
wanghui0380 2020-04-22
  • 打赏
  • 举报
回复
随便写了个例子,有段时间没用那东西。有个输出头控制忘了在那里设置了,每次输出把头给带上了 你就将就着看,另外我倒是用了线程,不用线程我不好模拟你那个定时。
var rnd = new Random();

            // Create data frame with properties as column names

            FileInfo fileinfo = new FileInfo("test.csv");
            if (!fileinfo.Exists)
            {
                fileinfo.Create(); //第一次进入建立文件会占用,我懒得处理,你运行第2遍看
            }

            Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    using (StreamWriter sw = fileinfo.AppendText())
                    {

                        var objects = Enumerable.Range(0, 10).Select(i =>
                            new { time = DateTime.Now, Key = "ID_" + i.ToString(), Number = rnd.Next() });
                        var dfObjects = Frame.FromRecords(objects);
                        dfObjects.SaveCsv(sw,includeRowKeys:false, separator: ',');
                    }

                    await Task.Delay(200);
                }


            });
wanghui0380 2020-04-22
  • 打赏
  • 举报
回复
没有啥好办法,只能说有使用上相对简单的工具 Deedle https://fslab.org/Deedle/ 这个是因为去年有段时间,需要帮助python的去预处理大量基础数据,所以找个这专门操作csv的库(虽然python貌似很牛,但是性能太低,那些基础数据预处理,俺们不帮忙,他们自己折腾,单机要跑几天的,俺们跑的话,单机17小时跑完)

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧