replace empty char with new string,unsafe method和native implementation的性能比较
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string s = File.ReadAllText(@"e:\test.txt");
6: Program p = new Program();
7: string r6 = p.Replace_1(s, ' ', 'a');
8: string r7 = p.Replace_2(s, " ", "a");
9: string r1=p.ReplaceEmptyChar_1(s, "a");
10: string r2 = p.ReplaceEmptyChar_2(s, "a");
11: string r3 = p.ReplaceEmptyChar_3(s, "a");
12: string r4 = p.ReplaceEmptyChar_4(s, "a");
13: string r5 = p.ReplaceEmptyChar_5(s, 'a');
14: string r8 = p.ReplaceEmptyChar_6(s, 'a');
15: Console.WriteLine(string.Equals(r5, r7));
16: }
17:
18: /// <summary>
19: /// replace empty char with new string
20: /// </summary>
21: /// <param name="s">string to be dealed</param>
22: /// <param name="to_be_replaced">replace with this string</param>
23: /// <returns>new string</returns>
24: public string ReplaceEmptyChar_1(string s,string to_be_replaced)
25: {
26: if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(to_be_replaced) || to_be_replaced==" ")
27: {
28: return s;
29: }
30:
31: char[] charArray = s.ToCharArray();
32: char[] replaceArray = to_be_replaced.ToCharArray();
33: int replaced_length=to_be_replaced.Length;
34: //get the empty count
35: int emptyCount = 0;
36: for (int i=0;i<charArray.Length;i++)
37: {
38: if (charArray[i] == ' ')
39: {
40: emptyCount++;
41: if (replaced_length==1)
42: {
43: charArray[i] = replaceArray[0];
44: }
45: }
46: }
47:
48:
49: if (emptyCount == 0)
50: {
51: return s;
52: }
53:
54: //no need to resize array and return the new string directly
55: if (replaced_length == 1)
56: {
57: return new string(charArray);
58: }
59:
60: int newSeats = (replaced_length - 1) * emptyCount;
61: int oldSize = charArray.Length;
62: int newSize=oldSize+newSeats;
63: Array.Resize<char>(ref charArray, newSize);
64: for (int i = oldSize - 1; i >= 0; i--)
65: {
66: if (charArray[i] == ' ')
67: {
68: for (int j = 0; j < replaced_length; j++)
69: {
70: charArray[newSize - j - 1] = to_be_replaced[replaced_length - j - 1];
71: }
72: newSize -=replaced_length ;
73: }
74: else
75: {
76: charArray[newSize - 1] = charArray[i];
77: newSize--;
78: }
79: }
80:
81: return new string(charArray);
82: }
83:
84: /// <summary>
85: /// use string builder
86: /// </summary>
87: public string ReplaceEmptyChar_2(string s, string to_be_replaced)
88: {
89: StringBuilder sb=new StringBuilder();
90: foreach(char c in s)
91: {
92: if (c == ' ')
93: {
94: sb.Append(to_be_replaced);
95: }
96: else
97: {
98: sb.Append(c);
99: }
100: }
101: return sb.ToString();
102: }
103:
104: /// <summary>
105: /// use string builder
106: /// </summary>
107: public string ReplaceEmptyChar_3(string s, string to_be_replaced)
108: {
109: StringBuilder sb = new StringBuilder(s.Length*2);
110: foreach (char c in s)
111: {
112: if (c == ' ')
113: {
114: sb.Append(to_be_replaced);
115: }
116: else
117: {
118: sb.Append(c);
119: }
120: }
121: return sb.ToString();
122: }
123:
124: /// <summary>
125: /// use list
126: /// </summary>
127: public string ReplaceEmptyChar_4(string s, string to_be_replaced)
128: {
129: List<char> list = new List<char>(s.Length * 2);
130: foreach (char c in s)
131: {
132: if (c == ' ')
133: {
134: foreach (char c2 in to_be_replaced)
135: {
136: list.Add(c2);
137: }
138: }
139: else
140: {
141: list.Add(c);
142: }
143: }
144: return new string(list.ToArray());
145: }
146:
147: /// <summary>
148: /// unsafe pointer
149: /// </summary>
150: public unsafe string ReplaceEmptyChar_5(string s, char to_be_replaced)
151: {
152: int emptyCount = 0;
153: fixed (char* c = s)
154: {
155: char* cp = c;
156: for (int i = 0; i < s.Length; i++)
157: {
158: if (*cp == ' ')
159: {
160: *cp = to_be_replaced;
161: }
162: cp++;
163: }
164:
165: if (emptyCount == 0)
166: {
167: return s;
168: }
169: return new string(c);
170: }
171:
172: }
173:
174: public string ReplaceEmptyChar_6(string s, char to_be_replaced)
175: {
176: char[] charArray = s.ToCharArray();
177:
178: for (int i = 0; i < charArray.Length; i++)
179: {
180: if (charArray[i] == ' ')
181: {
182: charArray[i] = to_be_replaced;
183: }
184: }
185: return new string(charArray);
186: }
187:
188: /// <summary>
189: /// use string.Replace
190: /// </summary>
191: public string Replace_2(string s, string old, string to_be_replaced)
192: {
193: return s.Replace(old, to_be_replaced);
194: }
195:
196: /// <summary>
197: /// use string.Replace
198: /// </summary>
199: public string Replace_1(string s, char old, char to_be_replaced)
200: {
201: return s.Replace(old, to_be_replaced);
202: }
203:
204: /****
205: 用指定字符串替换空白字符的三个实现比较,发现还是框架自带方法Replace快很多
206: Reflector一下发现Replace实现在COMString.cpp中,native的优势~~~~~
207: 为了更深刻反映native的优势,通过ReplaceEmptyChar_5实现一个unsafe的方法,其中用到指针
208: 该方法只简单做字符替换,而Replace也有一个字符替换的重载,同时实现一个managed版本的字符替换方法ReplaceEmptyChar_6
209: 实现结果标明使用了unsfae的指针之后,性能也有较大提升
210: ****/
211: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
replace empty char with new string,unsafe method和native implementation的性能比较的更多相关文章
- String.Join Method
Overloads Join(String, String[], Int32, Int32) Concatenates the specified elements of a string array ...
- char数组和String互转
char ch[100];string str; 把char*(c类型的string)数组转换为string:str = ch; //即可str.assign(ch); //也可 把string类型转 ...
- 对 static const char* const str[] = {“string”} 的理解
static const char* const str[] = {“string”} 静态常量型指针变量 static const char* 常量型变量 const str[] 这样修饰的作用为 ...
- delphi char数组、string和Pchar的相互转换
因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原 ...
- java字符数组char[]和字符串String之间的转换
java字符数组char[]和字符串String之间的转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用String.valueOf()将字符数组转换成字符串 void (){ cha ...
- vector(char*)和vector(string)
vector<char*> ch; vector<string> str; for(int i=0;i<5;i++) { char *c=fun1();//通过这个语句产 ...
- char数组与string转换
1.char数组转string 有很多种方法: 假设c字符串定义为char ch[]="hello world!"; 1.向构造函数传入c字符串创建string对象: string ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- Java String Split Method
Java String.split() method 有如下几种特殊情况: 1. 分隔符出现在首尾 public static void main(String args[]) { String St ...
随机推荐
- linux进程与端口查看命令
查看程序对应进程号:ps –ef|grep 进程名 查看进程号所占用的端口号:netstat –nltp|grep 进程号 使用lsof命令: lsof –i:端口号
- 九度OJ 1076 N的阶乘 -- 大数运算
题目地址:http://ac.jobdu.com/problem.php?pid=1076 题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: ...
- 配置php连接apache
配置php连接apache 1.安装php所需要的库 yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel li ...
- NetSerialComm的基本使用方法
近期搞一个com口传输的小项目,原来认为是一个挺简单的一个小功能,结果生产商发来com以后直接傻眼了,还要对相关的硬件流进行处理 如下 // 硬件流控制设置 dcb.fOutxCtsFlow = FA ...
- tr设置border无效的解决方法
给table的css添加属性:border-collapse: collapse; 边框不折叠的表格 行,列,行组是不具有border的
- MySQL在远程访问时非常慢的解决skip-name-resolve 并且出现 Reading from net
转载:http://www.itokit.com/2012/0515/73932.html 服务器放在局域网内进行测试时,数据库的访问速度还是很快.但当服务器放到外网后,数据库的访问速度就变得非常慢. ...
- TDirectory.GetParent获取指定目录的父目录
使用函数: System.IOUtils.TDirectory.GetParent class function GetParent(const Path: string): string; stat ...
- Python 学习笔记(1) - 开始
找一个能看的教程(不用太过于纠结以至于耗费大量时间,很可能还没开始就放弃了. -- 这条要作为新的做事准则放入我的日常了,警惕一开始就追求完美常常会什么也得不到.) 我喜欢看书不爱视频,所以找了这个: ...
- Python深入学习笔记(一)
写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...