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 ...
随机推荐
- C#中的Collections命名空间
System.Collections命名空间包含可使用的集合类和相关的接口. 该命名空间下的.NET非泛型集合类如下所示: — System.Collections.ArrayList:数组集合类,使 ...
- Swift语言 1小时速学教程
本文由 张渊杰 (网名寂静)编写 Swift语言 1小时速学教程 写在前面的话 有些人可能想, 呵呵, 1小时学一门语言, 你不是搞笑吧, 我想说, 是的, 完全可以, 就要看你怎么学了 要想在1小时 ...
- javascript获取url参数的方法
发布:thatboy 来源:Net [大 中 小] 本文介绍下,在javascript中取得url中某一个参数的方法,这里分享一个小例子,供大家学习参考下.本文转自:http://www. ...
- CI源码学习 一步一步重写 CodeIgniter 框架
文章:http://www.cnblogs.com/zhenyu-whu/archive/2013/08.html
- C#语言特性-运算符重载
一.C#当中可以进行重载和不可重载的运算符: 1.简单的说明: 1.从上图中可以看到,可以重载的和不可以进行重载的运算符,比较特殊的是第二行和倒数第三行,的运算符,为什么会说它们特殊,是因为(第三行) ...
- 【javascript 函数基础知识】
函数实际上是对象,每个函数都是 Function 类型的实例,而且都会与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. [概念标签] ...
- C#winform程序安装时自动卸载新版本覆盖旧版本
vs2005为winform程序做的安装包.在以有程序旧版本的机子上用新版本的安装包安装软件时提示 “以经安装该产品的另一个版本.无法继续安装此版本........” 在安装部署项目中设“Remov ...
- 成都OpenPart——DevOps专场活动参与感
今天下午去参加了成都OpenPart——DevOps专场,感觉很好. 题外话: 回想一下,工作将近四年了,这是第一次参加类似的活动.自从结婚带了小孩以后,就基本上每个周末奔波工作和家里两个城市之间,这 ...
- 记录一次配置unix网络编程环境的过程和遇到的问题
记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso 把目录下的文件复制到某一目录,修改权限,可命 ...
- python url解析
>>> url="http://localhost/test.py?a=hello&b=world " >>> result=urlpa ...