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 ...
随机推荐
- SQL Join 的三种类型
1.Hash Match Join Hash运算(即散列算法) 和Hash表. Hash运算是一种编程技术,用来把数据转换为符号形式,使数据可以更容易更快速地被检索.例如,表中的一行数据,可以通过程序 ...
- ASP.NET全局文件与防盗链
添加Web→全局应用程序类,注 文件名不要改 Global.asax 全局文件是对Web应用声明周期的一个事件响应的地方,将Web应用启动时初始化的一些代码写到 Application_Start中, ...
- Makefile隐含规则和用到的默认变量
如果要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则.那么,make会试图去自动推导产生这个目标的规则和命令,如果make可以自动推导生成这个目标的规则和命令,那么这个行为就是隐 ...
- Nginx 第三方模块-漫谈缘起
http://www.cnblogs.com/yjf512/archive/2012/03/30/2424726.html http://chenxiaoyu.org/2011/10/30/nginx ...
- CentOS 6.4 64位 安装 jdk 6u45
准备: 1.下载历史版本jdk 地址: http://java.sun.com/products/archive/ 下载的版本 jdk-6u45-linux-x64-rpm.bin Linux x6 ...
- Lambda Expression In Java
题记在阅读JDK源码java.util.Collections的时候在UnmodifiableCollection类中看到了这么一段代码: public void forEach(Consumer& ...
- javascript 笔记(1)
document.forms[0].names.value == '' forms[0]表示文档的第一个 form 表单,names 表示这个表单元素名为 names 的表单的元素,此时表示的是获取此 ...
- JavaScript语言用10张图
JavaScript 语言基础知识点总结,用图片树形结构说明.包括Windows对象.JavaScriptDOM基本操作.JavaScript变量.JavaScript数据类型.JavaScript运 ...
- 移动web问题小结
Meta标签: <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalab ...
- 使用Fiddler提高前端工作效率 (实例篇)
上篇中,我们对Fiddler Web Debugger有了简单的接触,也许你已经开始在用Fiddler进行HTTP相关的调试,在这一篇,我们将通过一个实例了解Fiddler的神奇魔法. 在我们前端开发 ...