如何用最高效的方法,从一组以"\\"为分隔符的string中提取字符串

Richardicy 2015-03-02 02:45:12
小弟最近做性能优化,其中有一个需求是这样的
目标string如下
string data = "abcde\\earda\\ppp\\xxxxx"
这个需求是这样的,就是把形如这样的字符串,插入到一个
Dictionary里面去
protected Dictionary<int, string> _values
之前的写法是这样的:

char[] sep = new char[] { '\\' };
values = data.Split(sep);
for (int i = 0; i < values.Length; ++i)
{
_values.Add(i, value);
}

现在测试下来用这种方法去做data.split的方式性能比较差,请教有没有什么可以提升性能的方法。
...全文
363 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-03-03
  • 打赏
  • 举报
回复
引用 12 楼 Richardicy 的回复:
比如如果我socket接收的速率平均可以达到200m byte /s,但是我应用本身的处理能力只有70m /s,那这里就是一个比较严重的瓶颈
你应该先把接收到的内容放到内存里,开另一个线程去处理,而不是把通信和处理数据都放到一个过程中
Richardicy 2015-03-02
  • 打赏
  • 举报
回复
比如如果我socket接收的速率平均可以达到200m byte /s,但是我应用本身的处理能力只有70m /s,那这里就是一个比较严重的瓶颈
Richardicy 2015-03-02
  • 打赏
  • 举报
回复
是这样的,由于之前的需求,要求我们在做这个应用的处理带宽能够达到我们网络下载速率的极限值 200m byte/s,从而让这个应用可以不成为整个系统的瓶颈,但是我现在再怎么优化,处理带宽只有69m/s,远远达不到这个200m/s的极限值。而现在从代码层面来看这个应用可能已经达到极限了。
於黾 2015-03-02
  • 打赏
  • 举报
回复
字符串处理本来就要比数字处理要慢的多 即使你不用Split,要从一个字符串提取字符,免不了要多次对字符串进行遍历(虽然你没有显式的使用for循环,但是内部一定会多次用到,反而使用Split循环次数还要少一些,可能只遍历2次就提取出了全部的字符)
  • 打赏
  • 举报
回复
做性能优化,应该把精力放在逻辑流程设计的重构上。对具体的“语句问题”,只占很少一点点闲暇时间。
  • 打赏
  • 举报
回复
引用 5 楼 Richardicy 的回复:
我这里表述不太好,其实是因为我用profiler工具测试时,这里是一个性能热点,如果可以改善的话那可以极大的改善性能。
profile的“性能热点”根本就是一个可以胡乱解释的指标。比如说你去坐公交车,车总是不来,于是车站上进进出出的人越来越多,你能说人才是性能热点? 看不懂profile最好就不用它,而是自己写测试程序来分析。因为你自己哪怕是写出4、5行代码的时候,你也是动脑筋去分析了。而避免纠结于“profile如此这么说的”这类因为净信工具而忘记了自己分析自己的程序整体流程的现象。
於黾 2015-03-02
  • 打赏
  • 举报
回复
引用 5 楼 Richardicy 的回复:
我这里表述不太好,其实是因为我用profiler工具测试时,这里是一个性能热点,如果可以改善的话那可以极大的改善性能。
那是因为Split函数里封装了循环,IndexOf和SubString,那么它跟后面循环里的其中某一次Add比起来,当然是慢的多了 而如果你做整体测试,Split可能也并不比后面的整个For循环慢多少 热点是相对的,可能你代码里其他地方用时太短,导致你认为这里还可以优化 其实并不是耗时最长的地方就是一定是需要优化的地方 比如你做TCP通信,那么最为耗时的部分恰恰是发送完毕等待接收对方回应的时候,你要优化这里,那就是要优化网络环境,优化对方设备处理字节,优化对方设备通信等待...这都是不切实际的
p523399 2015-03-02
  • 打赏
  • 举报
回复
热点是相对的,因为不可能每一行代码的性能都完全一致。
Richardicy 2015-03-02
  • 打赏
  • 举报
回复
我这里表述不太好,其实是因为我用profiler工具测试时,这里是一个性能热点,如果可以改善的话那可以极大的改善性能。
SPFarmer 2015-03-02
  • 打赏
  • 举报
回复
不知道楼主做测试的时候,用了多大的string,已经做了多少次循环,一共花费了多少时间? 理论上来讲,split的性能不差的,而且你的代码已经很简明了,改善的空间不大。
於黾 2015-03-02
  • 打赏
  • 举报
回复
如果不用Split 就只能循环 先IndexOf 再SubString 我不觉得这效率会比Split更高
杨友山 2015-03-02
  • 打赏
  • 举报
回复
那再看看是split,还是循环哪个步骤性能差。 截取一般都会这么用,坐等高手看看吧。
於黾 2015-03-02
  • 打赏
  • 举报
回复
Split性能差?何出此言?

110,499

社区成员

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

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

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